]> CyberLeo.Net >> Repos - FreeBSD/FreeBSD.git/blob - sys/crypto/openssl/arm/armv4-mont.S
Use a template assembly file to generate the embedded MFS.
[FreeBSD/FreeBSD.git] / sys / crypto / openssl / arm / armv4-mont.S
1 /* $FreeBSD$ */
2 /* Do not modify. This file is auto-generated from armv4-mont.pl. */
3 #include "arm_arch.h"
4
5 .text
6 #if defined(__thumb2__)
7 .syntax unified
8 .thumb
9 #else
10 .code   32
11 #endif
12
13 #if __ARM_MAX_ARCH__>=7
14 .align  5
15 .LOPENSSL_armcap:
16 .word   OPENSSL_armcap_P-.Lbn_mul_mont
17 #endif
18
19 .globl  bn_mul_mont
20 .type   bn_mul_mont,%function
21
22 .align  5
23 bn_mul_mont:
24 .Lbn_mul_mont:
25         ldr     ip,[sp,#4]              @ load num
26         stmdb   sp!,{r0,r2}             @ sp points at argument block
27 #if __ARM_MAX_ARCH__>=7
28         tst     ip,#7
29         bne     .Lialu
30         adr     r0,.Lbn_mul_mont
31         ldr     r2,.LOPENSSL_armcap
32         ldr     r0,[r0,r2]
33 #ifdef  __APPLE__
34         ldr     r0,[r0]
35 #endif
36         tst     r0,#ARMV7_NEON          @ NEON available?
37         ldmia   sp, {r0,r2}
38         beq     .Lialu
39         add     sp,sp,#8
40         b       bn_mul8x_mont_neon
41 .align  4
42 .Lialu:
43 #endif
44         cmp     ip,#2
45         mov     r0,ip                   @ load num
46 #ifdef  __thumb2__
47         ittt    lt
48 #endif
49         movlt   r0,#0
50         addlt   sp,sp,#2*4
51         blt     .Labrt
52
53         stmdb   sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}          @ save 10 registers
54
55         mov     r0,r0,lsl#2             @ rescale r0 for byte count
56         sub     sp,sp,r0                @ alloca(4*num)
57         sub     sp,sp,#4                @ +extra dword
58         sub     r0,r0,#4                @ "num=num-1"
59         add     r4,r2,r0                @ &bp[num-1]
60
61         add     r0,sp,r0                @ r0 to point at &tp[num-1]
62         ldr     r8,[r0,#14*4]           @ &n0
63         ldr     r2,[r2]         @ bp[0]
64         ldr     r5,[r1],#4              @ ap[0],ap++
65         ldr     r6,[r3],#4              @ np[0],np++
66         ldr     r8,[r8]         @ *n0
67         str     r4,[r0,#15*4]           @ save &bp[num]
68
69         umull   r10,r11,r5,r2   @ ap[0]*bp[0]
70         str     r8,[r0,#14*4]           @ save n0 value
71         mul     r8,r10,r8               @ "tp[0]"*n0
72         mov     r12,#0
73         umlal   r10,r12,r6,r8   @ np[0]*n0+"t[0]"
74         mov     r4,sp
75
76 .L1st:
77         ldr     r5,[r1],#4              @ ap[j],ap++
78         mov     r10,r11
79         ldr     r6,[r3],#4              @ np[j],np++
80         mov     r11,#0
81         umlal   r10,r11,r5,r2   @ ap[j]*bp[0]
82         mov     r14,#0
83         umlal   r12,r14,r6,r8   @ np[j]*n0
84         adds    r12,r12,r10
85         str     r12,[r4],#4             @ tp[j-1]=,tp++
86         adc     r12,r14,#0
87         cmp     r4,r0
88         bne     .L1st
89
90         adds    r12,r12,r11
91         ldr     r4,[r0,#13*4]           @ restore bp
92         mov     r14,#0
93         ldr     r8,[r0,#14*4]           @ restore n0
94         adc     r14,r14,#0
95         str     r12,[r0]                @ tp[num-1]=
96         mov     r7,sp
97         str     r14,[r0,#4]             @ tp[num]=
98
99 .Louter:
100         sub     r7,r0,r7                @ "original" r0-1 value
101         sub     r1,r1,r7                @ "rewind" ap to &ap[1]
102         ldr     r2,[r4,#4]!             @ *(++bp)
103         sub     r3,r3,r7                @ "rewind" np to &np[1]
104         ldr     r5,[r1,#-4]             @ ap[0]
105         ldr     r10,[sp]                @ tp[0]
106         ldr     r6,[r3,#-4]             @ np[0]
107         ldr     r7,[sp,#4]              @ tp[1]
108
109         mov     r11,#0
110         umlal   r10,r11,r5,r2   @ ap[0]*bp[i]+tp[0]
111         str     r4,[r0,#13*4]           @ save bp
112         mul     r8,r10,r8
113         mov     r12,#0
114         umlal   r10,r12,r6,r8   @ np[0]*n0+"tp[0]"
115         mov     r4,sp
116
117 .Linner:
118         ldr     r5,[r1],#4              @ ap[j],ap++
119         adds    r10,r11,r7              @ +=tp[j]
120         ldr     r6,[r3],#4              @ np[j],np++
121         mov     r11,#0
122         umlal   r10,r11,r5,r2   @ ap[j]*bp[i]
123         mov     r14,#0
124         umlal   r12,r14,r6,r8   @ np[j]*n0
125         adc     r11,r11,#0
126         ldr     r7,[r4,#8]              @ tp[j+1]
127         adds    r12,r12,r10
128         str     r12,[r4],#4             @ tp[j-1]=,tp++
129         adc     r12,r14,#0
130         cmp     r4,r0
131         bne     .Linner
132
133         adds    r12,r12,r11
134         mov     r14,#0
135         ldr     r4,[r0,#13*4]           @ restore bp
136         adc     r14,r14,#0
137         ldr     r8,[r0,#14*4]           @ restore n0
138         adds    r12,r12,r7
139         ldr     r7,[r0,#15*4]           @ restore &bp[num]
140         adc     r14,r14,#0
141         str     r12,[r0]                @ tp[num-1]=
142         str     r14,[r0,#4]             @ tp[num]=
143
144         cmp     r4,r7
145 #ifdef  __thumb2__
146         itt     ne
147 #endif
148         movne   r7,sp
149         bne     .Louter
150
151         ldr     r2,[r0,#12*4]           @ pull rp
152         mov     r5,sp
153         add     r0,r0,#4                @ r0 to point at &tp[num]
154         sub     r5,r0,r5                @ "original" num value
155         mov     r4,sp                   @ "rewind" r4
156         mov     r1,r4                   @ "borrow" r1
157         sub     r3,r3,r5                @ "rewind" r3 to &np[0]
158
159         subs    r7,r7,r7                @ "clear" carry flag
160 .Lsub:  ldr     r7,[r4],#4
161         ldr     r6,[r3],#4
162         sbcs    r7,r7,r6                @ tp[j]-np[j]
163         str     r7,[r2],#4              @ rp[j]=
164         teq     r4,r0           @ preserve carry
165         bne     .Lsub
166         sbcs    r14,r14,#0              @ upmost carry
167         mov     r4,sp                   @ "rewind" r4
168         sub     r2,r2,r5                @ "rewind" r2
169
170 .Lcopy: ldr     r7,[r4]         @ conditional copy
171         ldr     r5,[r2]
172         str     sp,[r4],#4              @ zap tp
173 #ifdef  __thumb2__
174         it      cc
175 #endif
176         movcc   r5,r7
177         str     r5,[r2],#4
178         teq     r4,r0           @ preserve carry
179         bne     .Lcopy
180
181         mov     sp,r0
182         add     sp,sp,#4                @ skip over tp[num+1]
183         ldmia   sp!,{r4,r5,r6,r7,r8,r9,r10,r11,r12,lr}          @ restore registers
184         add     sp,sp,#2*4              @ skip over {r0,r2}
185         mov     r0,#1
186 .Labrt:
187 #if __ARM_ARCH__>=5
188         bx      lr                              @ bx lr
189 #else
190         tst     lr,#1
191         moveq   pc,lr                   @ be binary compatible with V4, yet
192 .word   0xe12fff1e                      @ interoperable with Thumb ISA:-)
193 #endif
194 .size   bn_mul_mont,.-bn_mul_mont
195 #if __ARM_MAX_ARCH__>=7
196 .arch   armv7-a
197 .fpu    neon
198
199 .type   bn_mul8x_mont_neon,%function
200 .align  5
201 bn_mul8x_mont_neon:
202         mov     ip,sp
203         stmdb   sp!,{r4,r5,r6,r7,r8,r9,r10,r11}
204         vstmdb  sp!,{d8,d9,d10,d11,d12,d13,d14,d15}             @ ABI specification says so
205         ldmia   ip,{r4,r5}              @ load rest of parameter block
206         mov     ip,sp
207
208         cmp     r5,#8
209         bhi     .LNEON_8n
210
211         @ special case for r5==8, everything is in register bank...
212
213         vld1.32 {d28[0]}, [r2,:32]!
214         veor    d8,d8,d8
215         sub     r7,sp,r5,lsl#4
216         vld1.32 {d0,d1,d2,d3},  [r1]!           @ can't specify :32 :-(
217         and     r7,r7,#-64
218         vld1.32 {d30[0]}, [r4,:32]
219         mov     sp,r7                   @ alloca
220         vzip.16 d28,d8
221
222         vmull.u32       q6,d28,d0[0]
223         vmull.u32       q7,d28,d0[1]
224         vmull.u32       q8,d28,d1[0]
225         vshl.i64        d29,d13,#16
226         vmull.u32       q9,d28,d1[1]
227
228         vadd.u64        d29,d29,d12
229         veor    d8,d8,d8
230         vmul.u32        d29,d29,d30
231
232         vmull.u32       q10,d28,d2[0]
233         vld1.32 {d4,d5,d6,d7}, [r3]!
234         vmull.u32       q11,d28,d2[1]
235         vmull.u32       q12,d28,d3[0]
236         vzip.16 d29,d8
237         vmull.u32       q13,d28,d3[1]
238
239         vmlal.u32       q6,d29,d4[0]
240         sub     r9,r5,#1
241         vmlal.u32       q7,d29,d4[1]
242         vmlal.u32       q8,d29,d5[0]
243         vmlal.u32       q9,d29,d5[1]
244
245         vmlal.u32       q10,d29,d6[0]
246         vmov    q5,q6
247         vmlal.u32       q11,d29,d6[1]
248         vmov    q6,q7
249         vmlal.u32       q12,d29,d7[0]
250         vmov    q7,q8
251         vmlal.u32       q13,d29,d7[1]
252         vmov    q8,q9
253         vmov    q9,q10
254         vshr.u64        d10,d10,#16
255         vmov    q10,q11
256         vmov    q11,q12
257         vadd.u64        d10,d10,d11
258         vmov    q12,q13
259         veor    q13,q13
260         vshr.u64        d10,d10,#16
261
262         b       .LNEON_outer8
263
264 .align  4
265 .LNEON_outer8:
266         vld1.32 {d28[0]}, [r2,:32]!
267         veor    d8,d8,d8
268         vzip.16 d28,d8
269         vadd.u64        d12,d12,d10
270
271         vmlal.u32       q6,d28,d0[0]
272         vmlal.u32       q7,d28,d0[1]
273         vmlal.u32       q8,d28,d1[0]
274         vshl.i64        d29,d13,#16
275         vmlal.u32       q9,d28,d1[1]
276
277         vadd.u64        d29,d29,d12
278         veor    d8,d8,d8
279         subs    r9,r9,#1
280         vmul.u32        d29,d29,d30
281
282         vmlal.u32       q10,d28,d2[0]
283         vmlal.u32       q11,d28,d2[1]
284         vmlal.u32       q12,d28,d3[0]
285         vzip.16 d29,d8
286         vmlal.u32       q13,d28,d3[1]
287
288         vmlal.u32       q6,d29,d4[0]
289         vmlal.u32       q7,d29,d4[1]
290         vmlal.u32       q8,d29,d5[0]
291         vmlal.u32       q9,d29,d5[1]
292
293         vmlal.u32       q10,d29,d6[0]
294         vmov    q5,q6
295         vmlal.u32       q11,d29,d6[1]
296         vmov    q6,q7
297         vmlal.u32       q12,d29,d7[0]
298         vmov    q7,q8
299         vmlal.u32       q13,d29,d7[1]
300         vmov    q8,q9
301         vmov    q9,q10
302         vshr.u64        d10,d10,#16
303         vmov    q10,q11
304         vmov    q11,q12
305         vadd.u64        d10,d10,d11
306         vmov    q12,q13
307         veor    q13,q13
308         vshr.u64        d10,d10,#16
309
310         bne     .LNEON_outer8
311
312         vadd.u64        d12,d12,d10
313         mov     r7,sp
314         vshr.u64        d10,d12,#16
315         mov     r8,r5
316         vadd.u64        d13,d13,d10
317         add     r6,sp,#96
318         vshr.u64        d10,d13,#16
319         vzip.16 d12,d13
320
321         b       .LNEON_tail_entry
322
323 .align  4
324 .LNEON_8n:
325         veor    q6,q6,q6
326         sub     r7,sp,#128
327         veor    q7,q7,q7
328         sub     r7,r7,r5,lsl#4
329         veor    q8,q8,q8
330         and     r7,r7,#-64
331         veor    q9,q9,q9
332         mov     sp,r7                   @ alloca
333         veor    q10,q10,q10
334         add     r7,r7,#256
335         veor    q11,q11,q11
336         sub     r8,r5,#8
337         veor    q12,q12,q12
338         veor    q13,q13,q13
339
340 .LNEON_8n_init:
341         vst1.64 {q6,q7},[r7,:256]!
342         subs    r8,r8,#8
343         vst1.64 {q8,q9},[r7,:256]!
344         vst1.64 {q10,q11},[r7,:256]!
345         vst1.64 {q12,q13},[r7,:256]!
346         bne     .LNEON_8n_init
347
348         add     r6,sp,#256
349         vld1.32 {d0,d1,d2,d3},[r1]!
350         add     r10,sp,#8
351         vld1.32 {d30[0]},[r4,:32]
352         mov     r9,r5
353         b       .LNEON_8n_outer
354
355 .align  4
356 .LNEON_8n_outer:
357         vld1.32 {d28[0]},[r2,:32]!      @ *b++
358         veor    d8,d8,d8
359         vzip.16 d28,d8
360         add     r7,sp,#128
361         vld1.32 {d4,d5,d6,d7},[r3]!
362
363         vmlal.u32       q6,d28,d0[0]
364         vmlal.u32       q7,d28,d0[1]
365         veor    d8,d8,d8
366         vmlal.u32       q8,d28,d1[0]
367         vshl.i64        d29,d13,#16
368         vmlal.u32       q9,d28,d1[1]
369         vadd.u64        d29,d29,d12
370         vmlal.u32       q10,d28,d2[0]
371         vmul.u32        d29,d29,d30
372         vmlal.u32       q11,d28,d2[1]
373         vst1.32 {d28},[sp,:64]          @ put aside smashed b[8*i+0]
374         vmlal.u32       q12,d28,d3[0]
375         vzip.16 d29,d8
376         vmlal.u32       q13,d28,d3[1]
377         vld1.32 {d28[0]},[r2,:32]!      @ *b++
378         vmlal.u32       q6,d29,d4[0]
379         veor    d10,d10,d10
380         vmlal.u32       q7,d29,d4[1]
381         vzip.16 d28,d10
382         vmlal.u32       q8,d29,d5[0]
383         vshr.u64        d12,d12,#16
384         vmlal.u32       q9,d29,d5[1]
385         vmlal.u32       q10,d29,d6[0]
386         vadd.u64        d12,d12,d13
387         vmlal.u32       q11,d29,d6[1]
388         vshr.u64        d12,d12,#16
389         vmlal.u32       q12,d29,d7[0]
390         vmlal.u32       q13,d29,d7[1]
391         vadd.u64        d14,d14,d12
392         vst1.32 {d29},[r10,:64]!        @ put aside smashed m[8*i+0]
393         vmlal.u32       q7,d28,d0[0]
394         vld1.64 {q6},[r6,:128]!
395         vmlal.u32       q8,d28,d0[1]
396         veor    d8,d8,d8
397         vmlal.u32       q9,d28,d1[0]
398         vshl.i64        d29,d15,#16
399         vmlal.u32       q10,d28,d1[1]
400         vadd.u64        d29,d29,d14
401         vmlal.u32       q11,d28,d2[0]
402         vmul.u32        d29,d29,d30
403         vmlal.u32       q12,d28,d2[1]
404         vst1.32 {d28},[r10,:64]!        @ put aside smashed b[8*i+1]
405         vmlal.u32       q13,d28,d3[0]
406         vzip.16 d29,d8
407         vmlal.u32       q6,d28,d3[1]
408         vld1.32 {d28[0]},[r2,:32]!      @ *b++
409         vmlal.u32       q7,d29,d4[0]
410         veor    d10,d10,d10
411         vmlal.u32       q8,d29,d4[1]
412         vzip.16 d28,d10
413         vmlal.u32       q9,d29,d5[0]
414         vshr.u64        d14,d14,#16
415         vmlal.u32       q10,d29,d5[1]
416         vmlal.u32       q11,d29,d6[0]
417         vadd.u64        d14,d14,d15
418         vmlal.u32       q12,d29,d6[1]
419         vshr.u64        d14,d14,#16
420         vmlal.u32       q13,d29,d7[0]
421         vmlal.u32       q6,d29,d7[1]
422         vadd.u64        d16,d16,d14
423         vst1.32 {d29},[r10,:64]!        @ put aside smashed m[8*i+1]
424         vmlal.u32       q8,d28,d0[0]
425         vld1.64 {q7},[r6,:128]!
426         vmlal.u32       q9,d28,d0[1]
427         veor    d8,d8,d8
428         vmlal.u32       q10,d28,d1[0]
429         vshl.i64        d29,d17,#16
430         vmlal.u32       q11,d28,d1[1]
431         vadd.u64        d29,d29,d16
432         vmlal.u32       q12,d28,d2[0]
433         vmul.u32        d29,d29,d30
434         vmlal.u32       q13,d28,d2[1]
435         vst1.32 {d28},[r10,:64]!        @ put aside smashed b[8*i+2]
436         vmlal.u32       q6,d28,d3[0]
437         vzip.16 d29,d8
438         vmlal.u32       q7,d28,d3[1]
439         vld1.32 {d28[0]},[r2,:32]!      @ *b++
440         vmlal.u32       q8,d29,d4[0]
441         veor    d10,d10,d10
442         vmlal.u32       q9,d29,d4[1]
443         vzip.16 d28,d10
444         vmlal.u32       q10,d29,d5[0]
445         vshr.u64        d16,d16,#16
446         vmlal.u32       q11,d29,d5[1]
447         vmlal.u32       q12,d29,d6[0]
448         vadd.u64        d16,d16,d17
449         vmlal.u32       q13,d29,d6[1]
450         vshr.u64        d16,d16,#16
451         vmlal.u32       q6,d29,d7[0]
452         vmlal.u32       q7,d29,d7[1]
453         vadd.u64        d18,d18,d16
454         vst1.32 {d29},[r10,:64]!        @ put aside smashed m[8*i+2]
455         vmlal.u32       q9,d28,d0[0]
456         vld1.64 {q8},[r6,:128]!
457         vmlal.u32       q10,d28,d0[1]
458         veor    d8,d8,d8
459         vmlal.u32       q11,d28,d1[0]
460         vshl.i64        d29,d19,#16
461         vmlal.u32       q12,d28,d1[1]
462         vadd.u64        d29,d29,d18
463         vmlal.u32       q13,d28,d2[0]
464         vmul.u32        d29,d29,d30
465         vmlal.u32       q6,d28,d2[1]
466         vst1.32 {d28},[r10,:64]!        @ put aside smashed b[8*i+3]
467         vmlal.u32       q7,d28,d3[0]
468         vzip.16 d29,d8
469         vmlal.u32       q8,d28,d3[1]
470         vld1.32 {d28[0]},[r2,:32]!      @ *b++
471         vmlal.u32       q9,d29,d4[0]
472         veor    d10,d10,d10
473         vmlal.u32       q10,d29,d4[1]
474         vzip.16 d28,d10
475         vmlal.u32       q11,d29,d5[0]
476         vshr.u64        d18,d18,#16
477         vmlal.u32       q12,d29,d5[1]
478         vmlal.u32       q13,d29,d6[0]
479         vadd.u64        d18,d18,d19
480         vmlal.u32       q6,d29,d6[1]
481         vshr.u64        d18,d18,#16
482         vmlal.u32       q7,d29,d7[0]
483         vmlal.u32       q8,d29,d7[1]
484         vadd.u64        d20,d20,d18
485         vst1.32 {d29},[r10,:64]!        @ put aside smashed m[8*i+3]
486         vmlal.u32       q10,d28,d0[0]
487         vld1.64 {q9},[r6,:128]!
488         vmlal.u32       q11,d28,d0[1]
489         veor    d8,d8,d8
490         vmlal.u32       q12,d28,d1[0]
491         vshl.i64        d29,d21,#16
492         vmlal.u32       q13,d28,d1[1]
493         vadd.u64        d29,d29,d20
494         vmlal.u32       q6,d28,d2[0]
495         vmul.u32        d29,d29,d30
496         vmlal.u32       q7,d28,d2[1]
497         vst1.32 {d28},[r10,:64]!        @ put aside smashed b[8*i+4]
498         vmlal.u32       q8,d28,d3[0]
499         vzip.16 d29,d8
500         vmlal.u32       q9,d28,d3[1]
501         vld1.32 {d28[0]},[r2,:32]!      @ *b++
502         vmlal.u32       q10,d29,d4[0]
503         veor    d10,d10,d10
504         vmlal.u32       q11,d29,d4[1]
505         vzip.16 d28,d10
506         vmlal.u32       q12,d29,d5[0]
507         vshr.u64        d20,d20,#16
508         vmlal.u32       q13,d29,d5[1]
509         vmlal.u32       q6,d29,d6[0]
510         vadd.u64        d20,d20,d21
511         vmlal.u32       q7,d29,d6[1]
512         vshr.u64        d20,d20,#16
513         vmlal.u32       q8,d29,d7[0]
514         vmlal.u32       q9,d29,d7[1]
515         vadd.u64        d22,d22,d20
516         vst1.32 {d29},[r10,:64]!        @ put aside smashed m[8*i+4]
517         vmlal.u32       q11,d28,d0[0]
518         vld1.64 {q10},[r6,:128]!
519         vmlal.u32       q12,d28,d0[1]
520         veor    d8,d8,d8
521         vmlal.u32       q13,d28,d1[0]
522         vshl.i64        d29,d23,#16
523         vmlal.u32       q6,d28,d1[1]
524         vadd.u64        d29,d29,d22
525         vmlal.u32       q7,d28,d2[0]
526         vmul.u32        d29,d29,d30
527         vmlal.u32       q8,d28,d2[1]
528         vst1.32 {d28},[r10,:64]!        @ put aside smashed b[8*i+5]
529         vmlal.u32       q9,d28,d3[0]
530         vzip.16 d29,d8
531         vmlal.u32       q10,d28,d3[1]
532         vld1.32 {d28[0]},[r2,:32]!      @ *b++
533         vmlal.u32       q11,d29,d4[0]
534         veor    d10,d10,d10
535         vmlal.u32       q12,d29,d4[1]
536         vzip.16 d28,d10
537         vmlal.u32       q13,d29,d5[0]
538         vshr.u64        d22,d22,#16
539         vmlal.u32       q6,d29,d5[1]
540         vmlal.u32       q7,d29,d6[0]
541         vadd.u64        d22,d22,d23
542         vmlal.u32       q8,d29,d6[1]
543         vshr.u64        d22,d22,#16
544         vmlal.u32       q9,d29,d7[0]
545         vmlal.u32       q10,d29,d7[1]
546         vadd.u64        d24,d24,d22
547         vst1.32 {d29},[r10,:64]!        @ put aside smashed m[8*i+5]
548         vmlal.u32       q12,d28,d0[0]
549         vld1.64 {q11},[r6,:128]!
550         vmlal.u32       q13,d28,d0[1]
551         veor    d8,d8,d8
552         vmlal.u32       q6,d28,d1[0]
553         vshl.i64        d29,d25,#16
554         vmlal.u32       q7,d28,d1[1]
555         vadd.u64        d29,d29,d24
556         vmlal.u32       q8,d28,d2[0]
557         vmul.u32        d29,d29,d30
558         vmlal.u32       q9,d28,d2[1]
559         vst1.32 {d28},[r10,:64]!        @ put aside smashed b[8*i+6]
560         vmlal.u32       q10,d28,d3[0]
561         vzip.16 d29,d8
562         vmlal.u32       q11,d28,d3[1]
563         vld1.32 {d28[0]},[r2,:32]!      @ *b++
564         vmlal.u32       q12,d29,d4[0]
565         veor    d10,d10,d10
566         vmlal.u32       q13,d29,d4[1]
567         vzip.16 d28,d10
568         vmlal.u32       q6,d29,d5[0]
569         vshr.u64        d24,d24,#16
570         vmlal.u32       q7,d29,d5[1]
571         vmlal.u32       q8,d29,d6[0]
572         vadd.u64        d24,d24,d25
573         vmlal.u32       q9,d29,d6[1]
574         vshr.u64        d24,d24,#16
575         vmlal.u32       q10,d29,d7[0]
576         vmlal.u32       q11,d29,d7[1]
577         vadd.u64        d26,d26,d24
578         vst1.32 {d29},[r10,:64]!        @ put aside smashed m[8*i+6]
579         vmlal.u32       q13,d28,d0[0]
580         vld1.64 {q12},[r6,:128]!
581         vmlal.u32       q6,d28,d0[1]
582         veor    d8,d8,d8
583         vmlal.u32       q7,d28,d1[0]
584         vshl.i64        d29,d27,#16
585         vmlal.u32       q8,d28,d1[1]
586         vadd.u64        d29,d29,d26
587         vmlal.u32       q9,d28,d2[0]
588         vmul.u32        d29,d29,d30
589         vmlal.u32       q10,d28,d2[1]
590         vst1.32 {d28},[r10,:64]!        @ put aside smashed b[8*i+7]
591         vmlal.u32       q11,d28,d3[0]
592         vzip.16 d29,d8
593         vmlal.u32       q12,d28,d3[1]
594         vld1.32 {d28},[sp,:64]          @ pull smashed b[8*i+0]
595         vmlal.u32       q13,d29,d4[0]
596         vld1.32 {d0,d1,d2,d3},[r1]!
597         vmlal.u32       q6,d29,d4[1]
598         vmlal.u32       q7,d29,d5[0]
599         vshr.u64        d26,d26,#16
600         vmlal.u32       q8,d29,d5[1]
601         vmlal.u32       q9,d29,d6[0]
602         vadd.u64        d26,d26,d27
603         vmlal.u32       q10,d29,d6[1]
604         vshr.u64        d26,d26,#16
605         vmlal.u32       q11,d29,d7[0]
606         vmlal.u32       q12,d29,d7[1]
607         vadd.u64        d12,d12,d26
608         vst1.32 {d29},[r10,:64] @ put aside smashed m[8*i+7]
609         add     r10,sp,#8               @ rewind
610         sub     r8,r5,#8
611         b       .LNEON_8n_inner
612
613 .align  4
614 .LNEON_8n_inner:
615         subs    r8,r8,#8
616         vmlal.u32       q6,d28,d0[0]
617         vld1.64 {q13},[r6,:128]
618         vmlal.u32       q7,d28,d0[1]
619         vld1.32 {d29},[r10,:64]!        @ pull smashed m[8*i+0]
620         vmlal.u32       q8,d28,d1[0]
621         vld1.32 {d4,d5,d6,d7},[r3]!
622         vmlal.u32       q9,d28,d1[1]
623         it      ne
624         addne   r6,r6,#16       @ don't advance in last iteration
625         vmlal.u32       q10,d28,d2[0]
626         vmlal.u32       q11,d28,d2[1]
627         vmlal.u32       q12,d28,d3[0]
628         vmlal.u32       q13,d28,d3[1]
629         vld1.32 {d28},[r10,:64]!        @ pull smashed b[8*i+1]
630         vmlal.u32       q6,d29,d4[0]
631         vmlal.u32       q7,d29,d4[1]
632         vmlal.u32       q8,d29,d5[0]
633         vmlal.u32       q9,d29,d5[1]
634         vmlal.u32       q10,d29,d6[0]
635         vmlal.u32       q11,d29,d6[1]
636         vmlal.u32       q12,d29,d7[0]
637         vmlal.u32       q13,d29,d7[1]
638         vst1.64 {q6},[r7,:128]!
639         vmlal.u32       q7,d28,d0[0]
640         vld1.64 {q6},[r6,:128]
641         vmlal.u32       q8,d28,d0[1]
642         vld1.32 {d29},[r10,:64]!        @ pull smashed m[8*i+1]
643         vmlal.u32       q9,d28,d1[0]
644         it      ne
645         addne   r6,r6,#16       @ don't advance in last iteration
646         vmlal.u32       q10,d28,d1[1]
647         vmlal.u32       q11,d28,d2[0]
648         vmlal.u32       q12,d28,d2[1]
649         vmlal.u32       q13,d28,d3[0]
650         vmlal.u32       q6,d28,d3[1]
651         vld1.32 {d28},[r10,:64]!        @ pull smashed b[8*i+2]
652         vmlal.u32       q7,d29,d4[0]
653         vmlal.u32       q8,d29,d4[1]
654         vmlal.u32       q9,d29,d5[0]
655         vmlal.u32       q10,d29,d5[1]
656         vmlal.u32       q11,d29,d6[0]
657         vmlal.u32       q12,d29,d6[1]
658         vmlal.u32       q13,d29,d7[0]
659         vmlal.u32       q6,d29,d7[1]
660         vst1.64 {q7},[r7,:128]!
661         vmlal.u32       q8,d28,d0[0]
662         vld1.64 {q7},[r6,:128]
663         vmlal.u32       q9,d28,d0[1]
664         vld1.32 {d29},[r10,:64]!        @ pull smashed m[8*i+2]
665         vmlal.u32       q10,d28,d1[0]
666         it      ne
667         addne   r6,r6,#16       @ don't advance in last iteration
668         vmlal.u32       q11,d28,d1[1]
669         vmlal.u32       q12,d28,d2[0]
670         vmlal.u32       q13,d28,d2[1]
671         vmlal.u32       q6,d28,d3[0]
672         vmlal.u32       q7,d28,d3[1]
673         vld1.32 {d28},[r10,:64]!        @ pull smashed b[8*i+3]
674         vmlal.u32       q8,d29,d4[0]
675         vmlal.u32       q9,d29,d4[1]
676         vmlal.u32       q10,d29,d5[0]
677         vmlal.u32       q11,d29,d5[1]
678         vmlal.u32       q12,d29,d6[0]
679         vmlal.u32       q13,d29,d6[1]
680         vmlal.u32       q6,d29,d7[0]
681         vmlal.u32       q7,d29,d7[1]
682         vst1.64 {q8},[r7,:128]!
683         vmlal.u32       q9,d28,d0[0]
684         vld1.64 {q8},[r6,:128]
685         vmlal.u32       q10,d28,d0[1]
686         vld1.32 {d29},[r10,:64]!        @ pull smashed m[8*i+3]
687         vmlal.u32       q11,d28,d1[0]
688         it      ne
689         addne   r6,r6,#16       @ don't advance in last iteration
690         vmlal.u32       q12,d28,d1[1]
691         vmlal.u32       q13,d28,d2[0]
692         vmlal.u32       q6,d28,d2[1]
693         vmlal.u32       q7,d28,d3[0]
694         vmlal.u32       q8,d28,d3[1]
695         vld1.32 {d28},[r10,:64]!        @ pull smashed b[8*i+4]
696         vmlal.u32       q9,d29,d4[0]
697         vmlal.u32       q10,d29,d4[1]
698         vmlal.u32       q11,d29,d5[0]
699         vmlal.u32       q12,d29,d5[1]
700         vmlal.u32       q13,d29,d6[0]
701         vmlal.u32       q6,d29,d6[1]
702         vmlal.u32       q7,d29,d7[0]
703         vmlal.u32       q8,d29,d7[1]
704         vst1.64 {q9},[r7,:128]!
705         vmlal.u32       q10,d28,d0[0]
706         vld1.64 {q9},[r6,:128]
707         vmlal.u32       q11,d28,d0[1]
708         vld1.32 {d29},[r10,:64]!        @ pull smashed m[8*i+4]
709         vmlal.u32       q12,d28,d1[0]
710         it      ne
711         addne   r6,r6,#16       @ don't advance in last iteration
712         vmlal.u32       q13,d28,d1[1]
713         vmlal.u32       q6,d28,d2[0]
714         vmlal.u32       q7,d28,d2[1]
715         vmlal.u32       q8,d28,d3[0]
716         vmlal.u32       q9,d28,d3[1]
717         vld1.32 {d28},[r10,:64]!        @ pull smashed b[8*i+5]
718         vmlal.u32       q10,d29,d4[0]
719         vmlal.u32       q11,d29,d4[1]
720         vmlal.u32       q12,d29,d5[0]
721         vmlal.u32       q13,d29,d5[1]
722         vmlal.u32       q6,d29,d6[0]
723         vmlal.u32       q7,d29,d6[1]
724         vmlal.u32       q8,d29,d7[0]
725         vmlal.u32       q9,d29,d7[1]
726         vst1.64 {q10},[r7,:128]!
727         vmlal.u32       q11,d28,d0[0]
728         vld1.64 {q10},[r6,:128]
729         vmlal.u32       q12,d28,d0[1]
730         vld1.32 {d29},[r10,:64]!        @ pull smashed m[8*i+5]
731         vmlal.u32       q13,d28,d1[0]
732         it      ne
733         addne   r6,r6,#16       @ don't advance in last iteration
734         vmlal.u32       q6,d28,d1[1]
735         vmlal.u32       q7,d28,d2[0]
736         vmlal.u32       q8,d28,d2[1]
737         vmlal.u32       q9,d28,d3[0]
738         vmlal.u32       q10,d28,d3[1]
739         vld1.32 {d28},[r10,:64]!        @ pull smashed b[8*i+6]
740         vmlal.u32       q11,d29,d4[0]
741         vmlal.u32       q12,d29,d4[1]
742         vmlal.u32       q13,d29,d5[0]
743         vmlal.u32       q6,d29,d5[1]
744         vmlal.u32       q7,d29,d6[0]
745         vmlal.u32       q8,d29,d6[1]
746         vmlal.u32       q9,d29,d7[0]
747         vmlal.u32       q10,d29,d7[1]
748         vst1.64 {q11},[r7,:128]!
749         vmlal.u32       q12,d28,d0[0]
750         vld1.64 {q11},[r6,:128]
751         vmlal.u32       q13,d28,d0[1]
752         vld1.32 {d29},[r10,:64]!        @ pull smashed m[8*i+6]
753         vmlal.u32       q6,d28,d1[0]
754         it      ne
755         addne   r6,r6,#16       @ don't advance in last iteration
756         vmlal.u32       q7,d28,d1[1]
757         vmlal.u32       q8,d28,d2[0]
758         vmlal.u32       q9,d28,d2[1]
759         vmlal.u32       q10,d28,d3[0]
760         vmlal.u32       q11,d28,d3[1]
761         vld1.32 {d28},[r10,:64]!        @ pull smashed b[8*i+7]
762         vmlal.u32       q12,d29,d4[0]
763         vmlal.u32       q13,d29,d4[1]
764         vmlal.u32       q6,d29,d5[0]
765         vmlal.u32       q7,d29,d5[1]
766         vmlal.u32       q8,d29,d6[0]
767         vmlal.u32       q9,d29,d6[1]
768         vmlal.u32       q10,d29,d7[0]
769         vmlal.u32       q11,d29,d7[1]
770         vst1.64 {q12},[r7,:128]!
771         vmlal.u32       q13,d28,d0[0]
772         vld1.64 {q12},[r6,:128]
773         vmlal.u32       q6,d28,d0[1]
774         vld1.32 {d29},[r10,:64]!        @ pull smashed m[8*i+7]
775         vmlal.u32       q7,d28,d1[0]
776         it      ne
777         addne   r6,r6,#16       @ don't advance in last iteration
778         vmlal.u32       q8,d28,d1[1]
779         vmlal.u32       q9,d28,d2[0]
780         vmlal.u32       q10,d28,d2[1]
781         vmlal.u32       q11,d28,d3[0]
782         vmlal.u32       q12,d28,d3[1]
783         it      eq
784         subeq   r1,r1,r5,lsl#2  @ rewind
785         vmlal.u32       q13,d29,d4[0]
786         vld1.32 {d28},[sp,:64]          @ pull smashed b[8*i+0]
787         vmlal.u32       q6,d29,d4[1]
788         vld1.32 {d0,d1,d2,d3},[r1]!
789         vmlal.u32       q7,d29,d5[0]
790         add     r10,sp,#8               @ rewind
791         vmlal.u32       q8,d29,d5[1]
792         vmlal.u32       q9,d29,d6[0]
793         vmlal.u32       q10,d29,d6[1]
794         vmlal.u32       q11,d29,d7[0]
795         vst1.64 {q13},[r7,:128]!
796         vmlal.u32       q12,d29,d7[1]
797
798         bne     .LNEON_8n_inner
799         add     r6,sp,#128
800         vst1.64 {q6,q7},[r7,:256]!
801         veor    q2,q2,q2                @ d4-d5
802         vst1.64 {q8,q9},[r7,:256]!
803         veor    q3,q3,q3                @ d6-d7
804         vst1.64 {q10,q11},[r7,:256]!
805         vst1.64 {q12},[r7,:128]
806
807         subs    r9,r9,#8
808         vld1.64 {q6,q7},[r6,:256]!
809         vld1.64 {q8,q9},[r6,:256]!
810         vld1.64 {q10,q11},[r6,:256]!
811         vld1.64 {q12,q13},[r6,:256]!
812
813         itt     ne
814         subne   r3,r3,r5,lsl#2  @ rewind
815         bne     .LNEON_8n_outer
816
817         add     r7,sp,#128
818         vst1.64 {q2,q3}, [sp,:256]!     @ start wiping stack frame
819         vshr.u64        d10,d12,#16
820         vst1.64 {q2,q3},[sp,:256]!
821         vadd.u64        d13,d13,d10
822         vst1.64 {q2,q3}, [sp,:256]!
823         vshr.u64        d10,d13,#16
824         vst1.64 {q2,q3}, [sp,:256]!
825         vzip.16 d12,d13
826
827         mov     r8,r5
828         b       .LNEON_tail_entry
829
830 .align  4
831 .LNEON_tail:
832         vadd.u64        d12,d12,d10
833         vshr.u64        d10,d12,#16
834         vld1.64 {q8,q9}, [r6, :256]!
835         vadd.u64        d13,d13,d10
836         vld1.64 {q10,q11}, [r6, :256]!
837         vshr.u64        d10,d13,#16
838         vld1.64 {q12,q13}, [r6, :256]!
839         vzip.16 d12,d13
840
841 .LNEON_tail_entry:
842         vadd.u64        d14,d14,d10
843         vst1.32 {d12[0]}, [r7, :32]!
844         vshr.u64        d10,d14,#16
845         vadd.u64        d15,d15,d10
846         vshr.u64        d10,d15,#16
847         vzip.16 d14,d15
848         vadd.u64        d16,d16,d10
849         vst1.32 {d14[0]}, [r7, :32]!
850         vshr.u64        d10,d16,#16
851         vadd.u64        d17,d17,d10
852         vshr.u64        d10,d17,#16
853         vzip.16 d16,d17
854         vadd.u64        d18,d18,d10
855         vst1.32 {d16[0]}, [r7, :32]!
856         vshr.u64        d10,d18,#16
857         vadd.u64        d19,d19,d10
858         vshr.u64        d10,d19,#16
859         vzip.16 d18,d19
860         vadd.u64        d20,d20,d10
861         vst1.32 {d18[0]}, [r7, :32]!
862         vshr.u64        d10,d20,#16
863         vadd.u64        d21,d21,d10
864         vshr.u64        d10,d21,#16
865         vzip.16 d20,d21
866         vadd.u64        d22,d22,d10
867         vst1.32 {d20[0]}, [r7, :32]!
868         vshr.u64        d10,d22,#16
869         vadd.u64        d23,d23,d10
870         vshr.u64        d10,d23,#16
871         vzip.16 d22,d23
872         vadd.u64        d24,d24,d10
873         vst1.32 {d22[0]}, [r7, :32]!
874         vshr.u64        d10,d24,#16
875         vadd.u64        d25,d25,d10
876         vshr.u64        d10,d25,#16
877         vzip.16 d24,d25
878         vadd.u64        d26,d26,d10
879         vst1.32 {d24[0]}, [r7, :32]!
880         vshr.u64        d10,d26,#16
881         vadd.u64        d27,d27,d10
882         vshr.u64        d10,d27,#16
883         vzip.16 d26,d27
884         vld1.64 {q6,q7}, [r6, :256]!
885         subs    r8,r8,#8
886         vst1.32 {d26[0]},   [r7, :32]!
887         bne     .LNEON_tail
888
889         vst1.32 {d10[0]}, [r7, :32]             @ top-most bit
890         sub     r3,r3,r5,lsl#2                  @ rewind r3
891         subs    r1,sp,#0                                @ clear carry flag
892         add     r2,sp,r5,lsl#2
893
894 .LNEON_sub:
895         ldmia   r1!, {r4,r5,r6,r7}
896         ldmia   r3!, {r8,r9,r10,r11}
897         sbcs    r8, r4,r8
898         sbcs    r9, r5,r9
899         sbcs    r10,r6,r10
900         sbcs    r11,r7,r11
901         teq     r1,r2                           @ preserves carry
902         stmia   r0!, {r8,r9,r10,r11}
903         bne     .LNEON_sub
904
905         ldr     r10, [r1]                               @ load top-most bit
906         mov     r11,sp
907         veor    q0,q0,q0
908         sub     r11,r2,r11                              @ this is num*4
909         veor    q1,q1,q1
910         mov     r1,sp
911         sub     r0,r0,r11                               @ rewind r0
912         mov     r3,r2                           @ second 3/4th of frame
913         sbcs    r10,r10,#0                              @ result is carry flag
914
915 .LNEON_copy_n_zap:
916         ldmia   r1!, {r4,r5,r6,r7}
917         ldmia   r0,  {r8,r9,r10,r11}
918         it      cc
919         movcc   r8, r4
920         vst1.64 {q0,q1}, [r3,:256]!                     @ wipe
921         itt     cc
922         movcc   r9, r5
923         movcc   r10,r6
924         vst1.64 {q0,q1}, [r3,:256]!                     @ wipe
925         it      cc
926         movcc   r11,r7
927         ldmia   r1, {r4,r5,r6,r7}
928         stmia   r0!, {r8,r9,r10,r11}
929         sub     r1,r1,#16
930         ldmia   r0, {r8,r9,r10,r11}
931         it      cc
932         movcc   r8, r4
933         vst1.64 {q0,q1}, [r1,:256]!                     @ wipe
934         itt     cc
935         movcc   r9, r5
936         movcc   r10,r6
937         vst1.64 {q0,q1}, [r3,:256]!                     @ wipe
938         it      cc
939         movcc   r11,r7
940         teq     r1,r2                           @ preserves carry
941         stmia   r0!, {r8,r9,r10,r11}
942         bne     .LNEON_copy_n_zap
943
944         mov     sp,ip
945         vldmia  sp!,{d8,d9,d10,d11,d12,d13,d14,d15}
946         ldmia   sp!,{r4,r5,r6,r7,r8,r9,r10,r11}
947         bx      lr                                              @ bx lr
948 .size   bn_mul8x_mont_neon,.-bn_mul8x_mont_neon
949 #endif
950 .byte   77,111,110,116,103,111,109,101,114,121,32,109,117,108,116,105,112,108,105,99,97,116,105,111,110,32,102,111,114,32,65,82,77,118,52,47,78,69,79,78,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
951 .align  2
952 .align  2
953 #if __ARM_MAX_ARCH__>=7
954 .comm   OPENSSL_armcap_P,4,4
955 #endif