• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// This file is generated from a similarly-named Perl script in the BoringSSL
2// source tree. Do not edit by hand.
3
4#if !defined(__has_feature)
5#define __has_feature(x) 0
6#endif
7#if __has_feature(memory_sanitizer) && !defined(OPENSSL_NO_ASM)
8#define OPENSSL_NO_ASM
9#endif
10
11#if !defined(OPENSSL_NO_ASM)
12#if defined(__arm__)
13#include "ring_core_generated/prefix_symbols_asm.h"
14#include <ring-core/arm_arch.h>
15
16@ Silence ARMv8 deprecated IT instruction warnings. This file is used by both
17@ ARMv7 and ARMv8 processors and does not use ARMv8 instructions. (ARMv8 PMULL
18@ instructions are in aesv8-armx.pl.)
19.arch	armv7-a
20
21.text
22#if defined(__thumb2__) || defined(__clang__)
23.syntax	unified
24#define ldrplb  ldrbpl
25#define ldrneb  ldrbne
26#endif
27#if defined(__thumb2__)
28.thumb
29#else
30.code	32
31#endif
32#if __ARM_MAX_ARCH__>=7
33.arch	armv7-a
34.fpu	neon
35
36.globl	gcm_init_neon
37.hidden	gcm_init_neon
38.type	gcm_init_neon,%function
39.align	4
40gcm_init_neon:
41	vld1.64	d7,[r1]!		@ load H
42	vmov.i8	q8,#0xe1
43	vld1.64	d6,[r1]
44	vshl.i64	d17,#57
45	vshr.u64	d16,#63		@ t0=0xc2....01
46	vdup.8	q9,d7[7]
47	vshr.u64	d26,d6,#63
48	vshr.s8	q9,#7			@ broadcast carry bit
49	vshl.i64	q3,q3,#1
50	vand	q8,q8,q9
51	vorr	d7,d26		@ H<<<=1
52	veor	q3,q3,q8		@ twisted H
53	vstmia	r0,{q3}
54
55	bx	lr					@ bx lr
56.size	gcm_init_neon,.-gcm_init_neon
57
58.globl	gcm_gmult_neon
59.hidden	gcm_gmult_neon
60.type	gcm_gmult_neon,%function
61.align	4
62gcm_gmult_neon:
63	vld1.64	d7,[r0]!		@ load Xi
64	vld1.64	d6,[r0]!
65	vmov.i64	d29,#0x0000ffffffffffff
66	vldmia	r1,{d26,d27}	@ load twisted H
67	vmov.i64	d30,#0x00000000ffffffff
68#ifdef __ARMEL__
69	vrev64.8	q3,q3
70#endif
71	vmov.i64	d31,#0x000000000000ffff
72	veor	d28,d26,d27		@ Karatsuba pre-processing
73	mov	r3,#16
74	b	.Lgmult_neon
75.size	gcm_gmult_neon,.-gcm_gmult_neon
76
77.globl	gcm_ghash_neon
78.hidden	gcm_ghash_neon
79.type	gcm_ghash_neon,%function
80.align	4
81gcm_ghash_neon:
82	vld1.64	d1,[r0]!		@ load Xi
83	vld1.64	d0,[r0]!
84	vmov.i64	d29,#0x0000ffffffffffff
85	vldmia	r1,{d26,d27}	@ load twisted H
86	vmov.i64	d30,#0x00000000ffffffff
87#ifdef __ARMEL__
88	vrev64.8	q0,q0
89#endif
90	vmov.i64	d31,#0x000000000000ffff
91	veor	d28,d26,d27		@ Karatsuba pre-processing
92
93.Loop_neon:
94	vld1.64	d7,[r2]!		@ load inp
95	vld1.64	d6,[r2]!
96#ifdef __ARMEL__
97	vrev64.8	q3,q3
98#endif
99	veor	q3,q0			@ inp^=Xi
100.Lgmult_neon:
101	vext.8	d16, d26, d26, #1	@ A1
102	vmull.p8	q8, d16, d6		@ F = A1*B
103	vext.8	d0, d6, d6, #1	@ B1
104	vmull.p8	q0, d26, d0		@ E = A*B1
105	vext.8	d18, d26, d26, #2	@ A2
106	vmull.p8	q9, d18, d6		@ H = A2*B
107	vext.8	d22, d6, d6, #2	@ B2
108	vmull.p8	q11, d26, d22		@ G = A*B2
109	vext.8	d20, d26, d26, #3	@ A3
110	veor	q8, q8, q0		@ L = E + F
111	vmull.p8	q10, d20, d6		@ J = A3*B
112	vext.8	d0, d6, d6, #3	@ B3
113	veor	q9, q9, q11		@ M = G + H
114	vmull.p8	q0, d26, d0		@ I = A*B3
115	veor	d16, d16, d17	@ t0 = (L) (P0 + P1) << 8
116	vand	d17, d17, d29
117	vext.8	d22, d6, d6, #4	@ B4
118	veor	d18, d18, d19	@ t1 = (M) (P2 + P3) << 16
119	vand	d19, d19, d30
120	vmull.p8	q11, d26, d22		@ K = A*B4
121	veor	q10, q10, q0		@ N = I + J
122	veor	d16, d16, d17
123	veor	d18, d18, d19
124	veor	d20, d20, d21	@ t2 = (N) (P4 + P5) << 24
125	vand	d21, d21, d31
126	vext.8	q8, q8, q8, #15
127	veor	d22, d22, d23	@ t3 = (K) (P6 + P7) << 32
128	vmov.i64	d23, #0
129	vext.8	q9, q9, q9, #14
130	veor	d20, d20, d21
131	vmull.p8	q0, d26, d6		@ D = A*B
132	vext.8	q11, q11, q11, #12
133	vext.8	q10, q10, q10, #13
134	veor	q8, q8, q9
135	veor	q10, q10, q11
136	veor	q0, q0, q8
137	veor	q0, q0, q10
138	veor	d6,d6,d7	@ Karatsuba pre-processing
139	vext.8	d16, d28, d28, #1	@ A1
140	vmull.p8	q8, d16, d6		@ F = A1*B
141	vext.8	d2, d6, d6, #1	@ B1
142	vmull.p8	q1, d28, d2		@ E = A*B1
143	vext.8	d18, d28, d28, #2	@ A2
144	vmull.p8	q9, d18, d6		@ H = A2*B
145	vext.8	d22, d6, d6, #2	@ B2
146	vmull.p8	q11, d28, d22		@ G = A*B2
147	vext.8	d20, d28, d28, #3	@ A3
148	veor	q8, q8, q1		@ L = E + F
149	vmull.p8	q10, d20, d6		@ J = A3*B
150	vext.8	d2, d6, d6, #3	@ B3
151	veor	q9, q9, q11		@ M = G + H
152	vmull.p8	q1, d28, d2		@ I = A*B3
153	veor	d16, d16, d17	@ t0 = (L) (P0 + P1) << 8
154	vand	d17, d17, d29
155	vext.8	d22, d6, d6, #4	@ B4
156	veor	d18, d18, d19	@ t1 = (M) (P2 + P3) << 16
157	vand	d19, d19, d30
158	vmull.p8	q11, d28, d22		@ K = A*B4
159	veor	q10, q10, q1		@ N = I + J
160	veor	d16, d16, d17
161	veor	d18, d18, d19
162	veor	d20, d20, d21	@ t2 = (N) (P4 + P5) << 24
163	vand	d21, d21, d31
164	vext.8	q8, q8, q8, #15
165	veor	d22, d22, d23	@ t3 = (K) (P6 + P7) << 32
166	vmov.i64	d23, #0
167	vext.8	q9, q9, q9, #14
168	veor	d20, d20, d21
169	vmull.p8	q1, d28, d6		@ D = A*B
170	vext.8	q11, q11, q11, #12
171	vext.8	q10, q10, q10, #13
172	veor	q8, q8, q9
173	veor	q10, q10, q11
174	veor	q1, q1, q8
175	veor	q1, q1, q10
176	vext.8	d16, d27, d27, #1	@ A1
177	vmull.p8	q8, d16, d7		@ F = A1*B
178	vext.8	d4, d7, d7, #1	@ B1
179	vmull.p8	q2, d27, d4		@ E = A*B1
180	vext.8	d18, d27, d27, #2	@ A2
181	vmull.p8	q9, d18, d7		@ H = A2*B
182	vext.8	d22, d7, d7, #2	@ B2
183	vmull.p8	q11, d27, d22		@ G = A*B2
184	vext.8	d20, d27, d27, #3	@ A3
185	veor	q8, q8, q2		@ L = E + F
186	vmull.p8	q10, d20, d7		@ J = A3*B
187	vext.8	d4, d7, d7, #3	@ B3
188	veor	q9, q9, q11		@ M = G + H
189	vmull.p8	q2, d27, d4		@ I = A*B3
190	veor	d16, d16, d17	@ t0 = (L) (P0 + P1) << 8
191	vand	d17, d17, d29
192	vext.8	d22, d7, d7, #4	@ B4
193	veor	d18, d18, d19	@ t1 = (M) (P2 + P3) << 16
194	vand	d19, d19, d30
195	vmull.p8	q11, d27, d22		@ K = A*B4
196	veor	q10, q10, q2		@ N = I + J
197	veor	d16, d16, d17
198	veor	d18, d18, d19
199	veor	d20, d20, d21	@ t2 = (N) (P4 + P5) << 24
200	vand	d21, d21, d31
201	vext.8	q8, q8, q8, #15
202	veor	d22, d22, d23	@ t3 = (K) (P6 + P7) << 32
203	vmov.i64	d23, #0
204	vext.8	q9, q9, q9, #14
205	veor	d20, d20, d21
206	vmull.p8	q2, d27, d7		@ D = A*B
207	vext.8	q11, q11, q11, #12
208	vext.8	q10, q10, q10, #13
209	veor	q8, q8, q9
210	veor	q10, q10, q11
211	veor	q2, q2, q8
212	veor	q2, q2, q10
213	veor	q1,q1,q0		@ Karatsuba post-processing
214	veor	q1,q1,q2
215	veor	d1,d1,d2
216	veor	d4,d4,d3	@ Xh|Xl - 256-bit result
217
218	@ equivalent of reduction_avx from ghash-x86_64.pl
219	vshl.i64	q9,q0,#57		@ 1st phase
220	vshl.i64	q10,q0,#62
221	veor	q10,q10,q9		@
222	vshl.i64	q9,q0,#63
223	veor	q10, q10, q9		@
224	veor	d1,d1,d20	@
225	veor	d4,d4,d21
226
227	vshr.u64	q10,q0,#1		@ 2nd phase
228	veor	q2,q2,q0
229	veor	q0,q0,q10		@
230	vshr.u64	q10,q10,#6
231	vshr.u64	q0,q0,#1		@
232	veor	q0,q0,q2		@
233	veor	q0,q0,q10		@
234
235	subs	r3,#16
236	bne	.Loop_neon
237
238#ifdef __ARMEL__
239	vrev64.8	q0,q0
240#endif
241	sub	r0,#16
242	vst1.64	d1,[r0]!		@ write out Xi
243	vst1.64	d0,[r0]
244
245	bx	lr					@ bx lr
246.size	gcm_ghash_neon,.-gcm_ghash_neon
247#endif
248.byte	71,72,65,83,72,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
249.align	2
250.align	2
251#endif
252#endif  // !OPENSSL_NO_ASM
253.section	.note.GNU-stack,"",%progbits
254