xref: /aosp_15_r20/external/boringssl/src/gen/bcm/aesv8-armv8-win.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(_WIN32)
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.section	.rodata
13*8fb009dcSAndroid Build Coastguard Worker.align	5
14*8fb009dcSAndroid Build Coastguard WorkerLrcon:
15*8fb009dcSAndroid Build Coastguard Worker.long	0x01,0x01,0x01,0x01
16*8fb009dcSAndroid Build Coastguard Worker.long	0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d,0x0c0f0e0d	// rotate-n-splat
17*8fb009dcSAndroid Build Coastguard Worker.long	0x1b,0x1b,0x1b,0x1b
18*8fb009dcSAndroid Build Coastguard Worker
19*8fb009dcSAndroid Build Coastguard Worker.text
20*8fb009dcSAndroid Build Coastguard Worker
21*8fb009dcSAndroid Build Coastguard Worker.globl	aes_hw_set_encrypt_key
22*8fb009dcSAndroid Build Coastguard Worker
23*8fb009dcSAndroid Build Coastguard Worker.def aes_hw_set_encrypt_key
24*8fb009dcSAndroid Build Coastguard Worker   .type 32
25*8fb009dcSAndroid Build Coastguard Worker.endef
26*8fb009dcSAndroid Build Coastguard Worker.align	5
27*8fb009dcSAndroid Build Coastguard Workeraes_hw_set_encrypt_key:
28*8fb009dcSAndroid Build Coastguard WorkerLenc_key:
29*8fb009dcSAndroid Build Coastguard Worker	// Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later.
30*8fb009dcSAndroid Build Coastguard Worker	AARCH64_VALID_CALL_TARGET
31*8fb009dcSAndroid Build Coastguard Worker	stp	x29,x30,[sp,#-16]!
32*8fb009dcSAndroid Build Coastguard Worker	add	x29,sp,#0
33*8fb009dcSAndroid Build Coastguard Worker	mov	x3,#-2
34*8fb009dcSAndroid Build Coastguard Worker	cmp	w1,#128
35*8fb009dcSAndroid Build Coastguard Worker	b.lt	Lenc_key_abort
36*8fb009dcSAndroid Build Coastguard Worker	cmp	w1,#256
37*8fb009dcSAndroid Build Coastguard Worker	b.gt	Lenc_key_abort
38*8fb009dcSAndroid Build Coastguard Worker	tst	w1,#0x3f
39*8fb009dcSAndroid Build Coastguard Worker	b.ne	Lenc_key_abort
40*8fb009dcSAndroid Build Coastguard Worker
41*8fb009dcSAndroid Build Coastguard Worker	adrp	x3,Lrcon
42*8fb009dcSAndroid Build Coastguard Worker	add	x3,x3,:lo12:Lrcon
43*8fb009dcSAndroid Build Coastguard Worker	cmp	w1,#192
44*8fb009dcSAndroid Build Coastguard Worker
45*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v0.16b,v0.16b
46*8fb009dcSAndroid Build Coastguard Worker	ld1	{v3.16b},[x0],#16
47*8fb009dcSAndroid Build Coastguard Worker	mov	w1,#8		// reuse w1
48*8fb009dcSAndroid Build Coastguard Worker	ld1	{v1.4s,v2.4s},[x3],#32
49*8fb009dcSAndroid Build Coastguard Worker
50*8fb009dcSAndroid Build Coastguard Worker	b.lt	Loop128
51*8fb009dcSAndroid Build Coastguard Worker	b.eq	L192
52*8fb009dcSAndroid Build Coastguard Worker	b	L256
53*8fb009dcSAndroid Build Coastguard Worker
54*8fb009dcSAndroid Build Coastguard Worker.align	4
55*8fb009dcSAndroid Build Coastguard WorkerLoop128:
56*8fb009dcSAndroid Build Coastguard Worker	tbl	v6.16b,{v3.16b},v2.16b
57*8fb009dcSAndroid Build Coastguard Worker	ext	v5.16b,v0.16b,v3.16b,#12
58*8fb009dcSAndroid Build Coastguard Worker	st1	{v3.4s},[x2],#16
59*8fb009dcSAndroid Build Coastguard Worker	aese	v6.16b,v0.16b
60*8fb009dcSAndroid Build Coastguard Worker	subs	w1,w1,#1
61*8fb009dcSAndroid Build Coastguard Worker
62*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v5.16b
63*8fb009dcSAndroid Build Coastguard Worker	ext	v5.16b,v0.16b,v5.16b,#12
64*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v5.16b
65*8fb009dcSAndroid Build Coastguard Worker	ext	v5.16b,v0.16b,v5.16b,#12
66*8fb009dcSAndroid Build Coastguard Worker	eor	v6.16b,v6.16b,v1.16b
67*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v5.16b
68*8fb009dcSAndroid Build Coastguard Worker	shl	v1.16b,v1.16b,#1
69*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v6.16b
70*8fb009dcSAndroid Build Coastguard Worker	b.ne	Loop128
71*8fb009dcSAndroid Build Coastguard Worker
72*8fb009dcSAndroid Build Coastguard Worker	ld1	{v1.4s},[x3]
73*8fb009dcSAndroid Build Coastguard Worker
74*8fb009dcSAndroid Build Coastguard Worker	tbl	v6.16b,{v3.16b},v2.16b
75*8fb009dcSAndroid Build Coastguard Worker	ext	v5.16b,v0.16b,v3.16b,#12
76*8fb009dcSAndroid Build Coastguard Worker	st1	{v3.4s},[x2],#16
77*8fb009dcSAndroid Build Coastguard Worker	aese	v6.16b,v0.16b
78*8fb009dcSAndroid Build Coastguard Worker
79*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v5.16b
80*8fb009dcSAndroid Build Coastguard Worker	ext	v5.16b,v0.16b,v5.16b,#12
81*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v5.16b
82*8fb009dcSAndroid Build Coastguard Worker	ext	v5.16b,v0.16b,v5.16b,#12
83*8fb009dcSAndroid Build Coastguard Worker	eor	v6.16b,v6.16b,v1.16b
84*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v5.16b
85*8fb009dcSAndroid Build Coastguard Worker	shl	v1.16b,v1.16b,#1
86*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v6.16b
87*8fb009dcSAndroid Build Coastguard Worker
88*8fb009dcSAndroid Build Coastguard Worker	tbl	v6.16b,{v3.16b},v2.16b
89*8fb009dcSAndroid Build Coastguard Worker	ext	v5.16b,v0.16b,v3.16b,#12
90*8fb009dcSAndroid Build Coastguard Worker	st1	{v3.4s},[x2],#16
91*8fb009dcSAndroid Build Coastguard Worker	aese	v6.16b,v0.16b
92*8fb009dcSAndroid Build Coastguard Worker
93*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v5.16b
94*8fb009dcSAndroid Build Coastguard Worker	ext	v5.16b,v0.16b,v5.16b,#12
95*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v5.16b
96*8fb009dcSAndroid Build Coastguard Worker	ext	v5.16b,v0.16b,v5.16b,#12
97*8fb009dcSAndroid Build Coastguard Worker	eor	v6.16b,v6.16b,v1.16b
98*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v5.16b
99*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v6.16b
100*8fb009dcSAndroid Build Coastguard Worker	st1	{v3.4s},[x2]
101*8fb009dcSAndroid Build Coastguard Worker	add	x2,x2,#0x50
102*8fb009dcSAndroid Build Coastguard Worker
103*8fb009dcSAndroid Build Coastguard Worker	mov	w12,#10
104*8fb009dcSAndroid Build Coastguard Worker	b	Ldone
105*8fb009dcSAndroid Build Coastguard Worker
106*8fb009dcSAndroid Build Coastguard Worker.align	4
107*8fb009dcSAndroid Build Coastguard WorkerL192:
108*8fb009dcSAndroid Build Coastguard Worker	ld1	{v4.8b},[x0],#8
109*8fb009dcSAndroid Build Coastguard Worker	movi	v6.16b,#8			// borrow v6.16b
110*8fb009dcSAndroid Build Coastguard Worker	st1	{v3.4s},[x2],#16
111*8fb009dcSAndroid Build Coastguard Worker	sub	v2.16b,v2.16b,v6.16b	// adjust the mask
112*8fb009dcSAndroid Build Coastguard Worker
113*8fb009dcSAndroid Build Coastguard WorkerLoop192:
114*8fb009dcSAndroid Build Coastguard Worker	tbl	v6.16b,{v4.16b},v2.16b
115*8fb009dcSAndroid Build Coastguard Worker	ext	v5.16b,v0.16b,v3.16b,#12
116*8fb009dcSAndroid Build Coastguard Worker	st1	{v4.8b},[x2],#8
117*8fb009dcSAndroid Build Coastguard Worker	aese	v6.16b,v0.16b
118*8fb009dcSAndroid Build Coastguard Worker	subs	w1,w1,#1
119*8fb009dcSAndroid Build Coastguard Worker
120*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v5.16b
121*8fb009dcSAndroid Build Coastguard Worker	ext	v5.16b,v0.16b,v5.16b,#12
122*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v5.16b
123*8fb009dcSAndroid Build Coastguard Worker	ext	v5.16b,v0.16b,v5.16b,#12
124*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v5.16b
125*8fb009dcSAndroid Build Coastguard Worker
126*8fb009dcSAndroid Build Coastguard Worker	dup	v5.4s,v3.s[3]
127*8fb009dcSAndroid Build Coastguard Worker	eor	v5.16b,v5.16b,v4.16b
128*8fb009dcSAndroid Build Coastguard Worker	eor	v6.16b,v6.16b,v1.16b
129*8fb009dcSAndroid Build Coastguard Worker	ext	v4.16b,v0.16b,v4.16b,#12
130*8fb009dcSAndroid Build Coastguard Worker	shl	v1.16b,v1.16b,#1
131*8fb009dcSAndroid Build Coastguard Worker	eor	v4.16b,v4.16b,v5.16b
132*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v6.16b
133*8fb009dcSAndroid Build Coastguard Worker	eor	v4.16b,v4.16b,v6.16b
134*8fb009dcSAndroid Build Coastguard Worker	st1	{v3.4s},[x2],#16
135*8fb009dcSAndroid Build Coastguard Worker	b.ne	Loop192
136*8fb009dcSAndroid Build Coastguard Worker
137*8fb009dcSAndroid Build Coastguard Worker	mov	w12,#12
138*8fb009dcSAndroid Build Coastguard Worker	add	x2,x2,#0x20
139*8fb009dcSAndroid Build Coastguard Worker	b	Ldone
140*8fb009dcSAndroid Build Coastguard Worker
141*8fb009dcSAndroid Build Coastguard Worker.align	4
142*8fb009dcSAndroid Build Coastguard WorkerL256:
143*8fb009dcSAndroid Build Coastguard Worker	ld1	{v4.16b},[x0]
144*8fb009dcSAndroid Build Coastguard Worker	mov	w1,#7
145*8fb009dcSAndroid Build Coastguard Worker	mov	w12,#14
146*8fb009dcSAndroid Build Coastguard Worker	st1	{v3.4s},[x2],#16
147*8fb009dcSAndroid Build Coastguard Worker
148*8fb009dcSAndroid Build Coastguard WorkerLoop256:
149*8fb009dcSAndroid Build Coastguard Worker	tbl	v6.16b,{v4.16b},v2.16b
150*8fb009dcSAndroid Build Coastguard Worker	ext	v5.16b,v0.16b,v3.16b,#12
151*8fb009dcSAndroid Build Coastguard Worker	st1	{v4.4s},[x2],#16
152*8fb009dcSAndroid Build Coastguard Worker	aese	v6.16b,v0.16b
153*8fb009dcSAndroid Build Coastguard Worker	subs	w1,w1,#1
154*8fb009dcSAndroid Build Coastguard Worker
155*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v5.16b
156*8fb009dcSAndroid Build Coastguard Worker	ext	v5.16b,v0.16b,v5.16b,#12
157*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v5.16b
158*8fb009dcSAndroid Build Coastguard Worker	ext	v5.16b,v0.16b,v5.16b,#12
159*8fb009dcSAndroid Build Coastguard Worker	eor	v6.16b,v6.16b,v1.16b
160*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v5.16b
161*8fb009dcSAndroid Build Coastguard Worker	shl	v1.16b,v1.16b,#1
162*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v6.16b
163*8fb009dcSAndroid Build Coastguard Worker	st1	{v3.4s},[x2],#16
164*8fb009dcSAndroid Build Coastguard Worker	b.eq	Ldone
165*8fb009dcSAndroid Build Coastguard Worker
166*8fb009dcSAndroid Build Coastguard Worker	dup	v6.4s,v3.s[3]		// just splat
167*8fb009dcSAndroid Build Coastguard Worker	ext	v5.16b,v0.16b,v4.16b,#12
168*8fb009dcSAndroid Build Coastguard Worker	aese	v6.16b,v0.16b
169*8fb009dcSAndroid Build Coastguard Worker
170*8fb009dcSAndroid Build Coastguard Worker	eor	v4.16b,v4.16b,v5.16b
171*8fb009dcSAndroid Build Coastguard Worker	ext	v5.16b,v0.16b,v5.16b,#12
172*8fb009dcSAndroid Build Coastguard Worker	eor	v4.16b,v4.16b,v5.16b
173*8fb009dcSAndroid Build Coastguard Worker	ext	v5.16b,v0.16b,v5.16b,#12
174*8fb009dcSAndroid Build Coastguard Worker	eor	v4.16b,v4.16b,v5.16b
175*8fb009dcSAndroid Build Coastguard Worker
176*8fb009dcSAndroid Build Coastguard Worker	eor	v4.16b,v4.16b,v6.16b
177*8fb009dcSAndroid Build Coastguard Worker	b	Loop256
178*8fb009dcSAndroid Build Coastguard Worker
179*8fb009dcSAndroid Build Coastguard WorkerLdone:
180*8fb009dcSAndroid Build Coastguard Worker	str	w12,[x2]
181*8fb009dcSAndroid Build Coastguard Worker	mov	x3,#0
182*8fb009dcSAndroid Build Coastguard Worker
183*8fb009dcSAndroid Build Coastguard WorkerLenc_key_abort:
184*8fb009dcSAndroid Build Coastguard Worker	mov	x0,x3			// return value
185*8fb009dcSAndroid Build Coastguard Worker	ldr	x29,[sp],#16
186*8fb009dcSAndroid Build Coastguard Worker	ret
187*8fb009dcSAndroid Build Coastguard Worker
188*8fb009dcSAndroid Build Coastguard Worker
189*8fb009dcSAndroid Build Coastguard Worker.globl	aes_hw_set_decrypt_key
190*8fb009dcSAndroid Build Coastguard Worker
191*8fb009dcSAndroid Build Coastguard Worker.def aes_hw_set_decrypt_key
192*8fb009dcSAndroid Build Coastguard Worker   .type 32
193*8fb009dcSAndroid Build Coastguard Worker.endef
194*8fb009dcSAndroid Build Coastguard Worker.align	5
195*8fb009dcSAndroid Build Coastguard Workeraes_hw_set_decrypt_key:
196*8fb009dcSAndroid Build Coastguard Worker	AARCH64_SIGN_LINK_REGISTER
197*8fb009dcSAndroid Build Coastguard Worker	stp	x29,x30,[sp,#-16]!
198*8fb009dcSAndroid Build Coastguard Worker	add	x29,sp,#0
199*8fb009dcSAndroid Build Coastguard Worker	bl	Lenc_key
200*8fb009dcSAndroid Build Coastguard Worker
201*8fb009dcSAndroid Build Coastguard Worker	cmp	x0,#0
202*8fb009dcSAndroid Build Coastguard Worker	b.ne	Ldec_key_abort
203*8fb009dcSAndroid Build Coastguard Worker
204*8fb009dcSAndroid Build Coastguard Worker	sub	x2,x2,#240		// restore original x2
205*8fb009dcSAndroid Build Coastguard Worker	mov	x4,#-16
206*8fb009dcSAndroid Build Coastguard Worker	add	x0,x2,x12,lsl#4	// end of key schedule
207*8fb009dcSAndroid Build Coastguard Worker
208*8fb009dcSAndroid Build Coastguard Worker	ld1	{v0.4s},[x2]
209*8fb009dcSAndroid Build Coastguard Worker	ld1	{v1.4s},[x0]
210*8fb009dcSAndroid Build Coastguard Worker	st1	{v0.4s},[x0],x4
211*8fb009dcSAndroid Build Coastguard Worker	st1	{v1.4s},[x2],#16
212*8fb009dcSAndroid Build Coastguard Worker
213*8fb009dcSAndroid Build Coastguard WorkerLoop_imc:
214*8fb009dcSAndroid Build Coastguard Worker	ld1	{v0.4s},[x2]
215*8fb009dcSAndroid Build Coastguard Worker	ld1	{v1.4s},[x0]
216*8fb009dcSAndroid Build Coastguard Worker	aesimc	v0.16b,v0.16b
217*8fb009dcSAndroid Build Coastguard Worker	aesimc	v1.16b,v1.16b
218*8fb009dcSAndroid Build Coastguard Worker	st1	{v0.4s},[x0],x4
219*8fb009dcSAndroid Build Coastguard Worker	st1	{v1.4s},[x2],#16
220*8fb009dcSAndroid Build Coastguard Worker	cmp	x0,x2
221*8fb009dcSAndroid Build Coastguard Worker	b.hi	Loop_imc
222*8fb009dcSAndroid Build Coastguard Worker
223*8fb009dcSAndroid Build Coastguard Worker	ld1	{v0.4s},[x2]
224*8fb009dcSAndroid Build Coastguard Worker	aesimc	v0.16b,v0.16b
225*8fb009dcSAndroid Build Coastguard Worker	st1	{v0.4s},[x0]
226*8fb009dcSAndroid Build Coastguard Worker
227*8fb009dcSAndroid Build Coastguard Worker	eor	x0,x0,x0		// return value
228*8fb009dcSAndroid Build Coastguard WorkerLdec_key_abort:
229*8fb009dcSAndroid Build Coastguard Worker	ldp	x29,x30,[sp],#16
230*8fb009dcSAndroid Build Coastguard Worker	AARCH64_VALIDATE_LINK_REGISTER
231*8fb009dcSAndroid Build Coastguard Worker	ret
232*8fb009dcSAndroid Build Coastguard Worker
233*8fb009dcSAndroid Build Coastguard Worker.globl	aes_hw_encrypt
234*8fb009dcSAndroid Build Coastguard Worker
235*8fb009dcSAndroid Build Coastguard Worker.def aes_hw_encrypt
236*8fb009dcSAndroid Build Coastguard Worker   .type 32
237*8fb009dcSAndroid Build Coastguard Worker.endef
238*8fb009dcSAndroid Build Coastguard Worker.align	5
239*8fb009dcSAndroid Build Coastguard Workeraes_hw_encrypt:
240*8fb009dcSAndroid Build Coastguard Worker	AARCH64_VALID_CALL_TARGET
241*8fb009dcSAndroid Build Coastguard Worker	ldr	w3,[x2,#240]
242*8fb009dcSAndroid Build Coastguard Worker	ld1	{v0.4s},[x2],#16
243*8fb009dcSAndroid Build Coastguard Worker	ld1	{v2.16b},[x0]
244*8fb009dcSAndroid Build Coastguard Worker	sub	w3,w3,#2
245*8fb009dcSAndroid Build Coastguard Worker	ld1	{v1.4s},[x2],#16
246*8fb009dcSAndroid Build Coastguard Worker
247*8fb009dcSAndroid Build Coastguard WorkerLoop_enc:
248*8fb009dcSAndroid Build Coastguard Worker	aese	v2.16b,v0.16b
249*8fb009dcSAndroid Build Coastguard Worker	aesmc	v2.16b,v2.16b
250*8fb009dcSAndroid Build Coastguard Worker	ld1	{v0.4s},[x2],#16
251*8fb009dcSAndroid Build Coastguard Worker	subs	w3,w3,#2
252*8fb009dcSAndroid Build Coastguard Worker	aese	v2.16b,v1.16b
253*8fb009dcSAndroid Build Coastguard Worker	aesmc	v2.16b,v2.16b
254*8fb009dcSAndroid Build Coastguard Worker	ld1	{v1.4s},[x2],#16
255*8fb009dcSAndroid Build Coastguard Worker	b.gt	Loop_enc
256*8fb009dcSAndroid Build Coastguard Worker
257*8fb009dcSAndroid Build Coastguard Worker	aese	v2.16b,v0.16b
258*8fb009dcSAndroid Build Coastguard Worker	aesmc	v2.16b,v2.16b
259*8fb009dcSAndroid Build Coastguard Worker	ld1	{v0.4s},[x2]
260*8fb009dcSAndroid Build Coastguard Worker	aese	v2.16b,v1.16b
261*8fb009dcSAndroid Build Coastguard Worker	eor	v2.16b,v2.16b,v0.16b
262*8fb009dcSAndroid Build Coastguard Worker
263*8fb009dcSAndroid Build Coastguard Worker	st1	{v2.16b},[x1]
264*8fb009dcSAndroid Build Coastguard Worker	ret
265*8fb009dcSAndroid Build Coastguard Worker
266*8fb009dcSAndroid Build Coastguard Worker.globl	aes_hw_decrypt
267*8fb009dcSAndroid Build Coastguard Worker
268*8fb009dcSAndroid Build Coastguard Worker.def aes_hw_decrypt
269*8fb009dcSAndroid Build Coastguard Worker   .type 32
270*8fb009dcSAndroid Build Coastguard Worker.endef
271*8fb009dcSAndroid Build Coastguard Worker.align	5
272*8fb009dcSAndroid Build Coastguard Workeraes_hw_decrypt:
273*8fb009dcSAndroid Build Coastguard Worker	AARCH64_VALID_CALL_TARGET
274*8fb009dcSAndroid Build Coastguard Worker	ldr	w3,[x2,#240]
275*8fb009dcSAndroid Build Coastguard Worker	ld1	{v0.4s},[x2],#16
276*8fb009dcSAndroid Build Coastguard Worker	ld1	{v2.16b},[x0]
277*8fb009dcSAndroid Build Coastguard Worker	sub	w3,w3,#2
278*8fb009dcSAndroid Build Coastguard Worker	ld1	{v1.4s},[x2],#16
279*8fb009dcSAndroid Build Coastguard Worker
280*8fb009dcSAndroid Build Coastguard WorkerLoop_dec:
281*8fb009dcSAndroid Build Coastguard Worker	aesd	v2.16b,v0.16b
282*8fb009dcSAndroid Build Coastguard Worker	aesimc	v2.16b,v2.16b
283*8fb009dcSAndroid Build Coastguard Worker	ld1	{v0.4s},[x2],#16
284*8fb009dcSAndroid Build Coastguard Worker	subs	w3,w3,#2
285*8fb009dcSAndroid Build Coastguard Worker	aesd	v2.16b,v1.16b
286*8fb009dcSAndroid Build Coastguard Worker	aesimc	v2.16b,v2.16b
287*8fb009dcSAndroid Build Coastguard Worker	ld1	{v1.4s},[x2],#16
288*8fb009dcSAndroid Build Coastguard Worker	b.gt	Loop_dec
289*8fb009dcSAndroid Build Coastguard Worker
290*8fb009dcSAndroid Build Coastguard Worker	aesd	v2.16b,v0.16b
291*8fb009dcSAndroid Build Coastguard Worker	aesimc	v2.16b,v2.16b
292*8fb009dcSAndroid Build Coastguard Worker	ld1	{v0.4s},[x2]
293*8fb009dcSAndroid Build Coastguard Worker	aesd	v2.16b,v1.16b
294*8fb009dcSAndroid Build Coastguard Worker	eor	v2.16b,v2.16b,v0.16b
295*8fb009dcSAndroid Build Coastguard Worker
296*8fb009dcSAndroid Build Coastguard Worker	st1	{v2.16b},[x1]
297*8fb009dcSAndroid Build Coastguard Worker	ret
298*8fb009dcSAndroid Build Coastguard Worker
299*8fb009dcSAndroid Build Coastguard Worker.globl	aes_hw_cbc_encrypt
300*8fb009dcSAndroid Build Coastguard Worker
301*8fb009dcSAndroid Build Coastguard Worker.def aes_hw_cbc_encrypt
302*8fb009dcSAndroid Build Coastguard Worker   .type 32
303*8fb009dcSAndroid Build Coastguard Worker.endef
304*8fb009dcSAndroid Build Coastguard Worker.align	5
305*8fb009dcSAndroid Build Coastguard Workeraes_hw_cbc_encrypt:
306*8fb009dcSAndroid Build Coastguard Worker	// Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later.
307*8fb009dcSAndroid Build Coastguard Worker	AARCH64_VALID_CALL_TARGET
308*8fb009dcSAndroid Build Coastguard Worker	stp	x29,x30,[sp,#-16]!
309*8fb009dcSAndroid Build Coastguard Worker	add	x29,sp,#0
310*8fb009dcSAndroid Build Coastguard Worker	subs	x2,x2,#16
311*8fb009dcSAndroid Build Coastguard Worker	mov	x8,#16
312*8fb009dcSAndroid Build Coastguard Worker	b.lo	Lcbc_abort
313*8fb009dcSAndroid Build Coastguard Worker	csel	x8,xzr,x8,eq
314*8fb009dcSAndroid Build Coastguard Worker
315*8fb009dcSAndroid Build Coastguard Worker	cmp	w5,#0			// en- or decrypting?
316*8fb009dcSAndroid Build Coastguard Worker	ldr	w5,[x3,#240]
317*8fb009dcSAndroid Build Coastguard Worker	and	x2,x2,#-16
318*8fb009dcSAndroid Build Coastguard Worker	ld1	{v6.16b},[x4]
319*8fb009dcSAndroid Build Coastguard Worker	ld1	{v0.16b},[x0],x8
320*8fb009dcSAndroid Build Coastguard Worker
321*8fb009dcSAndroid Build Coastguard Worker	ld1	{v16.4s,v17.4s},[x3]		// load key schedule...
322*8fb009dcSAndroid Build Coastguard Worker	sub	w5,w5,#6
323*8fb009dcSAndroid Build Coastguard Worker	add	x7,x3,x5,lsl#4	// pointer to last 7 round keys
324*8fb009dcSAndroid Build Coastguard Worker	sub	w5,w5,#2
325*8fb009dcSAndroid Build Coastguard Worker	ld1	{v18.4s,v19.4s},[x7],#32
326*8fb009dcSAndroid Build Coastguard Worker	ld1	{v20.4s,v21.4s},[x7],#32
327*8fb009dcSAndroid Build Coastguard Worker	ld1	{v22.4s,v23.4s},[x7],#32
328*8fb009dcSAndroid Build Coastguard Worker	ld1	{v7.4s},[x7]
329*8fb009dcSAndroid Build Coastguard Worker
330*8fb009dcSAndroid Build Coastguard Worker	add	x7,x3,#32
331*8fb009dcSAndroid Build Coastguard Worker	mov	w6,w5
332*8fb009dcSAndroid Build Coastguard Worker	b.eq	Lcbc_dec
333*8fb009dcSAndroid Build Coastguard Worker
334*8fb009dcSAndroid Build Coastguard Worker	cmp	w5,#2
335*8fb009dcSAndroid Build Coastguard Worker	eor	v0.16b,v0.16b,v6.16b
336*8fb009dcSAndroid Build Coastguard Worker	eor	v5.16b,v16.16b,v7.16b
337*8fb009dcSAndroid Build Coastguard Worker	b.eq	Lcbc_enc128
338*8fb009dcSAndroid Build Coastguard Worker
339*8fb009dcSAndroid Build Coastguard Worker	ld1	{v2.4s,v3.4s},[x7]
340*8fb009dcSAndroid Build Coastguard Worker	add	x7,x3,#16
341*8fb009dcSAndroid Build Coastguard Worker	add	x6,x3,#16*4
342*8fb009dcSAndroid Build Coastguard Worker	add	x12,x3,#16*5
343*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v16.16b
344*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
345*8fb009dcSAndroid Build Coastguard Worker	add	x14,x3,#16*6
346*8fb009dcSAndroid Build Coastguard Worker	add	x3,x3,#16*7
347*8fb009dcSAndroid Build Coastguard Worker	b	Lenter_cbc_enc
348*8fb009dcSAndroid Build Coastguard Worker
349*8fb009dcSAndroid Build Coastguard Worker.align	4
350*8fb009dcSAndroid Build Coastguard WorkerLoop_cbc_enc:
351*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v16.16b
352*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
353*8fb009dcSAndroid Build Coastguard Worker	st1	{v6.16b},[x1],#16
354*8fb009dcSAndroid Build Coastguard WorkerLenter_cbc_enc:
355*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v17.16b
356*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
357*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v2.16b
358*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
359*8fb009dcSAndroid Build Coastguard Worker	ld1	{v16.4s},[x6]
360*8fb009dcSAndroid Build Coastguard Worker	cmp	w5,#4
361*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v3.16b
362*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
363*8fb009dcSAndroid Build Coastguard Worker	ld1	{v17.4s},[x12]
364*8fb009dcSAndroid Build Coastguard Worker	b.eq	Lcbc_enc192
365*8fb009dcSAndroid Build Coastguard Worker
366*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v16.16b
367*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
368*8fb009dcSAndroid Build Coastguard Worker	ld1	{v16.4s},[x14]
369*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v17.16b
370*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
371*8fb009dcSAndroid Build Coastguard Worker	ld1	{v17.4s},[x3]
372*8fb009dcSAndroid Build Coastguard Worker	nop
373*8fb009dcSAndroid Build Coastguard Worker
374*8fb009dcSAndroid Build Coastguard WorkerLcbc_enc192:
375*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v16.16b
376*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
377*8fb009dcSAndroid Build Coastguard Worker	subs	x2,x2,#16
378*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v17.16b
379*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
380*8fb009dcSAndroid Build Coastguard Worker	csel	x8,xzr,x8,eq
381*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v18.16b
382*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
383*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v19.16b
384*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
385*8fb009dcSAndroid Build Coastguard Worker	ld1	{v16.16b},[x0],x8
386*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v20.16b
387*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
388*8fb009dcSAndroid Build Coastguard Worker	eor	v16.16b,v16.16b,v5.16b
389*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v21.16b
390*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
391*8fb009dcSAndroid Build Coastguard Worker	ld1	{v17.4s},[x7]		// re-pre-load rndkey[1]
392*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v22.16b
393*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
394*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v23.16b
395*8fb009dcSAndroid Build Coastguard Worker	eor	v6.16b,v0.16b,v7.16b
396*8fb009dcSAndroid Build Coastguard Worker	b.hs	Loop_cbc_enc
397*8fb009dcSAndroid Build Coastguard Worker
398*8fb009dcSAndroid Build Coastguard Worker	st1	{v6.16b},[x1],#16
399*8fb009dcSAndroid Build Coastguard Worker	b	Lcbc_done
400*8fb009dcSAndroid Build Coastguard Worker
401*8fb009dcSAndroid Build Coastguard Worker.align	5
402*8fb009dcSAndroid Build Coastguard WorkerLcbc_enc128:
403*8fb009dcSAndroid Build Coastguard Worker	ld1	{v2.4s,v3.4s},[x7]
404*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v16.16b
405*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
406*8fb009dcSAndroid Build Coastguard Worker	b	Lenter_cbc_enc128
407*8fb009dcSAndroid Build Coastguard WorkerLoop_cbc_enc128:
408*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v16.16b
409*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
410*8fb009dcSAndroid Build Coastguard Worker	st1	{v6.16b},[x1],#16
411*8fb009dcSAndroid Build Coastguard WorkerLenter_cbc_enc128:
412*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v17.16b
413*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
414*8fb009dcSAndroid Build Coastguard Worker	subs	x2,x2,#16
415*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v2.16b
416*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
417*8fb009dcSAndroid Build Coastguard Worker	csel	x8,xzr,x8,eq
418*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v3.16b
419*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
420*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v18.16b
421*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
422*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v19.16b
423*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
424*8fb009dcSAndroid Build Coastguard Worker	ld1	{v16.16b},[x0],x8
425*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v20.16b
426*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
427*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v21.16b
428*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
429*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v22.16b
430*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
431*8fb009dcSAndroid Build Coastguard Worker	eor	v16.16b,v16.16b,v5.16b
432*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v23.16b
433*8fb009dcSAndroid Build Coastguard Worker	eor	v6.16b,v0.16b,v7.16b
434*8fb009dcSAndroid Build Coastguard Worker	b.hs	Loop_cbc_enc128
435*8fb009dcSAndroid Build Coastguard Worker
436*8fb009dcSAndroid Build Coastguard Worker	st1	{v6.16b},[x1],#16
437*8fb009dcSAndroid Build Coastguard Worker	b	Lcbc_done
438*8fb009dcSAndroid Build Coastguard Worker.align	5
439*8fb009dcSAndroid Build Coastguard WorkerLcbc_dec:
440*8fb009dcSAndroid Build Coastguard Worker	ld1	{v18.16b},[x0],#16
441*8fb009dcSAndroid Build Coastguard Worker	subs	x2,x2,#32		// bias
442*8fb009dcSAndroid Build Coastguard Worker	add	w6,w5,#2
443*8fb009dcSAndroid Build Coastguard Worker	orr	v3.16b,v0.16b,v0.16b
444*8fb009dcSAndroid Build Coastguard Worker	orr	v1.16b,v0.16b,v0.16b
445*8fb009dcSAndroid Build Coastguard Worker	orr	v19.16b,v18.16b,v18.16b
446*8fb009dcSAndroid Build Coastguard Worker	b.lo	Lcbc_dec_tail
447*8fb009dcSAndroid Build Coastguard Worker
448*8fb009dcSAndroid Build Coastguard Worker	orr	v1.16b,v18.16b,v18.16b
449*8fb009dcSAndroid Build Coastguard Worker	ld1	{v18.16b},[x0],#16
450*8fb009dcSAndroid Build Coastguard Worker	orr	v2.16b,v0.16b,v0.16b
451*8fb009dcSAndroid Build Coastguard Worker	orr	v3.16b,v1.16b,v1.16b
452*8fb009dcSAndroid Build Coastguard Worker	orr	v19.16b,v18.16b,v18.16b
453*8fb009dcSAndroid Build Coastguard Worker
454*8fb009dcSAndroid Build Coastguard WorkerLoop3x_cbc_dec:
455*8fb009dcSAndroid Build Coastguard Worker	aesd	v0.16b,v16.16b
456*8fb009dcSAndroid Build Coastguard Worker	aesimc	v0.16b,v0.16b
457*8fb009dcSAndroid Build Coastguard Worker	aesd	v1.16b,v16.16b
458*8fb009dcSAndroid Build Coastguard Worker	aesimc	v1.16b,v1.16b
459*8fb009dcSAndroid Build Coastguard Worker	aesd	v18.16b,v16.16b
460*8fb009dcSAndroid Build Coastguard Worker	aesimc	v18.16b,v18.16b
461*8fb009dcSAndroid Build Coastguard Worker	ld1	{v16.4s},[x7],#16
462*8fb009dcSAndroid Build Coastguard Worker	subs	w6,w6,#2
463*8fb009dcSAndroid Build Coastguard Worker	aesd	v0.16b,v17.16b
464*8fb009dcSAndroid Build Coastguard Worker	aesimc	v0.16b,v0.16b
465*8fb009dcSAndroid Build Coastguard Worker	aesd	v1.16b,v17.16b
466*8fb009dcSAndroid Build Coastguard Worker	aesimc	v1.16b,v1.16b
467*8fb009dcSAndroid Build Coastguard Worker	aesd	v18.16b,v17.16b
468*8fb009dcSAndroid Build Coastguard Worker	aesimc	v18.16b,v18.16b
469*8fb009dcSAndroid Build Coastguard Worker	ld1	{v17.4s},[x7],#16
470*8fb009dcSAndroid Build Coastguard Worker	b.gt	Loop3x_cbc_dec
471*8fb009dcSAndroid Build Coastguard Worker
472*8fb009dcSAndroid Build Coastguard Worker	aesd	v0.16b,v16.16b
473*8fb009dcSAndroid Build Coastguard Worker	aesimc	v0.16b,v0.16b
474*8fb009dcSAndroid Build Coastguard Worker	aesd	v1.16b,v16.16b
475*8fb009dcSAndroid Build Coastguard Worker	aesimc	v1.16b,v1.16b
476*8fb009dcSAndroid Build Coastguard Worker	aesd	v18.16b,v16.16b
477*8fb009dcSAndroid Build Coastguard Worker	aesimc	v18.16b,v18.16b
478*8fb009dcSAndroid Build Coastguard Worker	eor	v4.16b,v6.16b,v7.16b
479*8fb009dcSAndroid Build Coastguard Worker	subs	x2,x2,#0x30
480*8fb009dcSAndroid Build Coastguard Worker	eor	v5.16b,v2.16b,v7.16b
481*8fb009dcSAndroid Build Coastguard Worker	csel	x6,x2,x6,lo			// x6, w6, is zero at this point
482*8fb009dcSAndroid Build Coastguard Worker	aesd	v0.16b,v17.16b
483*8fb009dcSAndroid Build Coastguard Worker	aesimc	v0.16b,v0.16b
484*8fb009dcSAndroid Build Coastguard Worker	aesd	v1.16b,v17.16b
485*8fb009dcSAndroid Build Coastguard Worker	aesimc	v1.16b,v1.16b
486*8fb009dcSAndroid Build Coastguard Worker	aesd	v18.16b,v17.16b
487*8fb009dcSAndroid Build Coastguard Worker	aesimc	v18.16b,v18.16b
488*8fb009dcSAndroid Build Coastguard Worker	eor	v17.16b,v3.16b,v7.16b
489*8fb009dcSAndroid Build Coastguard Worker	add	x0,x0,x6		// x0 is adjusted in such way that
490*8fb009dcSAndroid Build Coastguard Worker					// at exit from the loop v1.16b-v18.16b
491*8fb009dcSAndroid Build Coastguard Worker					// are loaded with last "words"
492*8fb009dcSAndroid Build Coastguard Worker	orr	v6.16b,v19.16b,v19.16b
493*8fb009dcSAndroid Build Coastguard Worker	mov	x7,x3
494*8fb009dcSAndroid Build Coastguard Worker	aesd	v0.16b,v20.16b
495*8fb009dcSAndroid Build Coastguard Worker	aesimc	v0.16b,v0.16b
496*8fb009dcSAndroid Build Coastguard Worker	aesd	v1.16b,v20.16b
497*8fb009dcSAndroid Build Coastguard Worker	aesimc	v1.16b,v1.16b
498*8fb009dcSAndroid Build Coastguard Worker	aesd	v18.16b,v20.16b
499*8fb009dcSAndroid Build Coastguard Worker	aesimc	v18.16b,v18.16b
500*8fb009dcSAndroid Build Coastguard Worker	ld1	{v2.16b},[x0],#16
501*8fb009dcSAndroid Build Coastguard Worker	aesd	v0.16b,v21.16b
502*8fb009dcSAndroid Build Coastguard Worker	aesimc	v0.16b,v0.16b
503*8fb009dcSAndroid Build Coastguard Worker	aesd	v1.16b,v21.16b
504*8fb009dcSAndroid Build Coastguard Worker	aesimc	v1.16b,v1.16b
505*8fb009dcSAndroid Build Coastguard Worker	aesd	v18.16b,v21.16b
506*8fb009dcSAndroid Build Coastguard Worker	aesimc	v18.16b,v18.16b
507*8fb009dcSAndroid Build Coastguard Worker	ld1	{v3.16b},[x0],#16
508*8fb009dcSAndroid Build Coastguard Worker	aesd	v0.16b,v22.16b
509*8fb009dcSAndroid Build Coastguard Worker	aesimc	v0.16b,v0.16b
510*8fb009dcSAndroid Build Coastguard Worker	aesd	v1.16b,v22.16b
511*8fb009dcSAndroid Build Coastguard Worker	aesimc	v1.16b,v1.16b
512*8fb009dcSAndroid Build Coastguard Worker	aesd	v18.16b,v22.16b
513*8fb009dcSAndroid Build Coastguard Worker	aesimc	v18.16b,v18.16b
514*8fb009dcSAndroid Build Coastguard Worker	ld1	{v19.16b},[x0],#16
515*8fb009dcSAndroid Build Coastguard Worker	aesd	v0.16b,v23.16b
516*8fb009dcSAndroid Build Coastguard Worker	aesd	v1.16b,v23.16b
517*8fb009dcSAndroid Build Coastguard Worker	aesd	v18.16b,v23.16b
518*8fb009dcSAndroid Build Coastguard Worker	ld1	{v16.4s},[x7],#16	// re-pre-load rndkey[0]
519*8fb009dcSAndroid Build Coastguard Worker	add	w6,w5,#2
520*8fb009dcSAndroid Build Coastguard Worker	eor	v4.16b,v4.16b,v0.16b
521*8fb009dcSAndroid Build Coastguard Worker	eor	v5.16b,v5.16b,v1.16b
522*8fb009dcSAndroid Build Coastguard Worker	eor	v18.16b,v18.16b,v17.16b
523*8fb009dcSAndroid Build Coastguard Worker	ld1	{v17.4s},[x7],#16	// re-pre-load rndkey[1]
524*8fb009dcSAndroid Build Coastguard Worker	st1	{v4.16b},[x1],#16
525*8fb009dcSAndroid Build Coastguard Worker	orr	v0.16b,v2.16b,v2.16b
526*8fb009dcSAndroid Build Coastguard Worker	st1	{v5.16b},[x1],#16
527*8fb009dcSAndroid Build Coastguard Worker	orr	v1.16b,v3.16b,v3.16b
528*8fb009dcSAndroid Build Coastguard Worker	st1	{v18.16b},[x1],#16
529*8fb009dcSAndroid Build Coastguard Worker	orr	v18.16b,v19.16b,v19.16b
530*8fb009dcSAndroid Build Coastguard Worker	b.hs	Loop3x_cbc_dec
531*8fb009dcSAndroid Build Coastguard Worker
532*8fb009dcSAndroid Build Coastguard Worker	cmn	x2,#0x30
533*8fb009dcSAndroid Build Coastguard Worker	b.eq	Lcbc_done
534*8fb009dcSAndroid Build Coastguard Worker	nop
535*8fb009dcSAndroid Build Coastguard Worker
536*8fb009dcSAndroid Build Coastguard WorkerLcbc_dec_tail:
537*8fb009dcSAndroid Build Coastguard Worker	aesd	v1.16b,v16.16b
538*8fb009dcSAndroid Build Coastguard Worker	aesimc	v1.16b,v1.16b
539*8fb009dcSAndroid Build Coastguard Worker	aesd	v18.16b,v16.16b
540*8fb009dcSAndroid Build Coastguard Worker	aesimc	v18.16b,v18.16b
541*8fb009dcSAndroid Build Coastguard Worker	ld1	{v16.4s},[x7],#16
542*8fb009dcSAndroid Build Coastguard Worker	subs	w6,w6,#2
543*8fb009dcSAndroid Build Coastguard Worker	aesd	v1.16b,v17.16b
544*8fb009dcSAndroid Build Coastguard Worker	aesimc	v1.16b,v1.16b
545*8fb009dcSAndroid Build Coastguard Worker	aesd	v18.16b,v17.16b
546*8fb009dcSAndroid Build Coastguard Worker	aesimc	v18.16b,v18.16b
547*8fb009dcSAndroid Build Coastguard Worker	ld1	{v17.4s},[x7],#16
548*8fb009dcSAndroid Build Coastguard Worker	b.gt	Lcbc_dec_tail
549*8fb009dcSAndroid Build Coastguard Worker
550*8fb009dcSAndroid Build Coastguard Worker	aesd	v1.16b,v16.16b
551*8fb009dcSAndroid Build Coastguard Worker	aesimc	v1.16b,v1.16b
552*8fb009dcSAndroid Build Coastguard Worker	aesd	v18.16b,v16.16b
553*8fb009dcSAndroid Build Coastguard Worker	aesimc	v18.16b,v18.16b
554*8fb009dcSAndroid Build Coastguard Worker	aesd	v1.16b,v17.16b
555*8fb009dcSAndroid Build Coastguard Worker	aesimc	v1.16b,v1.16b
556*8fb009dcSAndroid Build Coastguard Worker	aesd	v18.16b,v17.16b
557*8fb009dcSAndroid Build Coastguard Worker	aesimc	v18.16b,v18.16b
558*8fb009dcSAndroid Build Coastguard Worker	aesd	v1.16b,v20.16b
559*8fb009dcSAndroid Build Coastguard Worker	aesimc	v1.16b,v1.16b
560*8fb009dcSAndroid Build Coastguard Worker	aesd	v18.16b,v20.16b
561*8fb009dcSAndroid Build Coastguard Worker	aesimc	v18.16b,v18.16b
562*8fb009dcSAndroid Build Coastguard Worker	cmn	x2,#0x20
563*8fb009dcSAndroid Build Coastguard Worker	aesd	v1.16b,v21.16b
564*8fb009dcSAndroid Build Coastguard Worker	aesimc	v1.16b,v1.16b
565*8fb009dcSAndroid Build Coastguard Worker	aesd	v18.16b,v21.16b
566*8fb009dcSAndroid Build Coastguard Worker	aesimc	v18.16b,v18.16b
567*8fb009dcSAndroid Build Coastguard Worker	eor	v5.16b,v6.16b,v7.16b
568*8fb009dcSAndroid Build Coastguard Worker	aesd	v1.16b,v22.16b
569*8fb009dcSAndroid Build Coastguard Worker	aesimc	v1.16b,v1.16b
570*8fb009dcSAndroid Build Coastguard Worker	aesd	v18.16b,v22.16b
571*8fb009dcSAndroid Build Coastguard Worker	aesimc	v18.16b,v18.16b
572*8fb009dcSAndroid Build Coastguard Worker	eor	v17.16b,v3.16b,v7.16b
573*8fb009dcSAndroid Build Coastguard Worker	aesd	v1.16b,v23.16b
574*8fb009dcSAndroid Build Coastguard Worker	aesd	v18.16b,v23.16b
575*8fb009dcSAndroid Build Coastguard Worker	b.eq	Lcbc_dec_one
576*8fb009dcSAndroid Build Coastguard Worker	eor	v5.16b,v5.16b,v1.16b
577*8fb009dcSAndroid Build Coastguard Worker	eor	v17.16b,v17.16b,v18.16b
578*8fb009dcSAndroid Build Coastguard Worker	orr	v6.16b,v19.16b,v19.16b
579*8fb009dcSAndroid Build Coastguard Worker	st1	{v5.16b},[x1],#16
580*8fb009dcSAndroid Build Coastguard Worker	st1	{v17.16b},[x1],#16
581*8fb009dcSAndroid Build Coastguard Worker	b	Lcbc_done
582*8fb009dcSAndroid Build Coastguard Worker
583*8fb009dcSAndroid Build Coastguard WorkerLcbc_dec_one:
584*8fb009dcSAndroid Build Coastguard Worker	eor	v5.16b,v5.16b,v18.16b
585*8fb009dcSAndroid Build Coastguard Worker	orr	v6.16b,v19.16b,v19.16b
586*8fb009dcSAndroid Build Coastguard Worker	st1	{v5.16b},[x1],#16
587*8fb009dcSAndroid Build Coastguard Worker
588*8fb009dcSAndroid Build Coastguard WorkerLcbc_done:
589*8fb009dcSAndroid Build Coastguard Worker	st1	{v6.16b},[x4]
590*8fb009dcSAndroid Build Coastguard WorkerLcbc_abort:
591*8fb009dcSAndroid Build Coastguard Worker	ldr	x29,[sp],#16
592*8fb009dcSAndroid Build Coastguard Worker	ret
593*8fb009dcSAndroid Build Coastguard Worker
594*8fb009dcSAndroid Build Coastguard Worker.globl	aes_hw_ctr32_encrypt_blocks
595*8fb009dcSAndroid Build Coastguard Worker
596*8fb009dcSAndroid Build Coastguard Worker.def aes_hw_ctr32_encrypt_blocks
597*8fb009dcSAndroid Build Coastguard Worker   .type 32
598*8fb009dcSAndroid Build Coastguard Worker.endef
599*8fb009dcSAndroid Build Coastguard Worker.align	5
600*8fb009dcSAndroid Build Coastguard Workeraes_hw_ctr32_encrypt_blocks:
601*8fb009dcSAndroid Build Coastguard Worker	// Armv8.3-A PAuth: even though x30 is pushed to stack it is not popped later.
602*8fb009dcSAndroid Build Coastguard Worker	AARCH64_VALID_CALL_TARGET
603*8fb009dcSAndroid Build Coastguard Worker	stp	x29,x30,[sp,#-16]!
604*8fb009dcSAndroid Build Coastguard Worker	add	x29,sp,#0
605*8fb009dcSAndroid Build Coastguard Worker	ldr	w5,[x3,#240]
606*8fb009dcSAndroid Build Coastguard Worker
607*8fb009dcSAndroid Build Coastguard Worker	ldr	w8, [x4, #12]
608*8fb009dcSAndroid Build Coastguard Worker	ld1	{v0.4s},[x4]
609*8fb009dcSAndroid Build Coastguard Worker
610*8fb009dcSAndroid Build Coastguard Worker	ld1	{v16.4s,v17.4s},[x3]		// load key schedule...
611*8fb009dcSAndroid Build Coastguard Worker	sub	w5,w5,#4
612*8fb009dcSAndroid Build Coastguard Worker	mov	x12,#16
613*8fb009dcSAndroid Build Coastguard Worker	cmp	x2,#2
614*8fb009dcSAndroid Build Coastguard Worker	add	x7,x3,x5,lsl#4	// pointer to last 5 round keys
615*8fb009dcSAndroid Build Coastguard Worker	sub	w5,w5,#2
616*8fb009dcSAndroid Build Coastguard Worker	ld1	{v20.4s,v21.4s},[x7],#32
617*8fb009dcSAndroid Build Coastguard Worker	ld1	{v22.4s,v23.4s},[x7],#32
618*8fb009dcSAndroid Build Coastguard Worker	ld1	{v7.4s},[x7]
619*8fb009dcSAndroid Build Coastguard Worker	add	x7,x3,#32
620*8fb009dcSAndroid Build Coastguard Worker	mov	w6,w5
621*8fb009dcSAndroid Build Coastguard Worker	csel	x12,xzr,x12,lo
622*8fb009dcSAndroid Build Coastguard Worker
623*8fb009dcSAndroid Build Coastguard Worker	// ARM Cortex-A57 and Cortex-A72 cores running in 32-bit mode are
624*8fb009dcSAndroid Build Coastguard Worker	// affected by silicon errata #1742098 [0] and #1655431 [1],
625*8fb009dcSAndroid Build Coastguard Worker	// respectively, where the second instruction of an aese/aesmc
626*8fb009dcSAndroid Build Coastguard Worker	// instruction pair may execute twice if an interrupt is taken right
627*8fb009dcSAndroid Build Coastguard Worker	// after the first instruction consumes an input register of which a
628*8fb009dcSAndroid Build Coastguard Worker	// single 32-bit lane has been updated the last time it was modified.
629*8fb009dcSAndroid Build Coastguard Worker	//
630*8fb009dcSAndroid Build Coastguard Worker	// This function uses a counter in one 32-bit lane. The vmov lines
631*8fb009dcSAndroid Build Coastguard Worker	// could write to v1.16b and v18.16b directly, but that trips this bugs.
632*8fb009dcSAndroid Build Coastguard Worker	// We write to v6.16b and copy to the final register as a workaround.
633*8fb009dcSAndroid Build Coastguard Worker	//
634*8fb009dcSAndroid Build Coastguard Worker	// [0] ARM-EPM-049219 v23 Cortex-A57 MPCore Software Developers Errata Notice
635*8fb009dcSAndroid Build Coastguard Worker	// [1] ARM-EPM-012079 v11.0 Cortex-A72 MPCore Software Developers Errata Notice
636*8fb009dcSAndroid Build Coastguard Worker#ifndef __AARCH64EB__
637*8fb009dcSAndroid Build Coastguard Worker	rev	w8, w8
638*8fb009dcSAndroid Build Coastguard Worker#endif
639*8fb009dcSAndroid Build Coastguard Worker	add	w10, w8, #1
640*8fb009dcSAndroid Build Coastguard Worker	orr	v6.16b,v0.16b,v0.16b
641*8fb009dcSAndroid Build Coastguard Worker	rev	w10, w10
642*8fb009dcSAndroid Build Coastguard Worker	mov	v6.s[3],w10
643*8fb009dcSAndroid Build Coastguard Worker	add	w8, w8, #2
644*8fb009dcSAndroid Build Coastguard Worker	orr	v1.16b,v6.16b,v6.16b
645*8fb009dcSAndroid Build Coastguard Worker	b.ls	Lctr32_tail
646*8fb009dcSAndroid Build Coastguard Worker	rev	w12, w8
647*8fb009dcSAndroid Build Coastguard Worker	mov	v6.s[3],w12
648*8fb009dcSAndroid Build Coastguard Worker	sub	x2,x2,#3		// bias
649*8fb009dcSAndroid Build Coastguard Worker	orr	v18.16b,v6.16b,v6.16b
650*8fb009dcSAndroid Build Coastguard Worker	b	Loop3x_ctr32
651*8fb009dcSAndroid Build Coastguard Worker
652*8fb009dcSAndroid Build Coastguard Worker.align	4
653*8fb009dcSAndroid Build Coastguard WorkerLoop3x_ctr32:
654*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v16.16b
655*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
656*8fb009dcSAndroid Build Coastguard Worker	aese	v1.16b,v16.16b
657*8fb009dcSAndroid Build Coastguard Worker	aesmc	v1.16b,v1.16b
658*8fb009dcSAndroid Build Coastguard Worker	aese	v18.16b,v16.16b
659*8fb009dcSAndroid Build Coastguard Worker	aesmc	v18.16b,v18.16b
660*8fb009dcSAndroid Build Coastguard Worker	ld1	{v16.4s},[x7],#16
661*8fb009dcSAndroid Build Coastguard Worker	subs	w6,w6,#2
662*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v17.16b
663*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
664*8fb009dcSAndroid Build Coastguard Worker	aese	v1.16b,v17.16b
665*8fb009dcSAndroid Build Coastguard Worker	aesmc	v1.16b,v1.16b
666*8fb009dcSAndroid Build Coastguard Worker	aese	v18.16b,v17.16b
667*8fb009dcSAndroid Build Coastguard Worker	aesmc	v18.16b,v18.16b
668*8fb009dcSAndroid Build Coastguard Worker	ld1	{v17.4s},[x7],#16
669*8fb009dcSAndroid Build Coastguard Worker	b.gt	Loop3x_ctr32
670*8fb009dcSAndroid Build Coastguard Worker
671*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v16.16b
672*8fb009dcSAndroid Build Coastguard Worker	aesmc	v4.16b,v0.16b
673*8fb009dcSAndroid Build Coastguard Worker	aese	v1.16b,v16.16b
674*8fb009dcSAndroid Build Coastguard Worker	aesmc	v5.16b,v1.16b
675*8fb009dcSAndroid Build Coastguard Worker	ld1	{v2.16b},[x0],#16
676*8fb009dcSAndroid Build Coastguard Worker	add	w9,w8,#1
677*8fb009dcSAndroid Build Coastguard Worker	aese	v18.16b,v16.16b
678*8fb009dcSAndroid Build Coastguard Worker	aesmc	v18.16b,v18.16b
679*8fb009dcSAndroid Build Coastguard Worker	ld1	{v3.16b},[x0],#16
680*8fb009dcSAndroid Build Coastguard Worker	rev	w9,w9
681*8fb009dcSAndroid Build Coastguard Worker	aese	v4.16b,v17.16b
682*8fb009dcSAndroid Build Coastguard Worker	aesmc	v4.16b,v4.16b
683*8fb009dcSAndroid Build Coastguard Worker	aese	v5.16b,v17.16b
684*8fb009dcSAndroid Build Coastguard Worker	aesmc	v5.16b,v5.16b
685*8fb009dcSAndroid Build Coastguard Worker	ld1	{v19.16b},[x0],#16
686*8fb009dcSAndroid Build Coastguard Worker	mov	x7,x3
687*8fb009dcSAndroid Build Coastguard Worker	aese	v18.16b,v17.16b
688*8fb009dcSAndroid Build Coastguard Worker	aesmc	v17.16b,v18.16b
689*8fb009dcSAndroid Build Coastguard Worker	aese	v4.16b,v20.16b
690*8fb009dcSAndroid Build Coastguard Worker	aesmc	v4.16b,v4.16b
691*8fb009dcSAndroid Build Coastguard Worker	aese	v5.16b,v20.16b
692*8fb009dcSAndroid Build Coastguard Worker	aesmc	v5.16b,v5.16b
693*8fb009dcSAndroid Build Coastguard Worker	eor	v2.16b,v2.16b,v7.16b
694*8fb009dcSAndroid Build Coastguard Worker	add	w10,w8,#2
695*8fb009dcSAndroid Build Coastguard Worker	aese	v17.16b,v20.16b
696*8fb009dcSAndroid Build Coastguard Worker	aesmc	v17.16b,v17.16b
697*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v7.16b
698*8fb009dcSAndroid Build Coastguard Worker	add	w8,w8,#3
699*8fb009dcSAndroid Build Coastguard Worker	aese	v4.16b,v21.16b
700*8fb009dcSAndroid Build Coastguard Worker	aesmc	v4.16b,v4.16b
701*8fb009dcSAndroid Build Coastguard Worker	aese	v5.16b,v21.16b
702*8fb009dcSAndroid Build Coastguard Worker	aesmc	v5.16b,v5.16b
703*8fb009dcSAndroid Build Coastguard Worker	 // Note the logic to update v0.16b, v1.16b, and v1.16b is written to work
704*8fb009dcSAndroid Build Coastguard Worker	 // around a bug in ARM Cortex-A57 and Cortex-A72 cores running in
705*8fb009dcSAndroid Build Coastguard Worker	 // 32-bit mode. See the comment above.
706*8fb009dcSAndroid Build Coastguard Worker	eor	v19.16b,v19.16b,v7.16b
707*8fb009dcSAndroid Build Coastguard Worker	mov	v6.s[3], w9
708*8fb009dcSAndroid Build Coastguard Worker	aese	v17.16b,v21.16b
709*8fb009dcSAndroid Build Coastguard Worker	aesmc	v17.16b,v17.16b
710*8fb009dcSAndroid Build Coastguard Worker	orr	v0.16b,v6.16b,v6.16b
711*8fb009dcSAndroid Build Coastguard Worker	rev	w10,w10
712*8fb009dcSAndroid Build Coastguard Worker	aese	v4.16b,v22.16b
713*8fb009dcSAndroid Build Coastguard Worker	aesmc	v4.16b,v4.16b
714*8fb009dcSAndroid Build Coastguard Worker	mov	v6.s[3], w10
715*8fb009dcSAndroid Build Coastguard Worker	rev	w12,w8
716*8fb009dcSAndroid Build Coastguard Worker	aese	v5.16b,v22.16b
717*8fb009dcSAndroid Build Coastguard Worker	aesmc	v5.16b,v5.16b
718*8fb009dcSAndroid Build Coastguard Worker	orr	v1.16b,v6.16b,v6.16b
719*8fb009dcSAndroid Build Coastguard Worker	mov	v6.s[3], w12
720*8fb009dcSAndroid Build Coastguard Worker	aese	v17.16b,v22.16b
721*8fb009dcSAndroid Build Coastguard Worker	aesmc	v17.16b,v17.16b
722*8fb009dcSAndroid Build Coastguard Worker	orr	v18.16b,v6.16b,v6.16b
723*8fb009dcSAndroid Build Coastguard Worker	subs	x2,x2,#3
724*8fb009dcSAndroid Build Coastguard Worker	aese	v4.16b,v23.16b
725*8fb009dcSAndroid Build Coastguard Worker	aese	v5.16b,v23.16b
726*8fb009dcSAndroid Build Coastguard Worker	aese	v17.16b,v23.16b
727*8fb009dcSAndroid Build Coastguard Worker
728*8fb009dcSAndroid Build Coastguard Worker	eor	v2.16b,v2.16b,v4.16b
729*8fb009dcSAndroid Build Coastguard Worker	ld1	{v16.4s},[x7],#16	// re-pre-load rndkey[0]
730*8fb009dcSAndroid Build Coastguard Worker	st1	{v2.16b},[x1],#16
731*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v5.16b
732*8fb009dcSAndroid Build Coastguard Worker	mov	w6,w5
733*8fb009dcSAndroid Build Coastguard Worker	st1	{v3.16b},[x1],#16
734*8fb009dcSAndroid Build Coastguard Worker	eor	v19.16b,v19.16b,v17.16b
735*8fb009dcSAndroid Build Coastguard Worker	ld1	{v17.4s},[x7],#16	// re-pre-load rndkey[1]
736*8fb009dcSAndroid Build Coastguard Worker	st1	{v19.16b},[x1],#16
737*8fb009dcSAndroid Build Coastguard Worker	b.hs	Loop3x_ctr32
738*8fb009dcSAndroid Build Coastguard Worker
739*8fb009dcSAndroid Build Coastguard Worker	adds	x2,x2,#3
740*8fb009dcSAndroid Build Coastguard Worker	b.eq	Lctr32_done
741*8fb009dcSAndroid Build Coastguard Worker	cmp	x2,#1
742*8fb009dcSAndroid Build Coastguard Worker	mov	x12,#16
743*8fb009dcSAndroid Build Coastguard Worker	csel	x12,xzr,x12,eq
744*8fb009dcSAndroid Build Coastguard Worker
745*8fb009dcSAndroid Build Coastguard WorkerLctr32_tail:
746*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v16.16b
747*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
748*8fb009dcSAndroid Build Coastguard Worker	aese	v1.16b,v16.16b
749*8fb009dcSAndroid Build Coastguard Worker	aesmc	v1.16b,v1.16b
750*8fb009dcSAndroid Build Coastguard Worker	ld1	{v16.4s},[x7],#16
751*8fb009dcSAndroid Build Coastguard Worker	subs	w6,w6,#2
752*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v17.16b
753*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
754*8fb009dcSAndroid Build Coastguard Worker	aese	v1.16b,v17.16b
755*8fb009dcSAndroid Build Coastguard Worker	aesmc	v1.16b,v1.16b
756*8fb009dcSAndroid Build Coastguard Worker	ld1	{v17.4s},[x7],#16
757*8fb009dcSAndroid Build Coastguard Worker	b.gt	Lctr32_tail
758*8fb009dcSAndroid Build Coastguard Worker
759*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v16.16b
760*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
761*8fb009dcSAndroid Build Coastguard Worker	aese	v1.16b,v16.16b
762*8fb009dcSAndroid Build Coastguard Worker	aesmc	v1.16b,v1.16b
763*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v17.16b
764*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
765*8fb009dcSAndroid Build Coastguard Worker	aese	v1.16b,v17.16b
766*8fb009dcSAndroid Build Coastguard Worker	aesmc	v1.16b,v1.16b
767*8fb009dcSAndroid Build Coastguard Worker	ld1	{v2.16b},[x0],x12
768*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v20.16b
769*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
770*8fb009dcSAndroid Build Coastguard Worker	aese	v1.16b,v20.16b
771*8fb009dcSAndroid Build Coastguard Worker	aesmc	v1.16b,v1.16b
772*8fb009dcSAndroid Build Coastguard Worker	ld1	{v3.16b},[x0]
773*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v21.16b
774*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
775*8fb009dcSAndroid Build Coastguard Worker	aese	v1.16b,v21.16b
776*8fb009dcSAndroid Build Coastguard Worker	aesmc	v1.16b,v1.16b
777*8fb009dcSAndroid Build Coastguard Worker	eor	v2.16b,v2.16b,v7.16b
778*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v22.16b
779*8fb009dcSAndroid Build Coastguard Worker	aesmc	v0.16b,v0.16b
780*8fb009dcSAndroid Build Coastguard Worker	aese	v1.16b,v22.16b
781*8fb009dcSAndroid Build Coastguard Worker	aesmc	v1.16b,v1.16b
782*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v7.16b
783*8fb009dcSAndroid Build Coastguard Worker	aese	v0.16b,v23.16b
784*8fb009dcSAndroid Build Coastguard Worker	aese	v1.16b,v23.16b
785*8fb009dcSAndroid Build Coastguard Worker
786*8fb009dcSAndroid Build Coastguard Worker	cmp	x2,#1
787*8fb009dcSAndroid Build Coastguard Worker	eor	v2.16b,v2.16b,v0.16b
788*8fb009dcSAndroid Build Coastguard Worker	eor	v3.16b,v3.16b,v1.16b
789*8fb009dcSAndroid Build Coastguard Worker	st1	{v2.16b},[x1],#16
790*8fb009dcSAndroid Build Coastguard Worker	b.eq	Lctr32_done
791*8fb009dcSAndroid Build Coastguard Worker	st1	{v3.16b},[x1]
792*8fb009dcSAndroid Build Coastguard Worker
793*8fb009dcSAndroid Build Coastguard WorkerLctr32_done:
794*8fb009dcSAndroid Build Coastguard Worker	ldr	x29,[sp],#16
795*8fb009dcSAndroid Build Coastguard Worker	ret
796*8fb009dcSAndroid Build Coastguard Worker
797*8fb009dcSAndroid Build Coastguard Worker#endif
798*8fb009dcSAndroid Build Coastguard Worker#endif  // !OPENSSL_NO_ASM && defined(OPENSSL_AARCH64) && defined(_WIN32)
799