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