Home | History | Annotate | Line # | Download | only in arm
      1 #include "arm_asm.h"
      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
     41 sm4_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
     70 sm4_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
    115 sm4_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
    142 sm4_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
    169 sm4_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]
    173 1:
    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
    329 2:
    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
    404 1:
    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
    426 1:
    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
    432 sm4_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
    441 1:
    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
    517 1:
    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:
    542 1:
    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
    709 2:
    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
    789 1:
    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
    814 3:
    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
    823 sm4_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]
    834 1:
    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
    996 2:
    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
   1066 1:
   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
   1090 3:
   1091 	ldp	d8,d9,[sp],#16
   1092 	ret
   1093 .size	sm4_v8_ctr32_encrypt_blocks,.-sm4_v8_ctr32_encrypt_blocks
   1094