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