xref: /aosp_15_r20/external/boringssl/src/gen/bcm/ghashv8-armv8-linux.S (revision 8fb009dc861624b67b6cdb62ea21f0f22d0c584b)
1*8fb009dcSAndroid Build Coastguard Worker// This file is generated from a similarly-named Perl script in the BoringSSL
2*8fb009dcSAndroid Build Coastguard Worker// source tree. Do not edit by hand.
3*8fb009dcSAndroid Build Coastguard Worker
4*8fb009dcSAndroid Build Coastguard Worker#include <openssl/asm_base.h>
5*8fb009dcSAndroid Build Coastguard Worker
6*8fb009dcSAndroid Build Coastguard Worker#if !defined(OPENSSL_NO_ASM) && defined(OPENSSL_AARCH64) && defined(__ELF__)
7*8fb009dcSAndroid Build Coastguard Worker#include <openssl/arm_arch.h>
8*8fb009dcSAndroid Build Coastguard Worker
9*8fb009dcSAndroid Build Coastguard Worker#if __ARM_MAX_ARCH__>=7
10*8fb009dcSAndroid Build Coastguard Worker.text
11*8fb009dcSAndroid Build Coastguard Worker.arch	armv8-a+crypto
12*8fb009dcSAndroid Build Coastguard Worker.globl	gcm_init_v8
13*8fb009dcSAndroid Build Coastguard Worker.hidden	gcm_init_v8
14*8fb009dcSAndroid Build Coastguard Worker.type	gcm_init_v8,%function
15*8fb009dcSAndroid Build Coastguard Worker.align	4
16*8fb009dcSAndroid Build Coastguard Workergcm_init_v8:
17*8fb009dcSAndroid Build Coastguard Worker	AARCH64_VALID_CALL_TARGET
18*8fb009dcSAndroid Build Coastguard Worker	ld1	{v17.2d},[x1]		//load input H
19*8fb009dcSAndroid Build Coastguard Worker	movi	v19.16b,#0xe1
20*8fb009dcSAndroid Build Coastguard Worker	shl	v19.2d,v19.2d,#57		//0xc2.0
21*8fb009dcSAndroid Build Coastguard Worker	ext	v3.16b,v17.16b,v17.16b,#8
22*8fb009dcSAndroid Build Coastguard Worker	ushr	v18.2d,v19.2d,#63
23*8fb009dcSAndroid Build Coastguard Worker	dup	v17.4s,v17.s[1]
24*8fb009dcSAndroid Build Coastguard Worker	ext	v16.16b,v18.16b,v19.16b,#8		//t0=0xc2....01
25*8fb009dcSAndroid Build Coastguard Worker	ushr	v18.2d,v3.2d,#63
26*8fb009dcSAndroid Build Coastguard Worker	sshr	v17.4s,v17.4s,#31		//broadcast carry bit
27*8fb009dcSAndroid Build Coastguard Worker	and	v18.16b,v18.16b,v16.16b
28*8fb009dcSAndroid Build Coastguard Worker	shl	v3.2d,v3.2d,#1
29*8fb009dcSAndroid Build Coastguard Worker	ext	v18.16b,v18.16b,v18.16b,#8
30*8fb009dcSAndroid Build Coastguard Worker	and	v16.16b,v16.16b,v17.16b
31*8fb009dcSAndroid Build Coastguard Worker	orr	v3.16b,v3.16b,v18.16b		//H<<<=1
32*8fb009dcSAndroid Build Coastguard Worker	eor	v20.16b,v3.16b,v16.16b		//twisted H
33*8fb009dcSAndroid Build Coastguard Worker	st1	{v20.2d},[x0],#16		//store Htable[0]
34*8fb009dcSAndroid Build Coastguard Worker
35*8fb009dcSAndroid Build Coastguard Worker	//calculate H^2
36*8fb009dcSAndroid Build Coastguard Worker	ext	v16.16b,v20.16b,v20.16b,#8		//Karatsuba pre-processing
37*8fb009dcSAndroid Build Coastguard Worker	pmull	v0.1q,v20.1d,v20.1d
38*8fb009dcSAndroid Build Coastguard Worker	eor	v16.16b,v16.16b,v20.16b
39*8fb009dcSAndroid Build Coastguard Worker	pmull2	v2.1q,v20.2d,v20.2d
40*8fb009dcSAndroid Build Coastguard Worker	pmull	v1.1q,v16.1d,v16.1d
41*8fb009dcSAndroid Build Coastguard Worker
42*8fb009dcSAndroid Build Coastguard Worker	ext	v17.16b,v0.16b,v2.16b,#8		//Karatsuba post-processing
43*8fb009dcSAndroid Build Coastguard Worker	eor	v18.16b,v0.16b,v2.16b
44*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v17.16b
45*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v18.16b
46*8fb009dcSAndroid Build Coastguard Worker	pmull	v18.1q,v0.1d,v19.1d		//1st phase
47*8fb009dcSAndroid Build Coastguard Worker
48*8fb009dcSAndroid Build Coastguard Worker	ins	v2.d[0],v1.d[1]
49*8fb009dcSAndroid Build Coastguard Worker	ins	v1.d[1],v0.d[0]
50*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v1.16b,v18.16b
51*8fb009dcSAndroid Build Coastguard Worker
52*8fb009dcSAndroid Build Coastguard Worker	ext	v18.16b,v0.16b,v0.16b,#8		//2nd phase
53*8fb009dcSAndroid Build Coastguard Worker	pmull	v0.1q,v0.1d,v19.1d
54*8fb009dcSAndroid Build Coastguard Worker	eor	v18.16b,v18.16b,v2.16b
55*8fb009dcSAndroid Build Coastguard Worker	eor	v22.16b,v0.16b,v18.16b
56*8fb009dcSAndroid Build Coastguard Worker
57*8fb009dcSAndroid Build Coastguard Worker	ext	v17.16b,v22.16b,v22.16b,#8		//Karatsuba pre-processing
58*8fb009dcSAndroid Build Coastguard Worker	eor	v17.16b,v17.16b,v22.16b
59*8fb009dcSAndroid Build Coastguard Worker	ext	v21.16b,v16.16b,v17.16b,#8		//pack Karatsuba pre-processed
60*8fb009dcSAndroid Build Coastguard Worker	st1	{v21.2d,v22.2d},[x0],#32	//store Htable[1..2]
61*8fb009dcSAndroid Build Coastguard Worker	//calculate H^3 and H^4
62*8fb009dcSAndroid Build Coastguard Worker	pmull	v0.1q,v20.1d, v22.1d
63*8fb009dcSAndroid Build Coastguard Worker	pmull	v5.1q,v22.1d,v22.1d
64*8fb009dcSAndroid Build Coastguard Worker	pmull2	v2.1q,v20.2d, v22.2d
65*8fb009dcSAndroid Build Coastguard Worker	pmull2	v7.1q,v22.2d,v22.2d
66*8fb009dcSAndroid Build Coastguard Worker	pmull	v1.1q,v16.1d,v17.1d
67*8fb009dcSAndroid Build Coastguard Worker	pmull	v6.1q,v17.1d,v17.1d
68*8fb009dcSAndroid Build Coastguard Worker
69*8fb009dcSAndroid Build Coastguard Worker	ext	v16.16b,v0.16b,v2.16b,#8		//Karatsuba post-processing
70*8fb009dcSAndroid Build Coastguard Worker	ext	v17.16b,v5.16b,v7.16b,#8
71*8fb009dcSAndroid Build Coastguard Worker	eor	v18.16b,v0.16b,v2.16b
72*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v16.16b
73*8fb009dcSAndroid Build Coastguard Worker	eor	v4.16b,v5.16b,v7.16b
74*8fb009dcSAndroid Build Coastguard Worker	eor	v6.16b,v6.16b,v17.16b
75*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v18.16b
76*8fb009dcSAndroid Build Coastguard Worker	pmull	v18.1q,v0.1d,v19.1d		//1st phase
77*8fb009dcSAndroid Build Coastguard Worker	eor	v6.16b,v6.16b,v4.16b
78*8fb009dcSAndroid Build Coastguard Worker	pmull	v4.1q,v5.1d,v19.1d
79*8fb009dcSAndroid Build Coastguard Worker
80*8fb009dcSAndroid Build Coastguard Worker	ins	v2.d[0],v1.d[1]
81*8fb009dcSAndroid Build Coastguard Worker	ins	v7.d[0],v6.d[1]
82*8fb009dcSAndroid Build Coastguard Worker	ins	v1.d[1],v0.d[0]
83*8fb009dcSAndroid Build Coastguard Worker	ins	v6.d[1],v5.d[0]
84*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v1.16b,v18.16b
85*8fb009dcSAndroid Build Coastguard Worker	eor	v5.16b,v6.16b,v4.16b
86*8fb009dcSAndroid Build Coastguard Worker
87*8fb009dcSAndroid Build Coastguard Worker	ext	v18.16b,v0.16b,v0.16b,#8		//2nd phase
88*8fb009dcSAndroid Build Coastguard Worker	ext	v4.16b,v5.16b,v5.16b,#8
89*8fb009dcSAndroid Build Coastguard Worker	pmull	v0.1q,v0.1d,v19.1d
90*8fb009dcSAndroid Build Coastguard Worker	pmull	v5.1q,v5.1d,v19.1d
91*8fb009dcSAndroid Build Coastguard Worker	eor	v18.16b,v18.16b,v2.16b
92*8fb009dcSAndroid Build Coastguard Worker	eor	v4.16b,v4.16b,v7.16b
93*8fb009dcSAndroid Build Coastguard Worker	eor	v20.16b, v0.16b,v18.16b		//H^3
94*8fb009dcSAndroid Build Coastguard Worker	eor	v22.16b,v5.16b,v4.16b		//H^4
95*8fb009dcSAndroid Build Coastguard Worker
96*8fb009dcSAndroid Build Coastguard Worker	ext	v16.16b,v20.16b, v20.16b,#8		//Karatsuba pre-processing
97*8fb009dcSAndroid Build Coastguard Worker	ext	v17.16b,v22.16b,v22.16b,#8
98*8fb009dcSAndroid Build Coastguard Worker	eor	v16.16b,v16.16b,v20.16b
99*8fb009dcSAndroid Build Coastguard Worker	eor	v17.16b,v17.16b,v22.16b
100*8fb009dcSAndroid Build Coastguard Worker	ext	v21.16b,v16.16b,v17.16b,#8		//pack Karatsuba pre-processed
101*8fb009dcSAndroid Build Coastguard Worker	st1	{v20.2d,v21.2d,v22.2d},[x0]		//store Htable[3..5]
102*8fb009dcSAndroid Build Coastguard Worker	ret
103*8fb009dcSAndroid Build Coastguard Worker.size	gcm_init_v8,.-gcm_init_v8
104*8fb009dcSAndroid Build Coastguard Worker.globl	gcm_gmult_v8
105*8fb009dcSAndroid Build Coastguard Worker.hidden	gcm_gmult_v8
106*8fb009dcSAndroid Build Coastguard Worker.type	gcm_gmult_v8,%function
107*8fb009dcSAndroid Build Coastguard Worker.align	4
108*8fb009dcSAndroid Build Coastguard Workergcm_gmult_v8:
109*8fb009dcSAndroid Build Coastguard Worker	AARCH64_VALID_CALL_TARGET
110*8fb009dcSAndroid Build Coastguard Worker	ld1	{v17.2d},[x0]		//load Xi
111*8fb009dcSAndroid Build Coastguard Worker	movi	v19.16b,#0xe1
112*8fb009dcSAndroid Build Coastguard Worker	ld1	{v20.2d,v21.2d},[x1]	//load twisted H, ...
113*8fb009dcSAndroid Build Coastguard Worker	shl	v19.2d,v19.2d,#57
114*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__
115*8fb009dcSAndroid Build Coastguard Worker	rev64	v17.16b,v17.16b
116*8fb009dcSAndroid Build Coastguard Worker#endif
117*8fb009dcSAndroid Build Coastguard Worker	ext	v3.16b,v17.16b,v17.16b,#8
118*8fb009dcSAndroid Build Coastguard Worker
119*8fb009dcSAndroid Build Coastguard Worker	pmull	v0.1q,v20.1d,v3.1d		//H.lo·Xi.lo
120*8fb009dcSAndroid Build Coastguard Worker	eor	v17.16b,v17.16b,v3.16b		//Karatsuba pre-processing
121*8fb009dcSAndroid Build Coastguard Worker	pmull2	v2.1q,v20.2d,v3.2d		//H.hXi.hi
122*8fb009dcSAndroid Build Coastguard Worker	pmull	v1.1q,v21.1d,v17.1d		//(H.lo+H.hi)·(Xi.lo+Xi.hi)
123*8fb009dcSAndroid Build Coastguard Worker
124*8fb009dcSAndroid Build Coastguard Worker	ext	v17.16b,v0.16b,v2.16b,#8		//Karatsuba post-processing
125*8fb009dcSAndroid Build Coastguard Worker	eor	v18.16b,v0.16b,v2.16b
126*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v17.16b
127*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v18.16b
128*8fb009dcSAndroid Build Coastguard Worker	pmull	v18.1q,v0.1d,v19.1d		//1st phase of reduction
129*8fb009dcSAndroid Build Coastguard Worker
130*8fb009dcSAndroid Build Coastguard Worker	ins	v2.d[0],v1.d[1]
131*8fb009dcSAndroid Build Coastguard Worker	ins	v1.d[1],v0.d[0]
132*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v1.16b,v18.16b
133*8fb009dcSAndroid Build Coastguard Worker
134*8fb009dcSAndroid Build Coastguard Worker	ext	v18.16b,v0.16b,v0.16b,#8		//2nd phase of reduction
135*8fb009dcSAndroid Build Coastguard Worker	pmull	v0.1q,v0.1d,v19.1d
136*8fb009dcSAndroid Build Coastguard Worker	eor	v18.16b,v18.16b,v2.16b
137*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v0.16b,v18.16b
138*8fb009dcSAndroid Build Coastguard Worker
139*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__
140*8fb009dcSAndroid Build Coastguard Worker	rev64	v0.16b,v0.16b
141*8fb009dcSAndroid Build Coastguard Worker#endif
142*8fb009dcSAndroid Build Coastguard Worker	ext	v0.16b,v0.16b,v0.16b,#8
143*8fb009dcSAndroid Build Coastguard Worker	st1	{v0.2d},[x0]		//write out Xi
144*8fb009dcSAndroid Build Coastguard Worker
145*8fb009dcSAndroid Build Coastguard Worker	ret
146*8fb009dcSAndroid Build Coastguard Worker.size	gcm_gmult_v8,.-gcm_gmult_v8
147*8fb009dcSAndroid Build Coastguard Worker.globl	gcm_ghash_v8
148*8fb009dcSAndroid Build Coastguard Worker.hidden	gcm_ghash_v8
149*8fb009dcSAndroid Build Coastguard Worker.type	gcm_ghash_v8,%function
150*8fb009dcSAndroid Build Coastguard Worker.align	4
151*8fb009dcSAndroid Build Coastguard Workergcm_ghash_v8:
152*8fb009dcSAndroid Build Coastguard Worker	AARCH64_VALID_CALL_TARGET
153*8fb009dcSAndroid Build Coastguard Worker	cmp	x3,#64
154*8fb009dcSAndroid Build Coastguard Worker	b.hs	.Lgcm_ghash_v8_4x
155*8fb009dcSAndroid Build Coastguard Worker	ld1	{v0.2d},[x0]		//load [rotated] Xi
156*8fb009dcSAndroid Build Coastguard Worker						//"[rotated]" means that
157*8fb009dcSAndroid Build Coastguard Worker						//loaded value would have
158*8fb009dcSAndroid Build Coastguard Worker						//to be rotated in order to
159*8fb009dcSAndroid Build Coastguard Worker						//make it appear as in
160*8fb009dcSAndroid Build Coastguard Worker						//algorithm specification
161*8fb009dcSAndroid Build Coastguard Worker	subs	x3,x3,#32		//see if x3 is 32 or larger
162*8fb009dcSAndroid Build Coastguard Worker	mov	x12,#16		//x12 is used as post-
163*8fb009dcSAndroid Build Coastguard Worker						//increment for input pointer;
164*8fb009dcSAndroid Build Coastguard Worker						//as loop is modulo-scheduled
165*8fb009dcSAndroid Build Coastguard Worker						//x12 is zeroed just in time
166*8fb009dcSAndroid Build Coastguard Worker						//to preclude overstepping
167*8fb009dcSAndroid Build Coastguard Worker						//inp[len], which means that
168*8fb009dcSAndroid Build Coastguard Worker						//last block[s] are actually
169*8fb009dcSAndroid Build Coastguard Worker						//loaded twice, but last
170*8fb009dcSAndroid Build Coastguard Worker						//copy is not processed
171*8fb009dcSAndroid Build Coastguard Worker	ld1	{v20.2d,v21.2d},[x1],#32	//load twisted H, ..., H^2
172*8fb009dcSAndroid Build Coastguard Worker	movi	v19.16b,#0xe1
173*8fb009dcSAndroid Build Coastguard Worker	ld1	{v22.2d},[x1]
174*8fb009dcSAndroid Build Coastguard Worker	csel	x12,xzr,x12,eq			//is it time to zero x12?
175*8fb009dcSAndroid Build Coastguard Worker	ext	v0.16b,v0.16b,v0.16b,#8		//rotate Xi
176*8fb009dcSAndroid Build Coastguard Worker	ld1	{v16.2d},[x2],#16	//load [rotated] I[0]
177*8fb009dcSAndroid Build Coastguard Worker	shl	v19.2d,v19.2d,#57		//compose 0xc2.0 constant
178*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__
179*8fb009dcSAndroid Build Coastguard Worker	rev64	v16.16b,v16.16b
180*8fb009dcSAndroid Build Coastguard Worker	rev64	v0.16b,v0.16b
181*8fb009dcSAndroid Build Coastguard Worker#endif
182*8fb009dcSAndroid Build Coastguard Worker	ext	v3.16b,v16.16b,v16.16b,#8		//rotate I[0]
183*8fb009dcSAndroid Build Coastguard Worker	b.lo	.Lodd_tail_v8		//x3 was less than 32
184*8fb009dcSAndroid Build Coastguard Worker	ld1	{v17.2d},[x2],x12	//load [rotated] I[1]
185*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__
186*8fb009dcSAndroid Build Coastguard Worker	rev64	v17.16b,v17.16b
187*8fb009dcSAndroid Build Coastguard Worker#endif
188*8fb009dcSAndroid Build Coastguard Worker	ext	v7.16b,v17.16b,v17.16b,#8
189*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v0.16b		//I[i]^=Xi
190*8fb009dcSAndroid Build Coastguard Worker	pmull	v4.1q,v20.1d,v7.1d		//H·Ii+1
191*8fb009dcSAndroid Build Coastguard Worker	eor	v17.16b,v17.16b,v7.16b		//Karatsuba pre-processing
192*8fb009dcSAndroid Build Coastguard Worker	pmull2	v6.1q,v20.2d,v7.2d
193*8fb009dcSAndroid Build Coastguard Worker	b	.Loop_mod2x_v8
194*8fb009dcSAndroid Build Coastguard Worker
195*8fb009dcSAndroid Build Coastguard Worker.align	4
196*8fb009dcSAndroid Build Coastguard Worker.Loop_mod2x_v8:
197*8fb009dcSAndroid Build Coastguard Worker	ext	v18.16b,v3.16b,v3.16b,#8
198*8fb009dcSAndroid Build Coastguard Worker	subs	x3,x3,#32		//is there more data?
199*8fb009dcSAndroid Build Coastguard Worker	pmull	v0.1q,v22.1d,v3.1d		//H^2.lo·Xi.lo
200*8fb009dcSAndroid Build Coastguard Worker	csel	x12,xzr,x12,lo			//is it time to zero x12?
201*8fb009dcSAndroid Build Coastguard Worker
202*8fb009dcSAndroid Build Coastguard Worker	pmull	v5.1q,v21.1d,v17.1d
203*8fb009dcSAndroid Build Coastguard Worker	eor	v18.16b,v18.16b,v3.16b		//Karatsuba pre-processing
204*8fb009dcSAndroid Build Coastguard Worker	pmull2	v2.1q,v22.2d,v3.2d		//H^2.hi·Xi.hi
205*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v0.16b,v4.16b		//accumulate
206*8fb009dcSAndroid Build Coastguard Worker	pmull2	v1.1q,v21.2d,v18.2d		//(H^2.lo+H^2.hi)·(Xi.lo+Xi.hi)
207*8fb009dcSAndroid Build Coastguard Worker	ld1	{v16.2d},[x2],x12	//load [rotated] I[i+2]
208*8fb009dcSAndroid Build Coastguard Worker
209*8fb009dcSAndroid Build Coastguard Worker	eor	v2.16b,v2.16b,v6.16b
210*8fb009dcSAndroid Build Coastguard Worker	csel	x12,xzr,x12,eq			//is it time to zero x12?
211*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v5.16b
212*8fb009dcSAndroid Build Coastguard Worker
213*8fb009dcSAndroid Build Coastguard Worker	ext	v17.16b,v0.16b,v2.16b,#8		//Karatsuba post-processing
214*8fb009dcSAndroid Build Coastguard Worker	eor	v18.16b,v0.16b,v2.16b
215*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v17.16b
216*8fb009dcSAndroid Build Coastguard Worker	ld1	{v17.2d},[x2],x12	//load [rotated] I[i+3]
217*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__
218*8fb009dcSAndroid Build Coastguard Worker	rev64	v16.16b,v16.16b
219*8fb009dcSAndroid Build Coastguard Worker#endif
220*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v18.16b
221*8fb009dcSAndroid Build Coastguard Worker	pmull	v18.1q,v0.1d,v19.1d		//1st phase of reduction
222*8fb009dcSAndroid Build Coastguard Worker
223*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__
224*8fb009dcSAndroid Build Coastguard Worker	rev64	v17.16b,v17.16b
225*8fb009dcSAndroid Build Coastguard Worker#endif
226*8fb009dcSAndroid Build Coastguard Worker	ins	v2.d[0],v1.d[1]
227*8fb009dcSAndroid Build Coastguard Worker	ins	v1.d[1],v0.d[0]
228*8fb009dcSAndroid Build Coastguard Worker	ext	v7.16b,v17.16b,v17.16b,#8
229*8fb009dcSAndroid Build Coastguard Worker	ext	v3.16b,v16.16b,v16.16b,#8
230*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v1.16b,v18.16b
231*8fb009dcSAndroid Build Coastguard Worker	pmull	v4.1q,v20.1d,v7.1d		//H·Ii+1
232*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v2.16b		//accumulate v3.16b early
233*8fb009dcSAndroid Build Coastguard Worker
234*8fb009dcSAndroid Build Coastguard Worker	ext	v18.16b,v0.16b,v0.16b,#8		//2nd phase of reduction
235*8fb009dcSAndroid Build Coastguard Worker	pmull	v0.1q,v0.1d,v19.1d
236*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v18.16b
237*8fb009dcSAndroid Build Coastguard Worker	eor	v17.16b,v17.16b,v7.16b		//Karatsuba pre-processing
238*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v0.16b
239*8fb009dcSAndroid Build Coastguard Worker	pmull2	v6.1q,v20.2d,v7.2d
240*8fb009dcSAndroid Build Coastguard Worker	b.hs	.Loop_mod2x_v8		//there was at least 32 more bytes
241*8fb009dcSAndroid Build Coastguard Worker
242*8fb009dcSAndroid Build Coastguard Worker	eor	v2.16b,v2.16b,v18.16b
243*8fb009dcSAndroid Build Coastguard Worker	ext	v3.16b,v16.16b,v16.16b,#8		//re-construct v3.16b
244*8fb009dcSAndroid Build Coastguard Worker	adds	x3,x3,#32		//re-construct x3
245*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v0.16b,v2.16b		//re-construct v0.16b
246*8fb009dcSAndroid Build Coastguard Worker	b.eq	.Ldone_v8		//is x3 zero?
247*8fb009dcSAndroid Build Coastguard Worker.Lodd_tail_v8:
248*8fb009dcSAndroid Build Coastguard Worker	ext	v18.16b,v0.16b,v0.16b,#8
249*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v0.16b		//inp^=Xi
250*8fb009dcSAndroid Build Coastguard Worker	eor	v17.16b,v16.16b,v18.16b		//v17.16b is rotated inp^Xi
251*8fb009dcSAndroid Build Coastguard Worker
252*8fb009dcSAndroid Build Coastguard Worker	pmull	v0.1q,v20.1d,v3.1d		//H.lo·Xi.lo
253*8fb009dcSAndroid Build Coastguard Worker	eor	v17.16b,v17.16b,v3.16b		//Karatsuba pre-processing
254*8fb009dcSAndroid Build Coastguard Worker	pmull2	v2.1q,v20.2d,v3.2d		//H.hXi.hi
255*8fb009dcSAndroid Build Coastguard Worker	pmull	v1.1q,v21.1d,v17.1d		//(H.lo+H.hi)·(Xi.lo+Xi.hi)
256*8fb009dcSAndroid Build Coastguard Worker
257*8fb009dcSAndroid Build Coastguard Worker	ext	v17.16b,v0.16b,v2.16b,#8		//Karatsuba post-processing
258*8fb009dcSAndroid Build Coastguard Worker	eor	v18.16b,v0.16b,v2.16b
259*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v17.16b
260*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v18.16b
261*8fb009dcSAndroid Build Coastguard Worker	pmull	v18.1q,v0.1d,v19.1d		//1st phase of reduction
262*8fb009dcSAndroid Build Coastguard Worker
263*8fb009dcSAndroid Build Coastguard Worker	ins	v2.d[0],v1.d[1]
264*8fb009dcSAndroid Build Coastguard Worker	ins	v1.d[1],v0.d[0]
265*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v1.16b,v18.16b
266*8fb009dcSAndroid Build Coastguard Worker
267*8fb009dcSAndroid Build Coastguard Worker	ext	v18.16b,v0.16b,v0.16b,#8		//2nd phase of reduction
268*8fb009dcSAndroid Build Coastguard Worker	pmull	v0.1q,v0.1d,v19.1d
269*8fb009dcSAndroid Build Coastguard Worker	eor	v18.16b,v18.16b,v2.16b
270*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v0.16b,v18.16b
271*8fb009dcSAndroid Build Coastguard Worker
272*8fb009dcSAndroid Build Coastguard Worker.Ldone_v8:
273*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__
274*8fb009dcSAndroid Build Coastguard Worker	rev64	v0.16b,v0.16b
275*8fb009dcSAndroid Build Coastguard Worker#endif
276*8fb009dcSAndroid Build Coastguard Worker	ext	v0.16b,v0.16b,v0.16b,#8
277*8fb009dcSAndroid Build Coastguard Worker	st1	{v0.2d},[x0]		//write out Xi
278*8fb009dcSAndroid Build Coastguard Worker
279*8fb009dcSAndroid Build Coastguard Worker	ret
280*8fb009dcSAndroid Build Coastguard Worker.size	gcm_ghash_v8,.-gcm_ghash_v8
281*8fb009dcSAndroid Build Coastguard Worker.type	gcm_ghash_v8_4x,%function
282*8fb009dcSAndroid Build Coastguard Worker.align	4
283*8fb009dcSAndroid Build Coastguard Workergcm_ghash_v8_4x:
284*8fb009dcSAndroid Build Coastguard Worker.Lgcm_ghash_v8_4x:
285*8fb009dcSAndroid Build Coastguard Worker	ld1	{v0.2d},[x0]		//load [rotated] Xi
286*8fb009dcSAndroid Build Coastguard Worker	ld1	{v20.2d,v21.2d,v22.2d},[x1],#48	//load twisted H, ..., H^2
287*8fb009dcSAndroid Build Coastguard Worker	movi	v19.16b,#0xe1
288*8fb009dcSAndroid Build Coastguard Worker	ld1	{v26.2d,v27.2d,v28.2d},[x1]	//load twisted H^3, ..., H^4
289*8fb009dcSAndroid Build Coastguard Worker	shl	v19.2d,v19.2d,#57		//compose 0xc2.0 constant
290*8fb009dcSAndroid Build Coastguard Worker
291*8fb009dcSAndroid Build Coastguard Worker	ld1	{v4.2d,v5.2d,v6.2d,v7.2d},[x2],#64
292*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__
293*8fb009dcSAndroid Build Coastguard Worker	rev64	v0.16b,v0.16b
294*8fb009dcSAndroid Build Coastguard Worker	rev64	v5.16b,v5.16b
295*8fb009dcSAndroid Build Coastguard Worker	rev64	v6.16b,v6.16b
296*8fb009dcSAndroid Build Coastguard Worker	rev64	v7.16b,v7.16b
297*8fb009dcSAndroid Build Coastguard Worker	rev64	v4.16b,v4.16b
298*8fb009dcSAndroid Build Coastguard Worker#endif
299*8fb009dcSAndroid Build Coastguard Worker	ext	v25.16b,v7.16b,v7.16b,#8
300*8fb009dcSAndroid Build Coastguard Worker	ext	v24.16b,v6.16b,v6.16b,#8
301*8fb009dcSAndroid Build Coastguard Worker	ext	v23.16b,v5.16b,v5.16b,#8
302*8fb009dcSAndroid Build Coastguard Worker
303*8fb009dcSAndroid Build Coastguard Worker	pmull	v29.1q,v20.1d,v25.1d		//H·Ii+3
304*8fb009dcSAndroid Build Coastguard Worker	eor	v7.16b,v7.16b,v25.16b
305*8fb009dcSAndroid Build Coastguard Worker	pmull2	v31.1q,v20.2d,v25.2d
306*8fb009dcSAndroid Build Coastguard Worker	pmull	v30.1q,v21.1d,v7.1d
307*8fb009dcSAndroid Build Coastguard Worker
308*8fb009dcSAndroid Build Coastguard Worker	pmull	v16.1q,v22.1d,v24.1d		//H^2·Ii+2
309*8fb009dcSAndroid Build Coastguard Worker	eor	v6.16b,v6.16b,v24.16b
310*8fb009dcSAndroid Build Coastguard Worker	pmull2	v24.1q,v22.2d,v24.2d
311*8fb009dcSAndroid Build Coastguard Worker	pmull2	v6.1q,v21.2d,v6.2d
312*8fb009dcSAndroid Build Coastguard Worker
313*8fb009dcSAndroid Build Coastguard Worker	eor	v29.16b,v29.16b,v16.16b
314*8fb009dcSAndroid Build Coastguard Worker	eor	v31.16b,v31.16b,v24.16b
315*8fb009dcSAndroid Build Coastguard Worker	eor	v30.16b,v30.16b,v6.16b
316*8fb009dcSAndroid Build Coastguard Worker
317*8fb009dcSAndroid Build Coastguard Worker	pmull	v7.1q,v26.1d,v23.1d		//H^3·Ii+1
318*8fb009dcSAndroid Build Coastguard Worker	eor	v5.16b,v5.16b,v23.16b
319*8fb009dcSAndroid Build Coastguard Worker	pmull2	v23.1q,v26.2d,v23.2d
320*8fb009dcSAndroid Build Coastguard Worker	pmull	v5.1q,v27.1d,v5.1d
321*8fb009dcSAndroid Build Coastguard Worker
322*8fb009dcSAndroid Build Coastguard Worker	eor	v29.16b,v29.16b,v7.16b
323*8fb009dcSAndroid Build Coastguard Worker	eor	v31.16b,v31.16b,v23.16b
324*8fb009dcSAndroid Build Coastguard Worker	eor	v30.16b,v30.16b,v5.16b
325*8fb009dcSAndroid Build Coastguard Worker
326*8fb009dcSAndroid Build Coastguard Worker	subs	x3,x3,#128
327*8fb009dcSAndroid Build Coastguard Worker	b.lo	.Ltail4x
328*8fb009dcSAndroid Build Coastguard Worker
329*8fb009dcSAndroid Build Coastguard Worker	b	.Loop4x
330*8fb009dcSAndroid Build Coastguard Worker
331*8fb009dcSAndroid Build Coastguard Worker.align	4
332*8fb009dcSAndroid Build Coastguard Worker.Loop4x:
333*8fb009dcSAndroid Build Coastguard Worker	eor	v16.16b,v4.16b,v0.16b
334*8fb009dcSAndroid Build Coastguard Worker	ld1	{v4.2d,v5.2d,v6.2d,v7.2d},[x2],#64
335*8fb009dcSAndroid Build Coastguard Worker	ext	v3.16b,v16.16b,v16.16b,#8
336*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__
337*8fb009dcSAndroid Build Coastguard Worker	rev64	v5.16b,v5.16b
338*8fb009dcSAndroid Build Coastguard Worker	rev64	v6.16b,v6.16b
339*8fb009dcSAndroid Build Coastguard Worker	rev64	v7.16b,v7.16b
340*8fb009dcSAndroid Build Coastguard Worker	rev64	v4.16b,v4.16b
341*8fb009dcSAndroid Build Coastguard Worker#endif
342*8fb009dcSAndroid Build Coastguard Worker
343*8fb009dcSAndroid Build Coastguard Worker	pmull	v0.1q,v28.1d,v3.1d		//H^4·(Xi+Ii)
344*8fb009dcSAndroid Build Coastguard Worker	eor	v16.16b,v16.16b,v3.16b
345*8fb009dcSAndroid Build Coastguard Worker	pmull2	v2.1q,v28.2d,v3.2d
346*8fb009dcSAndroid Build Coastguard Worker	ext	v25.16b,v7.16b,v7.16b,#8
347*8fb009dcSAndroid Build Coastguard Worker	pmull2	v1.1q,v27.2d,v16.2d
348*8fb009dcSAndroid Build Coastguard Worker
349*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v0.16b,v29.16b
350*8fb009dcSAndroid Build Coastguard Worker	eor	v2.16b,v2.16b,v31.16b
351*8fb009dcSAndroid Build Coastguard Worker	ext	v24.16b,v6.16b,v6.16b,#8
352*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v30.16b
353*8fb009dcSAndroid Build Coastguard Worker	ext	v23.16b,v5.16b,v5.16b,#8
354*8fb009dcSAndroid Build Coastguard Worker
355*8fb009dcSAndroid Build Coastguard Worker	ext	v17.16b,v0.16b,v2.16b,#8		//Karatsuba post-processing
356*8fb009dcSAndroid Build Coastguard Worker	eor	v18.16b,v0.16b,v2.16b
357*8fb009dcSAndroid Build Coastguard Worker	pmull	v29.1q,v20.1d,v25.1d		//H·Ii+3
358*8fb009dcSAndroid Build Coastguard Worker	eor	v7.16b,v7.16b,v25.16b
359*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v17.16b
360*8fb009dcSAndroid Build Coastguard Worker	pmull2	v31.1q,v20.2d,v25.2d
361*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v18.16b
362*8fb009dcSAndroid Build Coastguard Worker	pmull	v30.1q,v21.1d,v7.1d
363*8fb009dcSAndroid Build Coastguard Worker
364*8fb009dcSAndroid Build Coastguard Worker	pmull	v18.1q,v0.1d,v19.1d		//1st phase of reduction
365*8fb009dcSAndroid Build Coastguard Worker	ins	v2.d[0],v1.d[1]
366*8fb009dcSAndroid Build Coastguard Worker	ins	v1.d[1],v0.d[0]
367*8fb009dcSAndroid Build Coastguard Worker	pmull	v16.1q,v22.1d,v24.1d		//H^2·Ii+2
368*8fb009dcSAndroid Build Coastguard Worker	eor	v6.16b,v6.16b,v24.16b
369*8fb009dcSAndroid Build Coastguard Worker	pmull2	v24.1q,v22.2d,v24.2d
370*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v1.16b,v18.16b
371*8fb009dcSAndroid Build Coastguard Worker	pmull2	v6.1q,v21.2d,v6.2d
372*8fb009dcSAndroid Build Coastguard Worker
373*8fb009dcSAndroid Build Coastguard Worker	eor	v29.16b,v29.16b,v16.16b
374*8fb009dcSAndroid Build Coastguard Worker	eor	v31.16b,v31.16b,v24.16b
375*8fb009dcSAndroid Build Coastguard Worker	eor	v30.16b,v30.16b,v6.16b
376*8fb009dcSAndroid Build Coastguard Worker
377*8fb009dcSAndroid Build Coastguard Worker	ext	v18.16b,v0.16b,v0.16b,#8		//2nd phase of reduction
378*8fb009dcSAndroid Build Coastguard Worker	pmull	v0.1q,v0.1d,v19.1d
379*8fb009dcSAndroid Build Coastguard Worker	pmull	v7.1q,v26.1d,v23.1d		//H^3·Ii+1
380*8fb009dcSAndroid Build Coastguard Worker	eor	v5.16b,v5.16b,v23.16b
381*8fb009dcSAndroid Build Coastguard Worker	eor	v18.16b,v18.16b,v2.16b
382*8fb009dcSAndroid Build Coastguard Worker	pmull2	v23.1q,v26.2d,v23.2d
383*8fb009dcSAndroid Build Coastguard Worker	pmull	v5.1q,v27.1d,v5.1d
384*8fb009dcSAndroid Build Coastguard Worker
385*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v0.16b,v18.16b
386*8fb009dcSAndroid Build Coastguard Worker	eor	v29.16b,v29.16b,v7.16b
387*8fb009dcSAndroid Build Coastguard Worker	eor	v31.16b,v31.16b,v23.16b
388*8fb009dcSAndroid Build Coastguard Worker	ext	v0.16b,v0.16b,v0.16b,#8
389*8fb009dcSAndroid Build Coastguard Worker	eor	v30.16b,v30.16b,v5.16b
390*8fb009dcSAndroid Build Coastguard Worker
391*8fb009dcSAndroid Build Coastguard Worker	subs	x3,x3,#64
392*8fb009dcSAndroid Build Coastguard Worker	b.hs	.Loop4x
393*8fb009dcSAndroid Build Coastguard Worker
394*8fb009dcSAndroid Build Coastguard Worker.Ltail4x:
395*8fb009dcSAndroid Build Coastguard Worker	eor	v16.16b,v4.16b,v0.16b
396*8fb009dcSAndroid Build Coastguard Worker	ext	v3.16b,v16.16b,v16.16b,#8
397*8fb009dcSAndroid Build Coastguard Worker
398*8fb009dcSAndroid Build Coastguard Worker	pmull	v0.1q,v28.1d,v3.1d		//H^4·(Xi+Ii)
399*8fb009dcSAndroid Build Coastguard Worker	eor	v16.16b,v16.16b,v3.16b
400*8fb009dcSAndroid Build Coastguard Worker	pmull2	v2.1q,v28.2d,v3.2d
401*8fb009dcSAndroid Build Coastguard Worker	pmull2	v1.1q,v27.2d,v16.2d
402*8fb009dcSAndroid Build Coastguard Worker
403*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v0.16b,v29.16b
404*8fb009dcSAndroid Build Coastguard Worker	eor	v2.16b,v2.16b,v31.16b
405*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v30.16b
406*8fb009dcSAndroid Build Coastguard Worker
407*8fb009dcSAndroid Build Coastguard Worker	adds	x3,x3,#64
408*8fb009dcSAndroid Build Coastguard Worker	b.eq	.Ldone4x
409*8fb009dcSAndroid Build Coastguard Worker
410*8fb009dcSAndroid Build Coastguard Worker	cmp	x3,#32
411*8fb009dcSAndroid Build Coastguard Worker	b.lo	.Lone
412*8fb009dcSAndroid Build Coastguard Worker	b.eq	.Ltwo
413*8fb009dcSAndroid Build Coastguard Worker.Lthree:
414*8fb009dcSAndroid Build Coastguard Worker	ext	v17.16b,v0.16b,v2.16b,#8		//Karatsuba post-processing
415*8fb009dcSAndroid Build Coastguard Worker	eor	v18.16b,v0.16b,v2.16b
416*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v17.16b
417*8fb009dcSAndroid Build Coastguard Worker	ld1	{v4.2d,v5.2d,v6.2d},[x2]
418*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v18.16b
419*8fb009dcSAndroid Build Coastguard Worker#ifndef	__AARCH64EB__
420*8fb009dcSAndroid Build Coastguard Worker	rev64	v5.16b,v5.16b
421*8fb009dcSAndroid Build Coastguard Worker	rev64	v6.16b,v6.16b
422*8fb009dcSAndroid Build Coastguard Worker	rev64	v4.16b,v4.16b
423*8fb009dcSAndroid Build Coastguard Worker#endif
424*8fb009dcSAndroid Build Coastguard Worker
425*8fb009dcSAndroid Build Coastguard Worker	pmull	v18.1q,v0.1d,v19.1d		//1st phase of reduction
426*8fb009dcSAndroid Build Coastguard Worker	ins	v2.d[0],v1.d[1]
427*8fb009dcSAndroid Build Coastguard Worker	ins	v1.d[1],v0.d[0]
428*8fb009dcSAndroid Build Coastguard Worker	ext	v24.16b,v6.16b,v6.16b,#8
429*8fb009dcSAndroid Build Coastguard Worker	ext	v23.16b,v5.16b,v5.16b,#8
430*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v1.16b,v18.16b
431*8fb009dcSAndroid Build Coastguard Worker
432*8fb009dcSAndroid Build Coastguard Worker	pmull	v29.1q,v20.1d,v24.1d		//H·Ii+2
433*8fb009dcSAndroid Build Coastguard Worker	eor	v6.16b,v6.16b,v24.16b
434*8fb009dcSAndroid Build Coastguard Worker
435*8fb009dcSAndroid Build Coastguard Worker	ext	v18.16b,v0.16b,v0.16b,#8		//2nd phase of reduction
436*8fb009dcSAndroid Build Coastguard Worker	pmull	v0.1q,v0.1d,v19.1d
437*8fb009dcSAndroid Build Coastguard Worker	eor	v18.16b,v18.16b,v2.16b
438*8fb009dcSAndroid Build Coastguard Worker	pmull2	v31.1q,v20.2d,v24.2d
439*8fb009dcSAndroid Build Coastguard Worker	pmull	v30.1q,v21.1d,v6.1d
440*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v0.16b,v18.16b
441*8fb009dcSAndroid Build Coastguard Worker	pmull	v7.1q,v22.1d,v23.1d		//H^2·Ii+1
442*8fb009dcSAndroid Build Coastguard Worker	eor	v5.16b,v5.16b,v23.16b
443*8fb009dcSAndroid Build Coastguard Worker	ext	v0.16b,v0.16b,v0.16b,#8
444*8fb009dcSAndroid Build Coastguard Worker
445*8fb009dcSAndroid Build Coastguard Worker	pmull2	v23.1q,v22.2d,v23.2d
446*8fb009dcSAndroid Build Coastguard Worker	eor	v16.16b,v4.16b,v0.16b
447*8fb009dcSAndroid Build Coastguard Worker	pmull2	v5.1q,v21.2d,v5.2d
448*8fb009dcSAndroid Build Coastguard Worker	ext	v3.16b,v16.16b,v16.16b,#8
449*8fb009dcSAndroid Build Coastguard Worker
450*8fb009dcSAndroid Build Coastguard Worker	eor	v29.16b,v29.16b,v7.16b
451*8fb009dcSAndroid Build Coastguard Worker	eor	v31.16b,v31.16b,v23.16b
452*8fb009dcSAndroid Build Coastguard Worker	eor	v30.16b,v30.16b,v5.16b
453*8fb009dcSAndroid Build Coastguard Worker
454*8fb009dcSAndroid Build Coastguard Worker	pmull	v0.1q,v26.1d,v3.1d		//H^3·(Xi+Ii)
455*8fb009dcSAndroid Build Coastguard Worker	eor	v16.16b,v16.16b,v3.16b
456*8fb009dcSAndroid Build Coastguard Worker	pmull2	v2.1q,v26.2d,v3.2d
457*8fb009dcSAndroid Build Coastguard Worker	pmull	v1.1q,v27.1d,v16.1d
458*8fb009dcSAndroid Build Coastguard Worker
459*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v0.16b,v29.16b
460*8fb009dcSAndroid Build Coastguard Worker	eor	v2.16b,v2.16b,v31.16b
461*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v30.16b
462*8fb009dcSAndroid Build Coastguard Worker	b	.Ldone4x
463*8fb009dcSAndroid Build Coastguard Worker
464*8fb009dcSAndroid Build Coastguard Worker.align	4
465*8fb009dcSAndroid Build Coastguard Worker.Ltwo:
466*8fb009dcSAndroid Build Coastguard Worker	ext	v17.16b,v0.16b,v2.16b,#8		//Karatsuba post-processing
467*8fb009dcSAndroid Build Coastguard Worker	eor	v18.16b,v0.16b,v2.16b
468*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v17.16b
469*8fb009dcSAndroid Build Coastguard Worker	ld1	{v4.2d,v5.2d},[x2]
470*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v18.16b
471*8fb009dcSAndroid Build Coastguard Worker#ifndef	__AARCH64EB__
472*8fb009dcSAndroid Build Coastguard Worker	rev64	v5.16b,v5.16b
473*8fb009dcSAndroid Build Coastguard Worker	rev64	v4.16b,v4.16b
474*8fb009dcSAndroid Build Coastguard Worker#endif
475*8fb009dcSAndroid Build Coastguard Worker
476*8fb009dcSAndroid Build Coastguard Worker	pmull	v18.1q,v0.1d,v19.1d		//1st phase of reduction
477*8fb009dcSAndroid Build Coastguard Worker	ins	v2.d[0],v1.d[1]
478*8fb009dcSAndroid Build Coastguard Worker	ins	v1.d[1],v0.d[0]
479*8fb009dcSAndroid Build Coastguard Worker	ext	v23.16b,v5.16b,v5.16b,#8
480*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v1.16b,v18.16b
481*8fb009dcSAndroid Build Coastguard Worker
482*8fb009dcSAndroid Build Coastguard Worker	ext	v18.16b,v0.16b,v0.16b,#8		//2nd phase of reduction
483*8fb009dcSAndroid Build Coastguard Worker	pmull	v0.1q,v0.1d,v19.1d
484*8fb009dcSAndroid Build Coastguard Worker	eor	v18.16b,v18.16b,v2.16b
485*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v0.16b,v18.16b
486*8fb009dcSAndroid Build Coastguard Worker	ext	v0.16b,v0.16b,v0.16b,#8
487*8fb009dcSAndroid Build Coastguard Worker
488*8fb009dcSAndroid Build Coastguard Worker	pmull	v29.1q,v20.1d,v23.1d		//H·Ii+1
489*8fb009dcSAndroid Build Coastguard Worker	eor	v5.16b,v5.16b,v23.16b
490*8fb009dcSAndroid Build Coastguard Worker
491*8fb009dcSAndroid Build Coastguard Worker	eor	v16.16b,v4.16b,v0.16b
492*8fb009dcSAndroid Build Coastguard Worker	ext	v3.16b,v16.16b,v16.16b,#8
493*8fb009dcSAndroid Build Coastguard Worker
494*8fb009dcSAndroid Build Coastguard Worker	pmull2	v31.1q,v20.2d,v23.2d
495*8fb009dcSAndroid Build Coastguard Worker	pmull	v30.1q,v21.1d,v5.1d
496*8fb009dcSAndroid Build Coastguard Worker
497*8fb009dcSAndroid Build Coastguard Worker	pmull	v0.1q,v22.1d,v3.1d		//H^2·(Xi+Ii)
498*8fb009dcSAndroid Build Coastguard Worker	eor	v16.16b,v16.16b,v3.16b
499*8fb009dcSAndroid Build Coastguard Worker	pmull2	v2.1q,v22.2d,v3.2d
500*8fb009dcSAndroid Build Coastguard Worker	pmull2	v1.1q,v21.2d,v16.2d
501*8fb009dcSAndroid Build Coastguard Worker
502*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v0.16b,v29.16b
503*8fb009dcSAndroid Build Coastguard Worker	eor	v2.16b,v2.16b,v31.16b
504*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v30.16b
505*8fb009dcSAndroid Build Coastguard Worker	b	.Ldone4x
506*8fb009dcSAndroid Build Coastguard Worker
507*8fb009dcSAndroid Build Coastguard Worker.align	4
508*8fb009dcSAndroid Build Coastguard Worker.Lone:
509*8fb009dcSAndroid Build Coastguard Worker	ext	v17.16b,v0.16b,v2.16b,#8		//Karatsuba post-processing
510*8fb009dcSAndroid Build Coastguard Worker	eor	v18.16b,v0.16b,v2.16b
511*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v17.16b
512*8fb009dcSAndroid Build Coastguard Worker	ld1	{v4.2d},[x2]
513*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v18.16b
514*8fb009dcSAndroid Build Coastguard Worker#ifndef	__AARCH64EB__
515*8fb009dcSAndroid Build Coastguard Worker	rev64	v4.16b,v4.16b
516*8fb009dcSAndroid Build Coastguard Worker#endif
517*8fb009dcSAndroid Build Coastguard Worker
518*8fb009dcSAndroid Build Coastguard Worker	pmull	v18.1q,v0.1d,v19.1d		//1st phase of reduction
519*8fb009dcSAndroid Build Coastguard Worker	ins	v2.d[0],v1.d[1]
520*8fb009dcSAndroid Build Coastguard Worker	ins	v1.d[1],v0.d[0]
521*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v1.16b,v18.16b
522*8fb009dcSAndroid Build Coastguard Worker
523*8fb009dcSAndroid Build Coastguard Worker	ext	v18.16b,v0.16b,v0.16b,#8		//2nd phase of reduction
524*8fb009dcSAndroid Build Coastguard Worker	pmull	v0.1q,v0.1d,v19.1d
525*8fb009dcSAndroid Build Coastguard Worker	eor	v18.16b,v18.16b,v2.16b
526*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v0.16b,v18.16b
527*8fb009dcSAndroid Build Coastguard Worker	ext	v0.16b,v0.16b,v0.16b,#8
528*8fb009dcSAndroid Build Coastguard Worker
529*8fb009dcSAndroid Build Coastguard Worker	eor	v16.16b,v4.16b,v0.16b
530*8fb009dcSAndroid Build Coastguard Worker	ext	v3.16b,v16.16b,v16.16b,#8
531*8fb009dcSAndroid Build Coastguard Worker
532*8fb009dcSAndroid Build Coastguard Worker	pmull	v0.1q,v20.1d,v3.1d
533*8fb009dcSAndroid Build Coastguard Worker	eor	v16.16b,v16.16b,v3.16b
534*8fb009dcSAndroid Build Coastguard Worker	pmull2	v2.1q,v20.2d,v3.2d
535*8fb009dcSAndroid Build Coastguard Worker	pmull	v1.1q,v21.1d,v16.1d
536*8fb009dcSAndroid Build Coastguard Worker
537*8fb009dcSAndroid Build Coastguard Worker.Ldone4x:
538*8fb009dcSAndroid Build Coastguard Worker	ext	v17.16b,v0.16b,v2.16b,#8		//Karatsuba post-processing
539*8fb009dcSAndroid Build Coastguard Worker	eor	v18.16b,v0.16b,v2.16b
540*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v17.16b
541*8fb009dcSAndroid Build Coastguard Worker	eor	v1.16b,v1.16b,v18.16b
542*8fb009dcSAndroid Build Coastguard Worker
543*8fb009dcSAndroid Build Coastguard Worker	pmull	v18.1q,v0.1d,v19.1d		//1st phase of reduction
544*8fb009dcSAndroid Build Coastguard Worker	ins	v2.d[0],v1.d[1]
545*8fb009dcSAndroid Build Coastguard Worker	ins	v1.d[1],v0.d[0]
546*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v1.16b,v18.16b
547*8fb009dcSAndroid Build Coastguard Worker
548*8fb009dcSAndroid Build Coastguard Worker	ext	v18.16b,v0.16b,v0.16b,#8		//2nd phase of reduction
549*8fb009dcSAndroid Build Coastguard Worker	pmull	v0.1q,v0.1d,v19.1d
550*8fb009dcSAndroid Build Coastguard Worker	eor	v18.16b,v18.16b,v2.16b
551*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v0.16b,v18.16b
552*8fb009dcSAndroid Build Coastguard Worker	ext	v0.16b,v0.16b,v0.16b,#8
553*8fb009dcSAndroid Build Coastguard Worker
554*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__
555*8fb009dcSAndroid Build Coastguard Worker	rev64	v0.16b,v0.16b
556*8fb009dcSAndroid Build Coastguard Worker#endif
557*8fb009dcSAndroid Build Coastguard Worker	st1	{v0.2d},[x0]		//write out Xi
558*8fb009dcSAndroid Build Coastguard Worker
559*8fb009dcSAndroid Build Coastguard Worker	ret
560*8fb009dcSAndroid Build Coastguard Worker.size	gcm_ghash_v8_4x,.-gcm_ghash_v8_4x
561*8fb009dcSAndroid Build Coastguard Worker.byte	71,72,65,83,72,32,102,111,114,32,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
562*8fb009dcSAndroid Build Coastguard Worker.align	2
563*8fb009dcSAndroid Build Coastguard Worker.align	2
564*8fb009dcSAndroid Build Coastguard Worker#endif
565*8fb009dcSAndroid Build Coastguard Worker#endif  // !OPENSSL_NO_ASM && defined(OPENSSL_AARCH64) && defined(__ELF__)
566