Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
freebsd
GitHub Repository: freebsd/freebsd-src
Path: blob/main/sys/crypto/openssl/aarch64/sm4-armv8.S
39536 views
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
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
1095