xref: /freebsd/sys/crypto/openssl/aarch64/sm4-armv8.S (revision 4757b351ea9d59d71d4a38b82506d2d16fcd560d)
1*4757b351SPierre Pronchery/* Do not modify. This file is auto-generated from sm4-armv8.pl. */
2*4757b351SPierre Pronchery// Copyright 2022-2025 The OpenSSL Project Authors. All Rights Reserved.
3*4757b351SPierre Pronchery//
4*4757b351SPierre Pronchery// Licensed under the Apache License 2.0 (the "License").  You may not use
5*4757b351SPierre Pronchery// this file except in compliance with the License.  You can obtain a copy
6*4757b351SPierre Pronchery// in the file LICENSE in the source distribution or at
7*4757b351SPierre Pronchery// https://www.openssl.org/source/license.html
8*4757b351SPierre Pronchery
9*4757b351SPierre Pronchery//
10*4757b351SPierre Pronchery// This module implements support for SM4 hw support on aarch64
11*4757b351SPierre Pronchery// Oct 2021
12*4757b351SPierre Pronchery//
13*4757b351SPierre Pronchery
14*4757b351SPierre Pronchery// $output is the last argument if it looks like a file (it has an extension)
15*4757b351SPierre Pronchery// $flavour is the first argument if it doesn't look like a file
16*4757b351SPierre Pronchery#include "arm_arch.h"
17*4757b351SPierre Pronchery.arch	armv8-a+crypto
18*4757b351SPierre Pronchery.text
19*4757b351SPierre Pronchery
20*4757b351SPierre Pronchery.section	.rodata
21*4757b351SPierre Pronchery.type	_sm4_v8_consts,%object
22*4757b351SPierre Pronchery.align	6
23*4757b351SPierre Pronchery_sm4_v8_consts:
24*4757b351SPierre Pronchery.Lck:
25*4757b351SPierre Pronchery.long	0x00070E15, 0x1C232A31, 0x383F464D, 0x545B6269
26*4757b351SPierre Pronchery.long	0x70777E85, 0x8C939AA1, 0xA8AFB6BD, 0xC4CBD2D9
27*4757b351SPierre Pronchery.long	0xE0E7EEF5, 0xFC030A11, 0x181F262D, 0x343B4249
28*4757b351SPierre Pronchery.long	0x50575E65, 0x6C737A81, 0x888F969D, 0xA4ABB2B9
29*4757b351SPierre Pronchery.long	0xC0C7CED5, 0xDCE3EAF1, 0xF8FF060D, 0x141B2229
30*4757b351SPierre Pronchery.long	0x30373E45, 0x4C535A61, 0x686F767D, 0x848B9299
31*4757b351SPierre Pronchery.long	0xA0A7AEB5, 0xBCC3CAD1, 0xD8DFE6ED, 0xF4FB0209
32*4757b351SPierre Pronchery.long	0x10171E25, 0x2C333A41, 0x484F565D, 0x646B7279
33*4757b351SPierre Pronchery.Lfk:
34*4757b351SPierre Pronchery.long	0xa3b1bac6, 0x56aa3350, 0x677d9197, 0xb27022dc
35*4757b351SPierre Pronchery.size	_sm4_v8_consts,.-_sm4_v8_consts
36*4757b351SPierre Pronchery.previous
37*4757b351SPierre Pronchery
38*4757b351SPierre Pronchery.globl	sm4_v8_set_encrypt_key
39*4757b351SPierre Pronchery.type	sm4_v8_set_encrypt_key,%function
40*4757b351SPierre Pronchery.align	5
41*4757b351SPierre Proncherysm4_v8_set_encrypt_key:
42*4757b351SPierre Pronchery	AARCH64_VALID_CALL_TARGET
43*4757b351SPierre Pronchery	ld1	{v0.4s},[x0]
44*4757b351SPierre Pronchery	adrp	x2,.Lfk
45*4757b351SPierre Pronchery	add	x2,x2,#:lo12:.Lfk
46*4757b351SPierre Pronchery	ld1	{v24.4s},[x2]
47*4757b351SPierre Pronchery	adrp	x2,.Lck
48*4757b351SPierre Pronchery	add	x2,x2,#:lo12:.Lck
49*4757b351SPierre Pronchery	ld1	{v16.4s,v17.4s,v18.4s,v19.4s},[x2],64
50*4757b351SPierre Pronchery#ifndef __AARCH64EB__
51*4757b351SPierre Pronchery	rev32	v0.16b,v0.16b
52*4757b351SPierre Pronchery#endif
53*4757b351SPierre Pronchery	ld1	{v20.4s,v21.4s,v22.4s,v23.4s},[x2]
54*4757b351SPierre Pronchery	eor	v0.16b,v0.16b,v24.16b;
55*4757b351SPierre Pronchery.inst	0xce70c800	//sm4ekey v0.4S,v0.4S,v16.4S
56*4757b351SPierre Pronchery.inst	0xce71c801	//sm4ekey v1.4S,v0.4S,v17.4S
57*4757b351SPierre Pronchery.inst	0xce72c822	//sm4ekey v2.4S,v1.4S,v18.4S
58*4757b351SPierre Pronchery.inst	0xce73c843	//sm4ekey v3.4S,v2.4S,v19.4S
59*4757b351SPierre Pronchery.inst	0xce74c864	//sm4ekey v4.4S,v3.4S,v20.4S
60*4757b351SPierre Pronchery	st1	{v0.4s,v1.4s,v2.4s,v3.4s},[x1],64
61*4757b351SPierre Pronchery.inst	0xce75c885	//sm4ekey v5.4S,v4.4S,v21.4S
62*4757b351SPierre Pronchery.inst	0xce76c8a6	//sm4ekey v6.4S,v5.4S,v22.4S
63*4757b351SPierre Pronchery.inst	0xce77c8c7	//sm4ekey v7.4S,v6.4S,v23.4S
64*4757b351SPierre Pronchery	st1	{v4.4s,v5.4s,v6.4s,v7.4s},[x1]
65*4757b351SPierre Pronchery	ret
66*4757b351SPierre Pronchery.size	sm4_v8_set_encrypt_key,.-sm4_v8_set_encrypt_key
67*4757b351SPierre Pronchery.globl	sm4_v8_set_decrypt_key
68*4757b351SPierre Pronchery.type	sm4_v8_set_decrypt_key,%function
69*4757b351SPierre Pronchery.align	5
70*4757b351SPierre Proncherysm4_v8_set_decrypt_key:
71*4757b351SPierre Pronchery	AARCH64_VALID_CALL_TARGET
72*4757b351SPierre Pronchery	ld1	{v7.4s},[x0]
73*4757b351SPierre Pronchery	adrp	x2,.Lfk
74*4757b351SPierre Pronchery	add	x2,x2,#:lo12:.Lfk
75*4757b351SPierre Pronchery	ld1	{v24.4s},[x2]
76*4757b351SPierre Pronchery	adrp	x2,.Lck
77*4757b351SPierre Pronchery	add	x2,x2,#:lo12:.Lck
78*4757b351SPierre Pronchery	ld1	{v16.4s,v17.4s,v18.4s,v19.4s},[x2],64
79*4757b351SPierre Pronchery#ifndef __AARCH64EB__
80*4757b351SPierre Pronchery	rev32	v7.16b,v7.16b
81*4757b351SPierre Pronchery#endif
82*4757b351SPierre Pronchery	ld1	{v20.4s,v21.4s,v22.4s,v23.4s},[x2]
83*4757b351SPierre Pronchery	eor	v7.16b, v7.16b,v24.16b;
84*4757b351SPierre Pronchery.inst	0xce70c8e7	//sm4ekey v7.4S,v7.4S,v16.4S
85*4757b351SPierre Pronchery.inst	0xce71c8e6	//sm4ekey v6.4S,v7.4S,v17.4S
86*4757b351SPierre Pronchery.inst	0xce72c8c5	//sm4ekey v5.4S,v6.4S,v18.4S
87*4757b351SPierre Pronchery	rev64	v7.4s,v7.4s
88*4757b351SPierre Pronchery	rev64	v6.4s,v6.4s
89*4757b351SPierre Pronchery	ext	v7.16b,v7.16b,v7.16b,#8
90*4757b351SPierre Pronchery	ext	v6.16b,v6.16b,v6.16b,#8
91*4757b351SPierre Pronchery.inst	0xce73c8a4	//sm4ekey v4.4S,v5.4S,v19.4S
92*4757b351SPierre Pronchery.inst	0xce74c883	//sm4ekey v3.4S,v4.4S,v20.4S
93*4757b351SPierre Pronchery	rev64	v5.4s,v5.4s
94*4757b351SPierre Pronchery	rev64	v4.4s,v4.4s
95*4757b351SPierre Pronchery	ext	v5.16b,v5.16b,v5.16b,#8
96*4757b351SPierre Pronchery	ext	v4.16b,v4.16b,v4.16b,#8
97*4757b351SPierre Pronchery.inst	0xce75c862	//sm4ekey v2.4S,v3.4S,v21.4S
98*4757b351SPierre Pronchery.inst	0xce76c841	//sm4ekey v1.4S,v2.4S,v22.4S
99*4757b351SPierre Pronchery	rev64	v3.4s,v3.4s
100*4757b351SPierre Pronchery	rev64	v2.4s,v2.4s
101*4757b351SPierre Pronchery	ext	v3.16b,v3.16b,v3.16b,#8
102*4757b351SPierre Pronchery	ext	v2.16b,v2.16b,v2.16b,#8
103*4757b351SPierre Pronchery.inst	0xce77c820	//sm4ekey v0.4S,v1.4S,v23.4S
104*4757b351SPierre Pronchery	rev64	v1.4s, v1.4s
105*4757b351SPierre Pronchery	rev64	v0.4s, v0.4s
106*4757b351SPierre Pronchery	ext	v1.16b,v1.16b,v1.16b,#8
107*4757b351SPierre Pronchery	ext	v0.16b,v0.16b,v0.16b,#8
108*4757b351SPierre Pronchery	st1	{v0.4s,v1.4s,v2.4s,v3.4s},[x1],64
109*4757b351SPierre Pronchery	st1	{v4.4s,v5.4s,v6.4s,v7.4s},[x1]
110*4757b351SPierre Pronchery	ret
111*4757b351SPierre Pronchery.size	sm4_v8_set_decrypt_key,.-sm4_v8_set_decrypt_key
112*4757b351SPierre Pronchery.globl	sm4_v8_encrypt
113*4757b351SPierre Pronchery.type	sm4_v8_encrypt,%function
114*4757b351SPierre Pronchery.align	5
115*4757b351SPierre Proncherysm4_v8_encrypt:
116*4757b351SPierre Pronchery	AARCH64_VALID_CALL_TARGET
117*4757b351SPierre Pronchery	ld1	{v16.4s},[x0]
118*4757b351SPierre Pronchery	ld1	{v0.4s,v1.4s,v2.4s,v3.4s},[x2],64
119*4757b351SPierre Pronchery	ld1	{v4.4s,v5.4s,v6.4s,v7.4s},[x2]
120*4757b351SPierre Pronchery#ifndef __AARCH64EB__
121*4757b351SPierre Pronchery	rev32	v16.16b,v16.16b
122*4757b351SPierre Pronchery#endif
123*4757b351SPierre Pronchery.inst	0xcec08410	//sm4e v16.4s,v0.4s
124*4757b351SPierre Pronchery.inst	0xcec08430	//sm4e v16.4s,v1.4s
125*4757b351SPierre Pronchery.inst	0xcec08450	//sm4e v16.4s,v2.4s
126*4757b351SPierre Pronchery.inst	0xcec08470	//sm4e v16.4s,v3.4s
127*4757b351SPierre Pronchery.inst	0xcec08490	//sm4e v16.4s,v4.4s
128*4757b351SPierre Pronchery.inst	0xcec084b0	//sm4e v16.4s,v5.4s
129*4757b351SPierre Pronchery.inst	0xcec084d0	//sm4e v16.4s,v6.4s
130*4757b351SPierre Pronchery.inst	0xcec084f0	//sm4e v16.4s,v7.4s
131*4757b351SPierre Pronchery	rev64	v16.4S,v16.4S
132*4757b351SPierre Pronchery	ext	v16.16b,v16.16b,v16.16b,#8
133*4757b351SPierre Pronchery#ifndef __AARCH64EB__
134*4757b351SPierre Pronchery	rev32	v16.16b,v16.16b
135*4757b351SPierre Pronchery#endif
136*4757b351SPierre Pronchery	st1	{v16.4s},[x1]
137*4757b351SPierre Pronchery	ret
138*4757b351SPierre Pronchery.size	sm4_v8_encrypt,.-sm4_v8_encrypt
139*4757b351SPierre Pronchery.globl	sm4_v8_decrypt
140*4757b351SPierre Pronchery.type	sm4_v8_decrypt,%function
141*4757b351SPierre Pronchery.align	5
142*4757b351SPierre Proncherysm4_v8_decrypt:
143*4757b351SPierre Pronchery	AARCH64_VALID_CALL_TARGET
144*4757b351SPierre Pronchery	ld1	{v16.4s},[x0]
145*4757b351SPierre Pronchery	ld1	{v0.4s,v1.4s,v2.4s,v3.4s},[x2],64
146*4757b351SPierre Pronchery	ld1	{v4.4s,v5.4s,v6.4s,v7.4s},[x2]
147*4757b351SPierre Pronchery#ifndef __AARCH64EB__
148*4757b351SPierre Pronchery	rev32	v16.16b,v16.16b
149*4757b351SPierre Pronchery#endif
150*4757b351SPierre Pronchery.inst	0xcec08410	//sm4e v16.4s,v0.4s
151*4757b351SPierre Pronchery.inst	0xcec08430	//sm4e v16.4s,v1.4s
152*4757b351SPierre Pronchery.inst	0xcec08450	//sm4e v16.4s,v2.4s
153*4757b351SPierre Pronchery.inst	0xcec08470	//sm4e v16.4s,v3.4s
154*4757b351SPierre Pronchery.inst	0xcec08490	//sm4e v16.4s,v4.4s
155*4757b351SPierre Pronchery.inst	0xcec084b0	//sm4e v16.4s,v5.4s
156*4757b351SPierre Pronchery.inst	0xcec084d0	//sm4e v16.4s,v6.4s
157*4757b351SPierre Pronchery.inst	0xcec084f0	//sm4e v16.4s,v7.4s
158*4757b351SPierre Pronchery	rev64	v16.4S,v16.4S
159*4757b351SPierre Pronchery	ext	v16.16b,v16.16b,v16.16b,#8
160*4757b351SPierre Pronchery#ifndef __AARCH64EB__
161*4757b351SPierre Pronchery	rev32	v16.16b,v16.16b
162*4757b351SPierre Pronchery#endif
163*4757b351SPierre Pronchery	st1	{v16.4s},[x1]
164*4757b351SPierre Pronchery	ret
165*4757b351SPierre Pronchery.size	sm4_v8_decrypt,.-sm4_v8_decrypt
166*4757b351SPierre Pronchery.globl	sm4_v8_ecb_encrypt
167*4757b351SPierre Pronchery.type	sm4_v8_ecb_encrypt,%function
168*4757b351SPierre Pronchery.align	5
169*4757b351SPierre Proncherysm4_v8_ecb_encrypt:
170*4757b351SPierre Pronchery	AARCH64_VALID_CALL_TARGET
171*4757b351SPierre Pronchery	ld1	{v0.4s,v1.4s,v2.4s,v3.4s},[x3],#64
172*4757b351SPierre Pronchery	ld1	{v4.4s,v5.4s,v6.4s,v7.4s},[x3]
173*4757b351SPierre Pronchery1:
174*4757b351SPierre Pronchery	cmp	x2,#64
175*4757b351SPierre Pronchery	b.lt	1f
176*4757b351SPierre Pronchery	ld1	{v16.4s,v17.4s,v18.4s,v19.4s},[x0],#64
177*4757b351SPierre Pronchery	cmp	x2,#128
178*4757b351SPierre Pronchery	b.lt	2f
179*4757b351SPierre Pronchery	ld1	{v20.4s,v21.4s,v22.4s,v23.4s},[x0],#64
180*4757b351SPierre Pronchery	// 8 blocks
181*4757b351SPierre Pronchery#ifndef __AARCH64EB__
182*4757b351SPierre Pronchery	rev32	v16.16b,v16.16b
183*4757b351SPierre Pronchery#endif
184*4757b351SPierre Pronchery#ifndef __AARCH64EB__
185*4757b351SPierre Pronchery	rev32	v17.16b,v17.16b
186*4757b351SPierre Pronchery#endif
187*4757b351SPierre Pronchery#ifndef __AARCH64EB__
188*4757b351SPierre Pronchery	rev32	v18.16b,v18.16b
189*4757b351SPierre Pronchery#endif
190*4757b351SPierre Pronchery#ifndef __AARCH64EB__
191*4757b351SPierre Pronchery	rev32	v19.16b,v19.16b
192*4757b351SPierre Pronchery#endif
193*4757b351SPierre Pronchery#ifndef __AARCH64EB__
194*4757b351SPierre Pronchery	rev32	v20.16b,v20.16b
195*4757b351SPierre Pronchery#endif
196*4757b351SPierre Pronchery#ifndef __AARCH64EB__
197*4757b351SPierre Pronchery	rev32	v21.16b,v21.16b
198*4757b351SPierre Pronchery#endif
199*4757b351SPierre Pronchery#ifndef __AARCH64EB__
200*4757b351SPierre Pronchery	rev32	v22.16b,v22.16b
201*4757b351SPierre Pronchery#endif
202*4757b351SPierre Pronchery#ifndef __AARCH64EB__
203*4757b351SPierre Pronchery	rev32	v23.16b,v23.16b
204*4757b351SPierre Pronchery#endif
205*4757b351SPierre Pronchery.inst	0xcec08410	//sm4e v16.4s,v0.4s
206*4757b351SPierre Pronchery.inst	0xcec08411	//sm4e v17.4s,v0.4s
207*4757b351SPierre Pronchery.inst	0xcec08412	//sm4e v18.4s,v0.4s
208*4757b351SPierre Pronchery.inst	0xcec08413	//sm4e v19.4s,v0.4s
209*4757b351SPierre Pronchery
210*4757b351SPierre Pronchery.inst	0xcec08430	//sm4e v16.4s,v1.4s
211*4757b351SPierre Pronchery.inst	0xcec08431	//sm4e v17.4s,v1.4s
212*4757b351SPierre Pronchery.inst	0xcec08432	//sm4e v18.4s,v1.4s
213*4757b351SPierre Pronchery.inst	0xcec08433	//sm4e v19.4s,v1.4s
214*4757b351SPierre Pronchery
215*4757b351SPierre Pronchery.inst	0xcec08450	//sm4e v16.4s,v2.4s
216*4757b351SPierre Pronchery.inst	0xcec08451	//sm4e v17.4s,v2.4s
217*4757b351SPierre Pronchery.inst	0xcec08452	//sm4e v18.4s,v2.4s
218*4757b351SPierre Pronchery.inst	0xcec08453	//sm4e v19.4s,v2.4s
219*4757b351SPierre Pronchery
220*4757b351SPierre Pronchery.inst	0xcec08470	//sm4e v16.4s,v3.4s
221*4757b351SPierre Pronchery.inst	0xcec08471	//sm4e v17.4s,v3.4s
222*4757b351SPierre Pronchery.inst	0xcec08472	//sm4e v18.4s,v3.4s
223*4757b351SPierre Pronchery.inst	0xcec08473	//sm4e v19.4s,v3.4s
224*4757b351SPierre Pronchery
225*4757b351SPierre Pronchery.inst	0xcec08490	//sm4e v16.4s,v4.4s
226*4757b351SPierre Pronchery.inst	0xcec08491	//sm4e v17.4s,v4.4s
227*4757b351SPierre Pronchery.inst	0xcec08492	//sm4e v18.4s,v4.4s
228*4757b351SPierre Pronchery.inst	0xcec08493	//sm4e v19.4s,v4.4s
229*4757b351SPierre Pronchery
230*4757b351SPierre Pronchery.inst	0xcec084b0	//sm4e v16.4s,v5.4s
231*4757b351SPierre Pronchery.inst	0xcec084b1	//sm4e v17.4s,v5.4s
232*4757b351SPierre Pronchery.inst	0xcec084b2	//sm4e v18.4s,v5.4s
233*4757b351SPierre Pronchery.inst	0xcec084b3	//sm4e v19.4s,v5.4s
234*4757b351SPierre Pronchery
235*4757b351SPierre Pronchery.inst	0xcec084d0	//sm4e v16.4s,v6.4s
236*4757b351SPierre Pronchery.inst	0xcec084d1	//sm4e v17.4s,v6.4s
237*4757b351SPierre Pronchery.inst	0xcec084d2	//sm4e v18.4s,v6.4s
238*4757b351SPierre Pronchery.inst	0xcec084d3	//sm4e v19.4s,v6.4s
239*4757b351SPierre Pronchery
240*4757b351SPierre Pronchery.inst	0xcec084f0	//sm4e v16.4s,v7.4s
241*4757b351SPierre Pronchery	rev64	v16.4S,v16.4S
242*4757b351SPierre Pronchery.inst	0xcec084f1	//sm4e v17.4s,v7.4s
243*4757b351SPierre Pronchery	ext	v16.16b,v16.16b,v16.16b,#8
244*4757b351SPierre Pronchery	rev64	v17.4S,v17.4S
245*4757b351SPierre Pronchery.inst	0xcec084f2	//sm4e v18.4s,v7.4s
246*4757b351SPierre Pronchery	ext	v17.16b,v17.16b,v17.16b,#8
247*4757b351SPierre Pronchery	rev64	v18.4S,v18.4S
248*4757b351SPierre Pronchery.inst	0xcec084f3	//sm4e v19.4s,v7.4s
249*4757b351SPierre Pronchery	ext	v18.16b,v18.16b,v18.16b,#8
250*4757b351SPierre Pronchery	rev64	v19.4S,v19.4S
251*4757b351SPierre Pronchery	ext	v19.16b,v19.16b,v19.16b,#8
252*4757b351SPierre Pronchery.inst	0xcec08414	//sm4e v20.4s,v0.4s
253*4757b351SPierre Pronchery.inst	0xcec08415	//sm4e v21.4s,v0.4s
254*4757b351SPierre Pronchery.inst	0xcec08416	//sm4e v22.4s,v0.4s
255*4757b351SPierre Pronchery.inst	0xcec08417	//sm4e v23.4s,v0.4s
256*4757b351SPierre Pronchery
257*4757b351SPierre Pronchery.inst	0xcec08434	//sm4e v20.4s,v1.4s
258*4757b351SPierre Pronchery.inst	0xcec08435	//sm4e v21.4s,v1.4s
259*4757b351SPierre Pronchery.inst	0xcec08436	//sm4e v22.4s,v1.4s
260*4757b351SPierre Pronchery.inst	0xcec08437	//sm4e v23.4s,v1.4s
261*4757b351SPierre Pronchery
262*4757b351SPierre Pronchery.inst	0xcec08454	//sm4e v20.4s,v2.4s
263*4757b351SPierre Pronchery.inst	0xcec08455	//sm4e v21.4s,v2.4s
264*4757b351SPierre Pronchery.inst	0xcec08456	//sm4e v22.4s,v2.4s
265*4757b351SPierre Pronchery.inst	0xcec08457	//sm4e v23.4s,v2.4s
266*4757b351SPierre Pronchery
267*4757b351SPierre Pronchery.inst	0xcec08474	//sm4e v20.4s,v3.4s
268*4757b351SPierre Pronchery.inst	0xcec08475	//sm4e v21.4s,v3.4s
269*4757b351SPierre Pronchery.inst	0xcec08476	//sm4e v22.4s,v3.4s
270*4757b351SPierre Pronchery.inst	0xcec08477	//sm4e v23.4s,v3.4s
271*4757b351SPierre Pronchery
272*4757b351SPierre Pronchery.inst	0xcec08494	//sm4e v20.4s,v4.4s
273*4757b351SPierre Pronchery.inst	0xcec08495	//sm4e v21.4s,v4.4s
274*4757b351SPierre Pronchery.inst	0xcec08496	//sm4e v22.4s,v4.4s
275*4757b351SPierre Pronchery.inst	0xcec08497	//sm4e v23.4s,v4.4s
276*4757b351SPierre Pronchery
277*4757b351SPierre Pronchery.inst	0xcec084b4	//sm4e v20.4s,v5.4s
278*4757b351SPierre Pronchery.inst	0xcec084b5	//sm4e v21.4s,v5.4s
279*4757b351SPierre Pronchery.inst	0xcec084b6	//sm4e v22.4s,v5.4s
280*4757b351SPierre Pronchery.inst	0xcec084b7	//sm4e v23.4s,v5.4s
281*4757b351SPierre Pronchery
282*4757b351SPierre Pronchery.inst	0xcec084d4	//sm4e v20.4s,v6.4s
283*4757b351SPierre Pronchery.inst	0xcec084d5	//sm4e v21.4s,v6.4s
284*4757b351SPierre Pronchery.inst	0xcec084d6	//sm4e v22.4s,v6.4s
285*4757b351SPierre Pronchery.inst	0xcec084d7	//sm4e v23.4s,v6.4s
286*4757b351SPierre Pronchery
287*4757b351SPierre Pronchery.inst	0xcec084f4	//sm4e v20.4s,v7.4s
288*4757b351SPierre Pronchery	rev64	v20.4S,v20.4S
289*4757b351SPierre Pronchery.inst	0xcec084f5	//sm4e v21.4s,v7.4s
290*4757b351SPierre Pronchery	ext	v20.16b,v20.16b,v20.16b,#8
291*4757b351SPierre Pronchery	rev64	v21.4S,v21.4S
292*4757b351SPierre Pronchery.inst	0xcec084f6	//sm4e v22.4s,v7.4s
293*4757b351SPierre Pronchery	ext	v21.16b,v21.16b,v21.16b,#8
294*4757b351SPierre Pronchery	rev64	v22.4S,v22.4S
295*4757b351SPierre Pronchery.inst	0xcec084f7	//sm4e v23.4s,v7.4s
296*4757b351SPierre Pronchery	ext	v22.16b,v22.16b,v22.16b,#8
297*4757b351SPierre Pronchery	rev64	v23.4S,v23.4S
298*4757b351SPierre Pronchery	ext	v23.16b,v23.16b,v23.16b,#8
299*4757b351SPierre Pronchery#ifndef __AARCH64EB__
300*4757b351SPierre Pronchery	rev32	v16.16b,v16.16b
301*4757b351SPierre Pronchery#endif
302*4757b351SPierre Pronchery#ifndef __AARCH64EB__
303*4757b351SPierre Pronchery	rev32	v17.16b,v17.16b
304*4757b351SPierre Pronchery#endif
305*4757b351SPierre Pronchery#ifndef __AARCH64EB__
306*4757b351SPierre Pronchery	rev32	v18.16b,v18.16b
307*4757b351SPierre Pronchery#endif
308*4757b351SPierre Pronchery#ifndef __AARCH64EB__
309*4757b351SPierre Pronchery	rev32	v19.16b,v19.16b
310*4757b351SPierre Pronchery#endif
311*4757b351SPierre Pronchery#ifndef __AARCH64EB__
312*4757b351SPierre Pronchery	rev32	v20.16b,v20.16b
313*4757b351SPierre Pronchery#endif
314*4757b351SPierre Pronchery#ifndef __AARCH64EB__
315*4757b351SPierre Pronchery	rev32	v21.16b,v21.16b
316*4757b351SPierre Pronchery#endif
317*4757b351SPierre Pronchery	st1	{v16.4s,v17.4s,v18.4s,v19.4s},[x1],#64
318*4757b351SPierre Pronchery#ifndef __AARCH64EB__
319*4757b351SPierre Pronchery	rev32	v22.16b,v22.16b
320*4757b351SPierre Pronchery#endif
321*4757b351SPierre Pronchery#ifndef __AARCH64EB__
322*4757b351SPierre Pronchery	rev32	v23.16b,v23.16b
323*4757b351SPierre Pronchery#endif
324*4757b351SPierre Pronchery	st1	{v20.4s,v21.4s,v22.4s,v23.4s},[x1],#64
325*4757b351SPierre Pronchery	subs	x2,x2,#128
326*4757b351SPierre Pronchery	b.gt	1b
327*4757b351SPierre Pronchery	ret
328*4757b351SPierre Pronchery	// 4 blocks
329*4757b351SPierre Pronchery2:
330*4757b351SPierre Pronchery#ifndef __AARCH64EB__
331*4757b351SPierre Pronchery	rev32	v16.16b,v16.16b
332*4757b351SPierre Pronchery#endif
333*4757b351SPierre Pronchery#ifndef __AARCH64EB__
334*4757b351SPierre Pronchery	rev32	v17.16b,v17.16b
335*4757b351SPierre Pronchery#endif
336*4757b351SPierre Pronchery#ifndef __AARCH64EB__
337*4757b351SPierre Pronchery	rev32	v18.16b,v18.16b
338*4757b351SPierre Pronchery#endif
339*4757b351SPierre Pronchery#ifndef __AARCH64EB__
340*4757b351SPierre Pronchery	rev32	v19.16b,v19.16b
341*4757b351SPierre Pronchery#endif
342*4757b351SPierre Pronchery.inst	0xcec08410	//sm4e v16.4s,v0.4s
343*4757b351SPierre Pronchery.inst	0xcec08411	//sm4e v17.4s,v0.4s
344*4757b351SPierre Pronchery.inst	0xcec08412	//sm4e v18.4s,v0.4s
345*4757b351SPierre Pronchery.inst	0xcec08413	//sm4e v19.4s,v0.4s
346*4757b351SPierre Pronchery
347*4757b351SPierre Pronchery.inst	0xcec08430	//sm4e v16.4s,v1.4s
348*4757b351SPierre Pronchery.inst	0xcec08431	//sm4e v17.4s,v1.4s
349*4757b351SPierre Pronchery.inst	0xcec08432	//sm4e v18.4s,v1.4s
350*4757b351SPierre Pronchery.inst	0xcec08433	//sm4e v19.4s,v1.4s
351*4757b351SPierre Pronchery
352*4757b351SPierre Pronchery.inst	0xcec08450	//sm4e v16.4s,v2.4s
353*4757b351SPierre Pronchery.inst	0xcec08451	//sm4e v17.4s,v2.4s
354*4757b351SPierre Pronchery.inst	0xcec08452	//sm4e v18.4s,v2.4s
355*4757b351SPierre Pronchery.inst	0xcec08453	//sm4e v19.4s,v2.4s
356*4757b351SPierre Pronchery
357*4757b351SPierre Pronchery.inst	0xcec08470	//sm4e v16.4s,v3.4s
358*4757b351SPierre Pronchery.inst	0xcec08471	//sm4e v17.4s,v3.4s
359*4757b351SPierre Pronchery.inst	0xcec08472	//sm4e v18.4s,v3.4s
360*4757b351SPierre Pronchery.inst	0xcec08473	//sm4e v19.4s,v3.4s
361*4757b351SPierre Pronchery
362*4757b351SPierre Pronchery.inst	0xcec08490	//sm4e v16.4s,v4.4s
363*4757b351SPierre Pronchery.inst	0xcec08491	//sm4e v17.4s,v4.4s
364*4757b351SPierre Pronchery.inst	0xcec08492	//sm4e v18.4s,v4.4s
365*4757b351SPierre Pronchery.inst	0xcec08493	//sm4e v19.4s,v4.4s
366*4757b351SPierre Pronchery
367*4757b351SPierre Pronchery.inst	0xcec084b0	//sm4e v16.4s,v5.4s
368*4757b351SPierre Pronchery.inst	0xcec084b1	//sm4e v17.4s,v5.4s
369*4757b351SPierre Pronchery.inst	0xcec084b2	//sm4e v18.4s,v5.4s
370*4757b351SPierre Pronchery.inst	0xcec084b3	//sm4e v19.4s,v5.4s
371*4757b351SPierre Pronchery
372*4757b351SPierre Pronchery.inst	0xcec084d0	//sm4e v16.4s,v6.4s
373*4757b351SPierre Pronchery.inst	0xcec084d1	//sm4e v17.4s,v6.4s
374*4757b351SPierre Pronchery.inst	0xcec084d2	//sm4e v18.4s,v6.4s
375*4757b351SPierre Pronchery.inst	0xcec084d3	//sm4e v19.4s,v6.4s
376*4757b351SPierre Pronchery
377*4757b351SPierre Pronchery.inst	0xcec084f0	//sm4e v16.4s,v7.4s
378*4757b351SPierre Pronchery	rev64	v16.4S,v16.4S
379*4757b351SPierre Pronchery.inst	0xcec084f1	//sm4e v17.4s,v7.4s
380*4757b351SPierre Pronchery	ext	v16.16b,v16.16b,v16.16b,#8
381*4757b351SPierre Pronchery	rev64	v17.4S,v17.4S
382*4757b351SPierre Pronchery.inst	0xcec084f2	//sm4e v18.4s,v7.4s
383*4757b351SPierre Pronchery	ext	v17.16b,v17.16b,v17.16b,#8
384*4757b351SPierre Pronchery	rev64	v18.4S,v18.4S
385*4757b351SPierre Pronchery.inst	0xcec084f3	//sm4e v19.4s,v7.4s
386*4757b351SPierre Pronchery	ext	v18.16b,v18.16b,v18.16b,#8
387*4757b351SPierre Pronchery	rev64	v19.4S,v19.4S
388*4757b351SPierre Pronchery	ext	v19.16b,v19.16b,v19.16b,#8
389*4757b351SPierre Pronchery#ifndef __AARCH64EB__
390*4757b351SPierre Pronchery	rev32	v16.16b,v16.16b
391*4757b351SPierre Pronchery#endif
392*4757b351SPierre Pronchery#ifndef __AARCH64EB__
393*4757b351SPierre Pronchery	rev32	v17.16b,v17.16b
394*4757b351SPierre Pronchery#endif
395*4757b351SPierre Pronchery#ifndef __AARCH64EB__
396*4757b351SPierre Pronchery	rev32	v18.16b,v18.16b
397*4757b351SPierre Pronchery#endif
398*4757b351SPierre Pronchery#ifndef __AARCH64EB__
399*4757b351SPierre Pronchery	rev32	v19.16b,v19.16b
400*4757b351SPierre Pronchery#endif
401*4757b351SPierre Pronchery	st1	{v16.4s,v17.4s,v18.4s,v19.4s},[x1],#64
402*4757b351SPierre Pronchery	subs	x2,x2,#64
403*4757b351SPierre Pronchery	b.gt	1b
404*4757b351SPierre Pronchery1:
405*4757b351SPierre Pronchery	subs	x2,x2,#16
406*4757b351SPierre Pronchery	b.lt	1f
407*4757b351SPierre Pronchery	ld1	{v16.4s},[x0],#16
408*4757b351SPierre Pronchery#ifndef __AARCH64EB__
409*4757b351SPierre Pronchery	rev32	v16.16b,v16.16b
410*4757b351SPierre Pronchery#endif
411*4757b351SPierre Pronchery.inst	0xcec08410	//sm4e v16.4s,v0.4s
412*4757b351SPierre Pronchery.inst	0xcec08430	//sm4e v16.4s,v1.4s
413*4757b351SPierre Pronchery.inst	0xcec08450	//sm4e v16.4s,v2.4s
414*4757b351SPierre Pronchery.inst	0xcec08470	//sm4e v16.4s,v3.4s
415*4757b351SPierre Pronchery.inst	0xcec08490	//sm4e v16.4s,v4.4s
416*4757b351SPierre Pronchery.inst	0xcec084b0	//sm4e v16.4s,v5.4s
417*4757b351SPierre Pronchery.inst	0xcec084d0	//sm4e v16.4s,v6.4s
418*4757b351SPierre Pronchery.inst	0xcec084f0	//sm4e v16.4s,v7.4s
419*4757b351SPierre Pronchery	rev64	v16.4S,v16.4S
420*4757b351SPierre Pronchery	ext	v16.16b,v16.16b,v16.16b,#8
421*4757b351SPierre Pronchery#ifndef __AARCH64EB__
422*4757b351SPierre Pronchery	rev32	v16.16b,v16.16b
423*4757b351SPierre Pronchery#endif
424*4757b351SPierre Pronchery	st1	{v16.4s},[x1],#16
425*4757b351SPierre Pronchery	b.ne	1b
426*4757b351SPierre Pronchery1:
427*4757b351SPierre Pronchery	ret
428*4757b351SPierre Pronchery.size	sm4_v8_ecb_encrypt,.-sm4_v8_ecb_encrypt
429*4757b351SPierre Pronchery.globl	sm4_v8_cbc_encrypt
430*4757b351SPierre Pronchery.type	sm4_v8_cbc_encrypt,%function
431*4757b351SPierre Pronchery.align	5
432*4757b351SPierre Proncherysm4_v8_cbc_encrypt:
433*4757b351SPierre Pronchery	AARCH64_VALID_CALL_TARGET
434*4757b351SPierre Pronchery	stp	d8,d9,[sp, #-16]!
435*4757b351SPierre Pronchery
436*4757b351SPierre Pronchery	ld1	{v0.4s,v1.4s,v2.4s,v3.4s},[x3],#64
437*4757b351SPierre Pronchery	ld1	{v4.4s,v5.4s,v6.4s,v7.4s},[x3]
438*4757b351SPierre Pronchery	ld1	{v8.4s},[x4]
439*4757b351SPierre Pronchery	cmp	w5,#0
440*4757b351SPierre Pronchery	b.eq	.Ldec
441*4757b351SPierre Pronchery1:
442*4757b351SPierre Pronchery	cmp	x2, #64
443*4757b351SPierre Pronchery	b.lt	1f
444*4757b351SPierre Pronchery	ld1	{v16.4s,v17.4s,v18.4s,v19.4s},[x0],#64
445*4757b351SPierre Pronchery	eor	v16.16b,v16.16b,v8.16b
446*4757b351SPierre Pronchery#ifndef __AARCH64EB__
447*4757b351SPierre Pronchery	rev32	v17.16b,v17.16b
448*4757b351SPierre Pronchery#endif
449*4757b351SPierre Pronchery#ifndef __AARCH64EB__
450*4757b351SPierre Pronchery	rev32	v16.16b,v16.16b
451*4757b351SPierre Pronchery#endif
452*4757b351SPierre Pronchery#ifndef __AARCH64EB__
453*4757b351SPierre Pronchery	rev32	v18.16b,v18.16b
454*4757b351SPierre Pronchery#endif
455*4757b351SPierre Pronchery#ifndef __AARCH64EB__
456*4757b351SPierre Pronchery	rev32	v19.16b,v19.16b
457*4757b351SPierre Pronchery#endif
458*4757b351SPierre Pronchery.inst	0xcec08410	//sm4e v16.4s,v0.4s
459*4757b351SPierre Pronchery.inst	0xcec08430	//sm4e v16.4s,v1.4s
460*4757b351SPierre Pronchery.inst	0xcec08450	//sm4e v16.4s,v2.4s
461*4757b351SPierre Pronchery.inst	0xcec08470	//sm4e v16.4s,v3.4s
462*4757b351SPierre Pronchery.inst	0xcec08490	//sm4e v16.4s,v4.4s
463*4757b351SPierre Pronchery.inst	0xcec084b0	//sm4e v16.4s,v5.4s
464*4757b351SPierre Pronchery.inst	0xcec084d0	//sm4e v16.4s,v6.4s
465*4757b351SPierre Pronchery.inst	0xcec084f0	//sm4e v16.4s,v7.4s
466*4757b351SPierre Pronchery	rev64	v16.4S,v16.4S
467*4757b351SPierre Pronchery	ext	v16.16b,v16.16b,v16.16b,#8
468*4757b351SPierre Pronchery	eor	v17.16b,v17.16b,v16.16b
469*4757b351SPierre Pronchery.inst	0xcec08411	//sm4e v17.4s,v0.4s
470*4757b351SPierre Pronchery.inst	0xcec08431	//sm4e v17.4s,v1.4s
471*4757b351SPierre Pronchery.inst	0xcec08451	//sm4e v17.4s,v2.4s
472*4757b351SPierre Pronchery.inst	0xcec08471	//sm4e v17.4s,v3.4s
473*4757b351SPierre Pronchery.inst	0xcec08491	//sm4e v17.4s,v4.4s
474*4757b351SPierre Pronchery.inst	0xcec084b1	//sm4e v17.4s,v5.4s
475*4757b351SPierre Pronchery.inst	0xcec084d1	//sm4e v17.4s,v6.4s
476*4757b351SPierre Pronchery.inst	0xcec084f1	//sm4e v17.4s,v7.4s
477*4757b351SPierre Pronchery	rev64	v17.4S,v17.4S
478*4757b351SPierre Pronchery	ext	v17.16b,v17.16b,v17.16b,#8
479*4757b351SPierre Pronchery#ifndef __AARCH64EB__
480*4757b351SPierre Pronchery	rev32	v16.16b,v16.16b
481*4757b351SPierre Pronchery#endif
482*4757b351SPierre Pronchery	eor	v18.16b,v18.16b,v17.16b
483*4757b351SPierre Pronchery.inst	0xcec08412	//sm4e v18.4s,v0.4s
484*4757b351SPierre Pronchery.inst	0xcec08432	//sm4e v18.4s,v1.4s
485*4757b351SPierre Pronchery.inst	0xcec08452	//sm4e v18.4s,v2.4s
486*4757b351SPierre Pronchery.inst	0xcec08472	//sm4e v18.4s,v3.4s
487*4757b351SPierre Pronchery.inst	0xcec08492	//sm4e v18.4s,v4.4s
488*4757b351SPierre Pronchery.inst	0xcec084b2	//sm4e v18.4s,v5.4s
489*4757b351SPierre Pronchery.inst	0xcec084d2	//sm4e v18.4s,v6.4s
490*4757b351SPierre Pronchery.inst	0xcec084f2	//sm4e v18.4s,v7.4s
491*4757b351SPierre Pronchery	rev64	v18.4S,v18.4S
492*4757b351SPierre Pronchery	ext	v18.16b,v18.16b,v18.16b,#8
493*4757b351SPierre Pronchery#ifndef __AARCH64EB__
494*4757b351SPierre Pronchery	rev32	v17.16b,v17.16b
495*4757b351SPierre Pronchery#endif
496*4757b351SPierre Pronchery	eor	v19.16b,v19.16b,v18.16b
497*4757b351SPierre Pronchery.inst	0xcec08413	//sm4e v19.4s,v0.4s
498*4757b351SPierre Pronchery.inst	0xcec08433	//sm4e v19.4s,v1.4s
499*4757b351SPierre Pronchery.inst	0xcec08453	//sm4e v19.4s,v2.4s
500*4757b351SPierre Pronchery.inst	0xcec08473	//sm4e v19.4s,v3.4s
501*4757b351SPierre Pronchery.inst	0xcec08493	//sm4e v19.4s,v4.4s
502*4757b351SPierre Pronchery.inst	0xcec084b3	//sm4e v19.4s,v5.4s
503*4757b351SPierre Pronchery.inst	0xcec084d3	//sm4e v19.4s,v6.4s
504*4757b351SPierre Pronchery.inst	0xcec084f3	//sm4e v19.4s,v7.4s
505*4757b351SPierre Pronchery	rev64	v19.4S,v19.4S
506*4757b351SPierre Pronchery	ext	v19.16b,v19.16b,v19.16b,#8
507*4757b351SPierre Pronchery#ifndef __AARCH64EB__
508*4757b351SPierre Pronchery	rev32	v18.16b,v18.16b
509*4757b351SPierre Pronchery#endif
510*4757b351SPierre Pronchery#ifndef __AARCH64EB__
511*4757b351SPierre Pronchery	rev32	v19.16b,v19.16b
512*4757b351SPierre Pronchery#endif
513*4757b351SPierre Pronchery	mov	v8.16b,v19.16b
514*4757b351SPierre Pronchery	st1	{v16.4s,v17.4s,v18.4s,v19.4s},[x1],#64
515*4757b351SPierre Pronchery	subs	x2,x2,#64
516*4757b351SPierre Pronchery	b.ne	1b
517*4757b351SPierre Pronchery1:
518*4757b351SPierre Pronchery	subs	x2,x2,#16
519*4757b351SPierre Pronchery	b.lt	3f
520*4757b351SPierre Pronchery	ld1	{v16.4s},[x0],#16
521*4757b351SPierre Pronchery	eor	v8.16b,v8.16b,v16.16b
522*4757b351SPierre Pronchery#ifndef __AARCH64EB__
523*4757b351SPierre Pronchery	rev32	v8.16b,v8.16b
524*4757b351SPierre Pronchery#endif
525*4757b351SPierre Pronchery.inst	0xcec08408	//sm4e v8.4s,v0.4s
526*4757b351SPierre Pronchery.inst	0xcec08428	//sm4e v8.4s,v1.4s
527*4757b351SPierre Pronchery.inst	0xcec08448	//sm4e v8.4s,v2.4s
528*4757b351SPierre Pronchery.inst	0xcec08468	//sm4e v8.4s,v3.4s
529*4757b351SPierre Pronchery.inst	0xcec08488	//sm4e v8.4s,v4.4s
530*4757b351SPierre Pronchery.inst	0xcec084a8	//sm4e v8.4s,v5.4s
531*4757b351SPierre Pronchery.inst	0xcec084c8	//sm4e v8.4s,v6.4s
532*4757b351SPierre Pronchery.inst	0xcec084e8	//sm4e v8.4s,v7.4s
533*4757b351SPierre Pronchery	rev64	v8.4S,v8.4S
534*4757b351SPierre Pronchery	ext	v8.16b,v8.16b,v8.16b,#8
535*4757b351SPierre Pronchery#ifndef __AARCH64EB__
536*4757b351SPierre Pronchery	rev32	v8.16b,v8.16b
537*4757b351SPierre Pronchery#endif
538*4757b351SPierre Pronchery	st1	{v8.4s},[x1],#16
539*4757b351SPierre Pronchery	b.ne	1b
540*4757b351SPierre Pronchery	b	3f
541*4757b351SPierre Pronchery.Ldec:
542*4757b351SPierre Pronchery1:
543*4757b351SPierre Pronchery	cmp	x2, #64
544*4757b351SPierre Pronchery	b.lt	1f
545*4757b351SPierre Pronchery	ld1	{v16.4s,v17.4s,v18.4s,v19.4s},[x0]
546*4757b351SPierre Pronchery	ld1	{v24.4s,v25.4s,v26.4s,v27.4s},[x0],#64
547*4757b351SPierre Pronchery	cmp	x2,#128
548*4757b351SPierre Pronchery	b.lt	2f
549*4757b351SPierre Pronchery	// 8 blocks mode
550*4757b351SPierre Pronchery	ld1	{v20.4s,v21.4s,v22.4s,v23.4s},[x0]
551*4757b351SPierre Pronchery	ld1	{v28.4s,v29.4s,v30.4s,v31.4s},[x0],#64
552*4757b351SPierre Pronchery#ifndef __AARCH64EB__
553*4757b351SPierre Pronchery	rev32	v16.16b,v16.16b
554*4757b351SPierre Pronchery#endif
555*4757b351SPierre Pronchery#ifndef __AARCH64EB__
556*4757b351SPierre Pronchery	rev32	v17.16b,v17.16b
557*4757b351SPierre Pronchery#endif
558*4757b351SPierre Pronchery#ifndef __AARCH64EB__
559*4757b351SPierre Pronchery	rev32	v18.16b,v18.16b
560*4757b351SPierre Pronchery#endif
561*4757b351SPierre Pronchery#ifndef __AARCH64EB__
562*4757b351SPierre Pronchery	rev32	v19.16b,v19.16b
563*4757b351SPierre Pronchery#endif
564*4757b351SPierre Pronchery#ifndef __AARCH64EB__
565*4757b351SPierre Pronchery	rev32	v20.16b,v20.16b
566*4757b351SPierre Pronchery#endif
567*4757b351SPierre Pronchery#ifndef __AARCH64EB__
568*4757b351SPierre Pronchery	rev32	v21.16b,v21.16b
569*4757b351SPierre Pronchery#endif
570*4757b351SPierre Pronchery#ifndef __AARCH64EB__
571*4757b351SPierre Pronchery	rev32	v22.16b,v22.16b
572*4757b351SPierre Pronchery#endif
573*4757b351SPierre Pronchery#ifndef __AARCH64EB__
574*4757b351SPierre Pronchery	rev32	v23.16b,v23.16b
575*4757b351SPierre Pronchery#endif
576*4757b351SPierre Pronchery.inst	0xcec08410	//sm4e v16.4s,v0.4s
577*4757b351SPierre Pronchery.inst	0xcec08411	//sm4e v17.4s,v0.4s
578*4757b351SPierre Pronchery.inst	0xcec08412	//sm4e v18.4s,v0.4s
579*4757b351SPierre Pronchery.inst	0xcec08413	//sm4e v19.4s,v0.4s
580*4757b351SPierre Pronchery
581*4757b351SPierre Pronchery.inst	0xcec08430	//sm4e v16.4s,v1.4s
582*4757b351SPierre Pronchery.inst	0xcec08431	//sm4e v17.4s,v1.4s
583*4757b351SPierre Pronchery.inst	0xcec08432	//sm4e v18.4s,v1.4s
584*4757b351SPierre Pronchery.inst	0xcec08433	//sm4e v19.4s,v1.4s
585*4757b351SPierre Pronchery
586*4757b351SPierre Pronchery.inst	0xcec08450	//sm4e v16.4s,v2.4s
587*4757b351SPierre Pronchery.inst	0xcec08451	//sm4e v17.4s,v2.4s
588*4757b351SPierre Pronchery.inst	0xcec08452	//sm4e v18.4s,v2.4s
589*4757b351SPierre Pronchery.inst	0xcec08453	//sm4e v19.4s,v2.4s
590*4757b351SPierre Pronchery
591*4757b351SPierre Pronchery.inst	0xcec08470	//sm4e v16.4s,v3.4s
592*4757b351SPierre Pronchery.inst	0xcec08471	//sm4e v17.4s,v3.4s
593*4757b351SPierre Pronchery.inst	0xcec08472	//sm4e v18.4s,v3.4s
594*4757b351SPierre Pronchery.inst	0xcec08473	//sm4e v19.4s,v3.4s
595*4757b351SPierre Pronchery
596*4757b351SPierre Pronchery.inst	0xcec08490	//sm4e v16.4s,v4.4s
597*4757b351SPierre Pronchery.inst	0xcec08491	//sm4e v17.4s,v4.4s
598*4757b351SPierre Pronchery.inst	0xcec08492	//sm4e v18.4s,v4.4s
599*4757b351SPierre Pronchery.inst	0xcec08493	//sm4e v19.4s,v4.4s
600*4757b351SPierre Pronchery
601*4757b351SPierre Pronchery.inst	0xcec084b0	//sm4e v16.4s,v5.4s
602*4757b351SPierre Pronchery.inst	0xcec084b1	//sm4e v17.4s,v5.4s
603*4757b351SPierre Pronchery.inst	0xcec084b2	//sm4e v18.4s,v5.4s
604*4757b351SPierre Pronchery.inst	0xcec084b3	//sm4e v19.4s,v5.4s
605*4757b351SPierre Pronchery
606*4757b351SPierre Pronchery.inst	0xcec084d0	//sm4e v16.4s,v6.4s
607*4757b351SPierre Pronchery.inst	0xcec084d1	//sm4e v17.4s,v6.4s
608*4757b351SPierre Pronchery.inst	0xcec084d2	//sm4e v18.4s,v6.4s
609*4757b351SPierre Pronchery.inst	0xcec084d3	//sm4e v19.4s,v6.4s
610*4757b351SPierre Pronchery
611*4757b351SPierre Pronchery.inst	0xcec084f0	//sm4e v16.4s,v7.4s
612*4757b351SPierre Pronchery	rev64	v16.4S,v16.4S
613*4757b351SPierre Pronchery.inst	0xcec084f1	//sm4e v17.4s,v7.4s
614*4757b351SPierre Pronchery	ext	v16.16b,v16.16b,v16.16b,#8
615*4757b351SPierre Pronchery	rev64	v17.4S,v17.4S
616*4757b351SPierre Pronchery.inst	0xcec084f2	//sm4e v18.4s,v7.4s
617*4757b351SPierre Pronchery	ext	v17.16b,v17.16b,v17.16b,#8
618*4757b351SPierre Pronchery	rev64	v18.4S,v18.4S
619*4757b351SPierre Pronchery.inst	0xcec084f3	//sm4e v19.4s,v7.4s
620*4757b351SPierre Pronchery	ext	v18.16b,v18.16b,v18.16b,#8
621*4757b351SPierre Pronchery	rev64	v19.4S,v19.4S
622*4757b351SPierre Pronchery	ext	v19.16b,v19.16b,v19.16b,#8
623*4757b351SPierre Pronchery.inst	0xcec08414	//sm4e v20.4s,v0.4s
624*4757b351SPierre Pronchery.inst	0xcec08415	//sm4e v21.4s,v0.4s
625*4757b351SPierre Pronchery.inst	0xcec08416	//sm4e v22.4s,v0.4s
626*4757b351SPierre Pronchery.inst	0xcec08417	//sm4e v23.4s,v0.4s
627*4757b351SPierre Pronchery
628*4757b351SPierre Pronchery.inst	0xcec08434	//sm4e v20.4s,v1.4s
629*4757b351SPierre Pronchery.inst	0xcec08435	//sm4e v21.4s,v1.4s
630*4757b351SPierre Pronchery.inst	0xcec08436	//sm4e v22.4s,v1.4s
631*4757b351SPierre Pronchery.inst	0xcec08437	//sm4e v23.4s,v1.4s
632*4757b351SPierre Pronchery
633*4757b351SPierre Pronchery.inst	0xcec08454	//sm4e v20.4s,v2.4s
634*4757b351SPierre Pronchery.inst	0xcec08455	//sm4e v21.4s,v2.4s
635*4757b351SPierre Pronchery.inst	0xcec08456	//sm4e v22.4s,v2.4s
636*4757b351SPierre Pronchery.inst	0xcec08457	//sm4e v23.4s,v2.4s
637*4757b351SPierre Pronchery
638*4757b351SPierre Pronchery.inst	0xcec08474	//sm4e v20.4s,v3.4s
639*4757b351SPierre Pronchery.inst	0xcec08475	//sm4e v21.4s,v3.4s
640*4757b351SPierre Pronchery.inst	0xcec08476	//sm4e v22.4s,v3.4s
641*4757b351SPierre Pronchery.inst	0xcec08477	//sm4e v23.4s,v3.4s
642*4757b351SPierre Pronchery
643*4757b351SPierre Pronchery.inst	0xcec08494	//sm4e v20.4s,v4.4s
644*4757b351SPierre Pronchery.inst	0xcec08495	//sm4e v21.4s,v4.4s
645*4757b351SPierre Pronchery.inst	0xcec08496	//sm4e v22.4s,v4.4s
646*4757b351SPierre Pronchery.inst	0xcec08497	//sm4e v23.4s,v4.4s
647*4757b351SPierre Pronchery
648*4757b351SPierre Pronchery.inst	0xcec084b4	//sm4e v20.4s,v5.4s
649*4757b351SPierre Pronchery.inst	0xcec084b5	//sm4e v21.4s,v5.4s
650*4757b351SPierre Pronchery.inst	0xcec084b6	//sm4e v22.4s,v5.4s
651*4757b351SPierre Pronchery.inst	0xcec084b7	//sm4e v23.4s,v5.4s
652*4757b351SPierre Pronchery
653*4757b351SPierre Pronchery.inst	0xcec084d4	//sm4e v20.4s,v6.4s
654*4757b351SPierre Pronchery.inst	0xcec084d5	//sm4e v21.4s,v6.4s
655*4757b351SPierre Pronchery.inst	0xcec084d6	//sm4e v22.4s,v6.4s
656*4757b351SPierre Pronchery.inst	0xcec084d7	//sm4e v23.4s,v6.4s
657*4757b351SPierre Pronchery
658*4757b351SPierre Pronchery.inst	0xcec084f4	//sm4e v20.4s,v7.4s
659*4757b351SPierre Pronchery	rev64	v20.4S,v20.4S
660*4757b351SPierre Pronchery.inst	0xcec084f5	//sm4e v21.4s,v7.4s
661*4757b351SPierre Pronchery	ext	v20.16b,v20.16b,v20.16b,#8
662*4757b351SPierre Pronchery	rev64	v21.4S,v21.4S
663*4757b351SPierre Pronchery.inst	0xcec084f6	//sm4e v22.4s,v7.4s
664*4757b351SPierre Pronchery	ext	v21.16b,v21.16b,v21.16b,#8
665*4757b351SPierre Pronchery	rev64	v22.4S,v22.4S
666*4757b351SPierre Pronchery.inst	0xcec084f7	//sm4e v23.4s,v7.4s
667*4757b351SPierre Pronchery	ext	v22.16b,v22.16b,v22.16b,#8
668*4757b351SPierre Pronchery	rev64	v23.4S,v23.4S
669*4757b351SPierre Pronchery	ext	v23.16b,v23.16b,v23.16b,#8
670*4757b351SPierre Pronchery#ifndef __AARCH64EB__
671*4757b351SPierre Pronchery	rev32	v16.16b,v16.16b
672*4757b351SPierre Pronchery#endif
673*4757b351SPierre Pronchery#ifndef __AARCH64EB__
674*4757b351SPierre Pronchery	rev32	v17.16b,v17.16b
675*4757b351SPierre Pronchery#endif
676*4757b351SPierre Pronchery#ifndef __AARCH64EB__
677*4757b351SPierre Pronchery	rev32	v18.16b,v18.16b
678*4757b351SPierre Pronchery#endif
679*4757b351SPierre Pronchery#ifndef __AARCH64EB__
680*4757b351SPierre Pronchery	rev32	v19.16b,v19.16b
681*4757b351SPierre Pronchery#endif
682*4757b351SPierre Pronchery#ifndef __AARCH64EB__
683*4757b351SPierre Pronchery	rev32	v20.16b,v20.16b
684*4757b351SPierre Pronchery#endif
685*4757b351SPierre Pronchery#ifndef __AARCH64EB__
686*4757b351SPierre Pronchery	rev32	v21.16b,v21.16b
687*4757b351SPierre Pronchery#endif
688*4757b351SPierre Pronchery#ifndef __AARCH64EB__
689*4757b351SPierre Pronchery	rev32	v22.16b,v22.16b
690*4757b351SPierre Pronchery#endif
691*4757b351SPierre Pronchery#ifndef __AARCH64EB__
692*4757b351SPierre Pronchery	rev32	v23.16b,v23.16b
693*4757b351SPierre Pronchery#endif
694*4757b351SPierre Pronchery	eor	v16.16b,v16.16b,v8.16b
695*4757b351SPierre Pronchery	eor	v17.16b,v17.16b,v24.16b
696*4757b351SPierre Pronchery	eor	v18.16b,v18.16b,v25.16b
697*4757b351SPierre Pronchery	mov	v8.16b,v31.16b
698*4757b351SPierre Pronchery	eor	v19.16b,v19.16b,v26.16b
699*4757b351SPierre Pronchery	eor	v20.16b,v20.16b,v27.16b
700*4757b351SPierre Pronchery	eor	v21.16b,v21.16b,v28.16b
701*4757b351SPierre Pronchery	eor	v22.16b,v22.16b,v29.16b
702*4757b351SPierre Pronchery	eor	v23.16b,v23.16b,v30.16b
703*4757b351SPierre Pronchery	st1	{v16.4s,v17.4s,v18.4s,v19.4s},[x1],#64
704*4757b351SPierre Pronchery	st1	{v20.4s,v21.4s,v22.4s,v23.4s},[x1],#64
705*4757b351SPierre Pronchery	subs	x2,x2,128
706*4757b351SPierre Pronchery	b.gt	1b
707*4757b351SPierre Pronchery	b	3f
708*4757b351SPierre Pronchery	// 4 blocks mode
709*4757b351SPierre Pronchery2:
710*4757b351SPierre Pronchery#ifndef __AARCH64EB__
711*4757b351SPierre Pronchery	rev32	v16.16b,v16.16b
712*4757b351SPierre Pronchery#endif
713*4757b351SPierre Pronchery#ifndef __AARCH64EB__
714*4757b351SPierre Pronchery	rev32	v17.16b,v17.16b
715*4757b351SPierre Pronchery#endif
716*4757b351SPierre Pronchery#ifndef __AARCH64EB__
717*4757b351SPierre Pronchery	rev32	v18.16b,v18.16b
718*4757b351SPierre Pronchery#endif
719*4757b351SPierre Pronchery#ifndef __AARCH64EB__
720*4757b351SPierre Pronchery	rev32	v19.16b,v19.16b
721*4757b351SPierre Pronchery#endif
722*4757b351SPierre Pronchery.inst	0xcec08410	//sm4e v16.4s,v0.4s
723*4757b351SPierre Pronchery.inst	0xcec08411	//sm4e v17.4s,v0.4s
724*4757b351SPierre Pronchery.inst	0xcec08412	//sm4e v18.4s,v0.4s
725*4757b351SPierre Pronchery.inst	0xcec08413	//sm4e v19.4s,v0.4s
726*4757b351SPierre Pronchery
727*4757b351SPierre Pronchery.inst	0xcec08430	//sm4e v16.4s,v1.4s
728*4757b351SPierre Pronchery.inst	0xcec08431	//sm4e v17.4s,v1.4s
729*4757b351SPierre Pronchery.inst	0xcec08432	//sm4e v18.4s,v1.4s
730*4757b351SPierre Pronchery.inst	0xcec08433	//sm4e v19.4s,v1.4s
731*4757b351SPierre Pronchery
732*4757b351SPierre Pronchery.inst	0xcec08450	//sm4e v16.4s,v2.4s
733*4757b351SPierre Pronchery.inst	0xcec08451	//sm4e v17.4s,v2.4s
734*4757b351SPierre Pronchery.inst	0xcec08452	//sm4e v18.4s,v2.4s
735*4757b351SPierre Pronchery.inst	0xcec08453	//sm4e v19.4s,v2.4s
736*4757b351SPierre Pronchery
737*4757b351SPierre Pronchery.inst	0xcec08470	//sm4e v16.4s,v3.4s
738*4757b351SPierre Pronchery.inst	0xcec08471	//sm4e v17.4s,v3.4s
739*4757b351SPierre Pronchery.inst	0xcec08472	//sm4e v18.4s,v3.4s
740*4757b351SPierre Pronchery.inst	0xcec08473	//sm4e v19.4s,v3.4s
741*4757b351SPierre Pronchery
742*4757b351SPierre Pronchery.inst	0xcec08490	//sm4e v16.4s,v4.4s
743*4757b351SPierre Pronchery.inst	0xcec08491	//sm4e v17.4s,v4.4s
744*4757b351SPierre Pronchery.inst	0xcec08492	//sm4e v18.4s,v4.4s
745*4757b351SPierre Pronchery.inst	0xcec08493	//sm4e v19.4s,v4.4s
746*4757b351SPierre Pronchery
747*4757b351SPierre Pronchery.inst	0xcec084b0	//sm4e v16.4s,v5.4s
748*4757b351SPierre Pronchery.inst	0xcec084b1	//sm4e v17.4s,v5.4s
749*4757b351SPierre Pronchery.inst	0xcec084b2	//sm4e v18.4s,v5.4s
750*4757b351SPierre Pronchery.inst	0xcec084b3	//sm4e v19.4s,v5.4s
751*4757b351SPierre Pronchery
752*4757b351SPierre Pronchery.inst	0xcec084d0	//sm4e v16.4s,v6.4s
753*4757b351SPierre Pronchery.inst	0xcec084d1	//sm4e v17.4s,v6.4s
754*4757b351SPierre Pronchery.inst	0xcec084d2	//sm4e v18.4s,v6.4s
755*4757b351SPierre Pronchery.inst	0xcec084d3	//sm4e v19.4s,v6.4s
756*4757b351SPierre Pronchery
757*4757b351SPierre Pronchery.inst	0xcec084f0	//sm4e v16.4s,v7.4s
758*4757b351SPierre Pronchery	rev64	v16.4S,v16.4S
759*4757b351SPierre Pronchery.inst	0xcec084f1	//sm4e v17.4s,v7.4s
760*4757b351SPierre Pronchery	ext	v16.16b,v16.16b,v16.16b,#8
761*4757b351SPierre Pronchery	rev64	v17.4S,v17.4S
762*4757b351SPierre Pronchery.inst	0xcec084f2	//sm4e v18.4s,v7.4s
763*4757b351SPierre Pronchery	ext	v17.16b,v17.16b,v17.16b,#8
764*4757b351SPierre Pronchery	rev64	v18.4S,v18.4S
765*4757b351SPierre Pronchery.inst	0xcec084f3	//sm4e v19.4s,v7.4s
766*4757b351SPierre Pronchery	ext	v18.16b,v18.16b,v18.16b,#8
767*4757b351SPierre Pronchery	rev64	v19.4S,v19.4S
768*4757b351SPierre Pronchery	ext	v19.16b,v19.16b,v19.16b,#8
769*4757b351SPierre Pronchery#ifndef __AARCH64EB__
770*4757b351SPierre Pronchery	rev32	v16.16b,v16.16b
771*4757b351SPierre Pronchery#endif
772*4757b351SPierre Pronchery#ifndef __AARCH64EB__
773*4757b351SPierre Pronchery	rev32	v17.16b,v17.16b
774*4757b351SPierre Pronchery#endif
775*4757b351SPierre Pronchery#ifndef __AARCH64EB__
776*4757b351SPierre Pronchery	rev32	v18.16b,v18.16b
777*4757b351SPierre Pronchery#endif
778*4757b351SPierre Pronchery#ifndef __AARCH64EB__
779*4757b351SPierre Pronchery	rev32	v19.16b,v19.16b
780*4757b351SPierre Pronchery#endif
781*4757b351SPierre Pronchery	eor	v16.16b,v16.16b,v8.16b
782*4757b351SPierre Pronchery	eor	v17.16b,v17.16b,v24.16b
783*4757b351SPierre Pronchery	mov	v8.16b,v27.16b
784*4757b351SPierre Pronchery	eor	v18.16b,v18.16b,v25.16b
785*4757b351SPierre Pronchery	eor	v19.16b,v19.16b,v26.16b
786*4757b351SPierre Pronchery	st1	{v16.4s,v17.4s,v18.4s,v19.4s},[x1],#64
787*4757b351SPierre Pronchery	subs	x2,x2,#64
788*4757b351SPierre Pronchery	b.gt	1b
789*4757b351SPierre Pronchery1:
790*4757b351SPierre Pronchery	subs	x2,x2,#16
791*4757b351SPierre Pronchery	b.lt	3f
792*4757b351SPierre Pronchery	ld1	{v16.4s},[x0],#16
793*4757b351SPierre Pronchery	mov	v24.16b,v16.16b
794*4757b351SPierre Pronchery#ifndef __AARCH64EB__
795*4757b351SPierre Pronchery	rev32	v16.16b,v16.16b
796*4757b351SPierre Pronchery#endif
797*4757b351SPierre Pronchery.inst	0xcec08410	//sm4e v16.4s,v0.4s
798*4757b351SPierre Pronchery.inst	0xcec08430	//sm4e v16.4s,v1.4s
799*4757b351SPierre Pronchery.inst	0xcec08450	//sm4e v16.4s,v2.4s
800*4757b351SPierre Pronchery.inst	0xcec08470	//sm4e v16.4s,v3.4s
801*4757b351SPierre Pronchery.inst	0xcec08490	//sm4e v16.4s,v4.4s
802*4757b351SPierre Pronchery.inst	0xcec084b0	//sm4e v16.4s,v5.4s
803*4757b351SPierre Pronchery.inst	0xcec084d0	//sm4e v16.4s,v6.4s
804*4757b351SPierre Pronchery.inst	0xcec084f0	//sm4e v16.4s,v7.4s
805*4757b351SPierre Pronchery	rev64	v16.4S,v16.4S
806*4757b351SPierre Pronchery	ext	v16.16b,v16.16b,v16.16b,#8
807*4757b351SPierre Pronchery#ifndef __AARCH64EB__
808*4757b351SPierre Pronchery	rev32	v16.16b,v16.16b
809*4757b351SPierre Pronchery#endif
810*4757b351SPierre Pronchery	eor	v16.16b,v16.16b,v8.16b
811*4757b351SPierre Pronchery	mov	v8.16b,v24.16b
812*4757b351SPierre Pronchery	st1	{v16.4s},[x1],#16
813*4757b351SPierre Pronchery	b.ne	1b
814*4757b351SPierre Pronchery3:
815*4757b351SPierre Pronchery	// save back IV
816*4757b351SPierre Pronchery	st1	{v8.4s},[x4]
817*4757b351SPierre Pronchery	ldp	d8,d9,[sp],#16
818*4757b351SPierre Pronchery	ret
819*4757b351SPierre Pronchery.size	sm4_v8_cbc_encrypt,.-sm4_v8_cbc_encrypt
820*4757b351SPierre Pronchery.globl	sm4_v8_ctr32_encrypt_blocks
821*4757b351SPierre Pronchery.type	sm4_v8_ctr32_encrypt_blocks,%function
822*4757b351SPierre Pronchery.align	5
823*4757b351SPierre Proncherysm4_v8_ctr32_encrypt_blocks:
824*4757b351SPierre Pronchery	AARCH64_VALID_CALL_TARGET
825*4757b351SPierre Pronchery	stp	d8,d9,[sp, #-16]!
826*4757b351SPierre Pronchery
827*4757b351SPierre Pronchery	ld1	{v8.4s},[x4]
828*4757b351SPierre Pronchery	ld1	{v0.4s,v1.4s,v2.4s,v3.4s},[x3],64
829*4757b351SPierre Pronchery	ld1	{v4.4s,v5.4s,v6.4s,v7.4s},[x3]
830*4757b351SPierre Pronchery#ifndef __AARCH64EB__
831*4757b351SPierre Pronchery	rev32	v8.16b,v8.16b
832*4757b351SPierre Pronchery#endif
833*4757b351SPierre Pronchery	mov	w5,v8.s[3]
834*4757b351SPierre Pronchery1:
835*4757b351SPierre Pronchery	cmp	x2,#4
836*4757b351SPierre Pronchery	b.lt	1f
837*4757b351SPierre Pronchery	ld1	{v24.4s,v25.4s,v26.4s,v27.4s},[x0],#64
838*4757b351SPierre Pronchery	mov	v16.16b,v8.16b
839*4757b351SPierre Pronchery	mov	v17.16b,v8.16b
840*4757b351SPierre Pronchery	mov	v18.16b,v8.16b
841*4757b351SPierre Pronchery	mov	v19.16b,v8.16b
842*4757b351SPierre Pronchery	add	w5,w5,#1
843*4757b351SPierre Pronchery	mov	v17.s[3],w5
844*4757b351SPierre Pronchery	add	w5,w5,#1
845*4757b351SPierre Pronchery	mov	v18.s[3],w5
846*4757b351SPierre Pronchery	add	w5,w5,#1
847*4757b351SPierre Pronchery	mov	v19.s[3],w5
848*4757b351SPierre Pronchery	cmp	x2,#8
849*4757b351SPierre Pronchery	b.lt	2f
850*4757b351SPierre Pronchery	ld1	{v28.4s,v29.4s,v30.4s,v31.4s},[x0],#64
851*4757b351SPierre Pronchery	mov	v20.16b,v8.16b
852*4757b351SPierre Pronchery	mov	v21.16b,v8.16b
853*4757b351SPierre Pronchery	mov	v22.16b,v8.16b
854*4757b351SPierre Pronchery	mov	v23.16b,v8.16b
855*4757b351SPierre Pronchery	add	w5,w5,#1
856*4757b351SPierre Pronchery	mov	v20.s[3],w5
857*4757b351SPierre Pronchery	add	w5,w5,#1
858*4757b351SPierre Pronchery	mov	v21.s[3],w5
859*4757b351SPierre Pronchery	add	w5,w5,#1
860*4757b351SPierre Pronchery	mov	v22.s[3],w5
861*4757b351SPierre Pronchery	add	w5,w5,#1
862*4757b351SPierre Pronchery	mov	v23.s[3],w5
863*4757b351SPierre Pronchery.inst	0xcec08410	//sm4e v16.4s,v0.4s
864*4757b351SPierre Pronchery.inst	0xcec08411	//sm4e v17.4s,v0.4s
865*4757b351SPierre Pronchery.inst	0xcec08412	//sm4e v18.4s,v0.4s
866*4757b351SPierre Pronchery.inst	0xcec08413	//sm4e v19.4s,v0.4s
867*4757b351SPierre Pronchery
868*4757b351SPierre Pronchery.inst	0xcec08430	//sm4e v16.4s,v1.4s
869*4757b351SPierre Pronchery.inst	0xcec08431	//sm4e v17.4s,v1.4s
870*4757b351SPierre Pronchery.inst	0xcec08432	//sm4e v18.4s,v1.4s
871*4757b351SPierre Pronchery.inst	0xcec08433	//sm4e v19.4s,v1.4s
872*4757b351SPierre Pronchery
873*4757b351SPierre Pronchery.inst	0xcec08450	//sm4e v16.4s,v2.4s
874*4757b351SPierre Pronchery.inst	0xcec08451	//sm4e v17.4s,v2.4s
875*4757b351SPierre Pronchery.inst	0xcec08452	//sm4e v18.4s,v2.4s
876*4757b351SPierre Pronchery.inst	0xcec08453	//sm4e v19.4s,v2.4s
877*4757b351SPierre Pronchery
878*4757b351SPierre Pronchery.inst	0xcec08470	//sm4e v16.4s,v3.4s
879*4757b351SPierre Pronchery.inst	0xcec08471	//sm4e v17.4s,v3.4s
880*4757b351SPierre Pronchery.inst	0xcec08472	//sm4e v18.4s,v3.4s
881*4757b351SPierre Pronchery.inst	0xcec08473	//sm4e v19.4s,v3.4s
882*4757b351SPierre Pronchery
883*4757b351SPierre Pronchery.inst	0xcec08490	//sm4e v16.4s,v4.4s
884*4757b351SPierre Pronchery.inst	0xcec08491	//sm4e v17.4s,v4.4s
885*4757b351SPierre Pronchery.inst	0xcec08492	//sm4e v18.4s,v4.4s
886*4757b351SPierre Pronchery.inst	0xcec08493	//sm4e v19.4s,v4.4s
887*4757b351SPierre Pronchery
888*4757b351SPierre Pronchery.inst	0xcec084b0	//sm4e v16.4s,v5.4s
889*4757b351SPierre Pronchery.inst	0xcec084b1	//sm4e v17.4s,v5.4s
890*4757b351SPierre Pronchery.inst	0xcec084b2	//sm4e v18.4s,v5.4s
891*4757b351SPierre Pronchery.inst	0xcec084b3	//sm4e v19.4s,v5.4s
892*4757b351SPierre Pronchery
893*4757b351SPierre Pronchery.inst	0xcec084d0	//sm4e v16.4s,v6.4s
894*4757b351SPierre Pronchery.inst	0xcec084d1	//sm4e v17.4s,v6.4s
895*4757b351SPierre Pronchery.inst	0xcec084d2	//sm4e v18.4s,v6.4s
896*4757b351SPierre Pronchery.inst	0xcec084d3	//sm4e v19.4s,v6.4s
897*4757b351SPierre Pronchery
898*4757b351SPierre Pronchery.inst	0xcec084f0	//sm4e v16.4s,v7.4s
899*4757b351SPierre Pronchery	rev64	v16.4S,v16.4S
900*4757b351SPierre Pronchery.inst	0xcec084f1	//sm4e v17.4s,v7.4s
901*4757b351SPierre Pronchery	ext	v16.16b,v16.16b,v16.16b,#8
902*4757b351SPierre Pronchery	rev64	v17.4S,v17.4S
903*4757b351SPierre Pronchery.inst	0xcec084f2	//sm4e v18.4s,v7.4s
904*4757b351SPierre Pronchery	ext	v17.16b,v17.16b,v17.16b,#8
905*4757b351SPierre Pronchery	rev64	v18.4S,v18.4S
906*4757b351SPierre Pronchery.inst	0xcec084f3	//sm4e v19.4s,v7.4s
907*4757b351SPierre Pronchery	ext	v18.16b,v18.16b,v18.16b,#8
908*4757b351SPierre Pronchery	rev64	v19.4S,v19.4S
909*4757b351SPierre Pronchery	ext	v19.16b,v19.16b,v19.16b,#8
910*4757b351SPierre Pronchery.inst	0xcec08414	//sm4e v20.4s,v0.4s
911*4757b351SPierre Pronchery.inst	0xcec08415	//sm4e v21.4s,v0.4s
912*4757b351SPierre Pronchery.inst	0xcec08416	//sm4e v22.4s,v0.4s
913*4757b351SPierre Pronchery.inst	0xcec08417	//sm4e v23.4s,v0.4s
914*4757b351SPierre Pronchery
915*4757b351SPierre Pronchery.inst	0xcec08434	//sm4e v20.4s,v1.4s
916*4757b351SPierre Pronchery.inst	0xcec08435	//sm4e v21.4s,v1.4s
917*4757b351SPierre Pronchery.inst	0xcec08436	//sm4e v22.4s,v1.4s
918*4757b351SPierre Pronchery.inst	0xcec08437	//sm4e v23.4s,v1.4s
919*4757b351SPierre Pronchery
920*4757b351SPierre Pronchery.inst	0xcec08454	//sm4e v20.4s,v2.4s
921*4757b351SPierre Pronchery.inst	0xcec08455	//sm4e v21.4s,v2.4s
922*4757b351SPierre Pronchery.inst	0xcec08456	//sm4e v22.4s,v2.4s
923*4757b351SPierre Pronchery.inst	0xcec08457	//sm4e v23.4s,v2.4s
924*4757b351SPierre Pronchery
925*4757b351SPierre Pronchery.inst	0xcec08474	//sm4e v20.4s,v3.4s
926*4757b351SPierre Pronchery.inst	0xcec08475	//sm4e v21.4s,v3.4s
927*4757b351SPierre Pronchery.inst	0xcec08476	//sm4e v22.4s,v3.4s
928*4757b351SPierre Pronchery.inst	0xcec08477	//sm4e v23.4s,v3.4s
929*4757b351SPierre Pronchery
930*4757b351SPierre Pronchery.inst	0xcec08494	//sm4e v20.4s,v4.4s
931*4757b351SPierre Pronchery.inst	0xcec08495	//sm4e v21.4s,v4.4s
932*4757b351SPierre Pronchery.inst	0xcec08496	//sm4e v22.4s,v4.4s
933*4757b351SPierre Pronchery.inst	0xcec08497	//sm4e v23.4s,v4.4s
934*4757b351SPierre Pronchery
935*4757b351SPierre Pronchery.inst	0xcec084b4	//sm4e v20.4s,v5.4s
936*4757b351SPierre Pronchery.inst	0xcec084b5	//sm4e v21.4s,v5.4s
937*4757b351SPierre Pronchery.inst	0xcec084b6	//sm4e v22.4s,v5.4s
938*4757b351SPierre Pronchery.inst	0xcec084b7	//sm4e v23.4s,v5.4s
939*4757b351SPierre Pronchery
940*4757b351SPierre Pronchery.inst	0xcec084d4	//sm4e v20.4s,v6.4s
941*4757b351SPierre Pronchery.inst	0xcec084d5	//sm4e v21.4s,v6.4s
942*4757b351SPierre Pronchery.inst	0xcec084d6	//sm4e v22.4s,v6.4s
943*4757b351SPierre Pronchery.inst	0xcec084d7	//sm4e v23.4s,v6.4s
944*4757b351SPierre Pronchery
945*4757b351SPierre Pronchery.inst	0xcec084f4	//sm4e v20.4s,v7.4s
946*4757b351SPierre Pronchery	rev64	v20.4S,v20.4S
947*4757b351SPierre Pronchery.inst	0xcec084f5	//sm4e v21.4s,v7.4s
948*4757b351SPierre Pronchery	ext	v20.16b,v20.16b,v20.16b,#8
949*4757b351SPierre Pronchery	rev64	v21.4S,v21.4S
950*4757b351SPierre Pronchery.inst	0xcec084f6	//sm4e v22.4s,v7.4s
951*4757b351SPierre Pronchery	ext	v21.16b,v21.16b,v21.16b,#8
952*4757b351SPierre Pronchery	rev64	v22.4S,v22.4S
953*4757b351SPierre Pronchery.inst	0xcec084f7	//sm4e v23.4s,v7.4s
954*4757b351SPierre Pronchery	ext	v22.16b,v22.16b,v22.16b,#8
955*4757b351SPierre Pronchery	rev64	v23.4S,v23.4S
956*4757b351SPierre Pronchery	ext	v23.16b,v23.16b,v23.16b,#8
957*4757b351SPierre Pronchery#ifndef __AARCH64EB__
958*4757b351SPierre Pronchery	rev32	v16.16b,v16.16b
959*4757b351SPierre Pronchery#endif
960*4757b351SPierre Pronchery#ifndef __AARCH64EB__
961*4757b351SPierre Pronchery	rev32	v17.16b,v17.16b
962*4757b351SPierre Pronchery#endif
963*4757b351SPierre Pronchery#ifndef __AARCH64EB__
964*4757b351SPierre Pronchery	rev32	v18.16b,v18.16b
965*4757b351SPierre Pronchery#endif
966*4757b351SPierre Pronchery#ifndef __AARCH64EB__
967*4757b351SPierre Pronchery	rev32	v19.16b,v19.16b
968*4757b351SPierre Pronchery#endif
969*4757b351SPierre Pronchery#ifndef __AARCH64EB__
970*4757b351SPierre Pronchery	rev32	v20.16b,v20.16b
971*4757b351SPierre Pronchery#endif
972*4757b351SPierre Pronchery#ifndef __AARCH64EB__
973*4757b351SPierre Pronchery	rev32	v21.16b,v21.16b
974*4757b351SPierre Pronchery#endif
975*4757b351SPierre Pronchery#ifndef __AARCH64EB__
976*4757b351SPierre Pronchery	rev32	v22.16b,v22.16b
977*4757b351SPierre Pronchery#endif
978*4757b351SPierre Pronchery#ifndef __AARCH64EB__
979*4757b351SPierre Pronchery	rev32	v23.16b,v23.16b
980*4757b351SPierre Pronchery#endif
981*4757b351SPierre Pronchery	eor	v16.16b,v16.16b,v24.16b
982*4757b351SPierre Pronchery	eor	v17.16b,v17.16b,v25.16b
983*4757b351SPierre Pronchery	eor	v18.16b,v18.16b,v26.16b
984*4757b351SPierre Pronchery	eor	v19.16b,v19.16b,v27.16b
985*4757b351SPierre Pronchery	eor	v20.16b,v20.16b,v28.16b
986*4757b351SPierre Pronchery	eor	v21.16b,v21.16b,v29.16b
987*4757b351SPierre Pronchery	eor	v22.16b,v22.16b,v30.16b
988*4757b351SPierre Pronchery	eor	v23.16b,v23.16b,v31.16b
989*4757b351SPierre Pronchery	st1	{v16.4s,v17.4s,v18.4s,v19.4s},[x1],#64
990*4757b351SPierre Pronchery	st1	{v20.4s,v21.4s,v22.4s,v23.4s},[x1],#64
991*4757b351SPierre Pronchery	subs	x2,x2,#8
992*4757b351SPierre Pronchery	b.eq	3f
993*4757b351SPierre Pronchery	add	w5,w5,#1
994*4757b351SPierre Pronchery	mov	v8.s[3],w5
995*4757b351SPierre Pronchery	b	1b
996*4757b351SPierre Pronchery2:
997*4757b351SPierre Pronchery.inst	0xcec08410	//sm4e v16.4s,v0.4s
998*4757b351SPierre Pronchery.inst	0xcec08411	//sm4e v17.4s,v0.4s
999*4757b351SPierre Pronchery.inst	0xcec08412	//sm4e v18.4s,v0.4s
1000*4757b351SPierre Pronchery.inst	0xcec08413	//sm4e v19.4s,v0.4s
1001*4757b351SPierre Pronchery
1002*4757b351SPierre Pronchery.inst	0xcec08430	//sm4e v16.4s,v1.4s
1003*4757b351SPierre Pronchery.inst	0xcec08431	//sm4e v17.4s,v1.4s
1004*4757b351SPierre Pronchery.inst	0xcec08432	//sm4e v18.4s,v1.4s
1005*4757b351SPierre Pronchery.inst	0xcec08433	//sm4e v19.4s,v1.4s
1006*4757b351SPierre Pronchery
1007*4757b351SPierre Pronchery.inst	0xcec08450	//sm4e v16.4s,v2.4s
1008*4757b351SPierre Pronchery.inst	0xcec08451	//sm4e v17.4s,v2.4s
1009*4757b351SPierre Pronchery.inst	0xcec08452	//sm4e v18.4s,v2.4s
1010*4757b351SPierre Pronchery.inst	0xcec08453	//sm4e v19.4s,v2.4s
1011*4757b351SPierre Pronchery
1012*4757b351SPierre Pronchery.inst	0xcec08470	//sm4e v16.4s,v3.4s
1013*4757b351SPierre Pronchery.inst	0xcec08471	//sm4e v17.4s,v3.4s
1014*4757b351SPierre Pronchery.inst	0xcec08472	//sm4e v18.4s,v3.4s
1015*4757b351SPierre Pronchery.inst	0xcec08473	//sm4e v19.4s,v3.4s
1016*4757b351SPierre Pronchery
1017*4757b351SPierre Pronchery.inst	0xcec08490	//sm4e v16.4s,v4.4s
1018*4757b351SPierre Pronchery.inst	0xcec08491	//sm4e v17.4s,v4.4s
1019*4757b351SPierre Pronchery.inst	0xcec08492	//sm4e v18.4s,v4.4s
1020*4757b351SPierre Pronchery.inst	0xcec08493	//sm4e v19.4s,v4.4s
1021*4757b351SPierre Pronchery
1022*4757b351SPierre Pronchery.inst	0xcec084b0	//sm4e v16.4s,v5.4s
1023*4757b351SPierre Pronchery.inst	0xcec084b1	//sm4e v17.4s,v5.4s
1024*4757b351SPierre Pronchery.inst	0xcec084b2	//sm4e v18.4s,v5.4s
1025*4757b351SPierre Pronchery.inst	0xcec084b3	//sm4e v19.4s,v5.4s
1026*4757b351SPierre Pronchery
1027*4757b351SPierre Pronchery.inst	0xcec084d0	//sm4e v16.4s,v6.4s
1028*4757b351SPierre Pronchery.inst	0xcec084d1	//sm4e v17.4s,v6.4s
1029*4757b351SPierre Pronchery.inst	0xcec084d2	//sm4e v18.4s,v6.4s
1030*4757b351SPierre Pronchery.inst	0xcec084d3	//sm4e v19.4s,v6.4s
1031*4757b351SPierre Pronchery
1032*4757b351SPierre Pronchery.inst	0xcec084f0	//sm4e v16.4s,v7.4s
1033*4757b351SPierre Pronchery	rev64	v16.4S,v16.4S
1034*4757b351SPierre Pronchery.inst	0xcec084f1	//sm4e v17.4s,v7.4s
1035*4757b351SPierre Pronchery	ext	v16.16b,v16.16b,v16.16b,#8
1036*4757b351SPierre Pronchery	rev64	v17.4S,v17.4S
1037*4757b351SPierre Pronchery.inst	0xcec084f2	//sm4e v18.4s,v7.4s
1038*4757b351SPierre Pronchery	ext	v17.16b,v17.16b,v17.16b,#8
1039*4757b351SPierre Pronchery	rev64	v18.4S,v18.4S
1040*4757b351SPierre Pronchery.inst	0xcec084f3	//sm4e v19.4s,v7.4s
1041*4757b351SPierre Pronchery	ext	v18.16b,v18.16b,v18.16b,#8
1042*4757b351SPierre Pronchery	rev64	v19.4S,v19.4S
1043*4757b351SPierre Pronchery	ext	v19.16b,v19.16b,v19.16b,#8
1044*4757b351SPierre Pronchery#ifndef __AARCH64EB__
1045*4757b351SPierre Pronchery	rev32	v16.16b,v16.16b
1046*4757b351SPierre Pronchery#endif
1047*4757b351SPierre Pronchery#ifndef __AARCH64EB__
1048*4757b351SPierre Pronchery	rev32	v17.16b,v17.16b
1049*4757b351SPierre Pronchery#endif
1050*4757b351SPierre Pronchery#ifndef __AARCH64EB__
1051*4757b351SPierre Pronchery	rev32	v18.16b,v18.16b
1052*4757b351SPierre Pronchery#endif
1053*4757b351SPierre Pronchery#ifndef __AARCH64EB__
1054*4757b351SPierre Pronchery	rev32	v19.16b,v19.16b
1055*4757b351SPierre Pronchery#endif
1056*4757b351SPierre Pronchery	eor	v16.16b,v16.16b,v24.16b
1057*4757b351SPierre Pronchery	eor	v17.16b,v17.16b,v25.16b
1058*4757b351SPierre Pronchery	eor	v18.16b,v18.16b,v26.16b
1059*4757b351SPierre Pronchery	eor	v19.16b,v19.16b,v27.16b
1060*4757b351SPierre Pronchery	st1	{v16.4s,v17.4s,v18.4s,v19.4s},[x1],#64
1061*4757b351SPierre Pronchery	subs	x2,x2,#4
1062*4757b351SPierre Pronchery	b.eq	3f
1063*4757b351SPierre Pronchery	add	w5,w5,#1
1064*4757b351SPierre Pronchery	mov	v8.s[3],w5
1065*4757b351SPierre Pronchery	b	1b
1066*4757b351SPierre Pronchery1:
1067*4757b351SPierre Pronchery	subs	x2,x2,#1
1068*4757b351SPierre Pronchery	b.lt	3f
1069*4757b351SPierre Pronchery	mov	v16.16b,v8.16b
1070*4757b351SPierre Pronchery	ld1	{v24.4s},[x0],#16
1071*4757b351SPierre Pronchery.inst	0xcec08410	//sm4e v16.4s,v0.4s
1072*4757b351SPierre Pronchery.inst	0xcec08430	//sm4e v16.4s,v1.4s
1073*4757b351SPierre Pronchery.inst	0xcec08450	//sm4e v16.4s,v2.4s
1074*4757b351SPierre Pronchery.inst	0xcec08470	//sm4e v16.4s,v3.4s
1075*4757b351SPierre Pronchery.inst	0xcec08490	//sm4e v16.4s,v4.4s
1076*4757b351SPierre Pronchery.inst	0xcec084b0	//sm4e v16.4s,v5.4s
1077*4757b351SPierre Pronchery.inst	0xcec084d0	//sm4e v16.4s,v6.4s
1078*4757b351SPierre Pronchery.inst	0xcec084f0	//sm4e v16.4s,v7.4s
1079*4757b351SPierre Pronchery	rev64	v16.4S,v16.4S
1080*4757b351SPierre Pronchery	ext	v16.16b,v16.16b,v16.16b,#8
1081*4757b351SPierre Pronchery#ifndef __AARCH64EB__
1082*4757b351SPierre Pronchery	rev32	v16.16b,v16.16b
1083*4757b351SPierre Pronchery#endif
1084*4757b351SPierre Pronchery	eor	v16.16b,v16.16b,v24.16b
1085*4757b351SPierre Pronchery	st1	{v16.4s},[x1],#16
1086*4757b351SPierre Pronchery	b.eq	3f
1087*4757b351SPierre Pronchery	add	w5,w5,#1
1088*4757b351SPierre Pronchery	mov	v8.s[3],w5
1089*4757b351SPierre Pronchery	b	1b
1090*4757b351SPierre Pronchery3:
1091*4757b351SPierre Pronchery	ldp	d8,d9,[sp],#16
1092*4757b351SPierre Pronchery	ret
1093*4757b351SPierre Pronchery.size	sm4_v8_ctr32_encrypt_blocks,.-sm4_v8_ctr32_encrypt_blocks
1094