• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1/*
2 * This file is part of the openHiTLS project.
3 *
4 * openHiTLS is licensed under the Mulan PSL v2.
5 * You can use this software according to the terms and conditions of the Mulan PSL v2.
6 * You may obtain a copy of Mulan PSL v2 at:
7 *
8 *     http://license.coscl.org.cn/MulanPSL2
9 *
10 * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND,
11 * EITHER EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT,
12 * MERCHANTABILITY OR FIT FOR A PARTICULAR PURPOSE.
13 * See the Mulan PSL v2 for more details.
14 */
15
16#include "hitls_build.h"
17#if defined(HITLS_CRYPTO_AES) && defined(HITLS_CRYPTO_ECB)
18
19#include "crypt_aes_macro_x86_64.s"
20
21.file   "crypt_aes_ecb_x86_64.S"
22.text
23
24.set    ARG1, %rdi
25.set    ARG2, %rsi
26.set    ARG3, %rdx
27.set    ARG4, %ecx
28.set    ARG5, %r8
29.set    ARG6, %r9
30
31.set    RDK, %xmm3
32.set    KEY, %rdi
33.set    KTMP, %r9
34.set    ROUNDS, %eax
35.set    RET, %eax
36
37.set    BLK0, %xmm1
38.set    BLK1, %xmm4
39.set    BLK2, %xmm5
40.set    BLK3, %xmm6
41.set    BLK4, %xmm10
42.set    BLK5, %xmm11
43.set    BLK6, %xmm12
44.set    BLK7, %xmm13
45.set    BLK8, %xmm0
46.set    BLK9, %xmm2
47.set    BLK10, %xmm7
48.set    BLK11, %xmm8
49.set    BLK12, %xmm9
50.set    BLK13, %xmm14
51
52
53/**
54 *  Function description: Sets the AES encryption assembly acceleration API in ECB mode.
55 *  Function prototype: int32_t CRYPT_AES_ECB_Encrypt(const CRYPT_AES_Key *ctx,
56 *                                       const uint8_t *in, uint8_t *out, uint32_t len);
57 *  Input register:
58 *        x0: Pointer to the input key structure.
59 *        x1: Points to the 128-bit input data.
60 *        x2: Points to the 128-bit output data.
61 *        x3: Indicates the length of a data block, that is, 16 bytes.
62 *  Change register: xmm1,xmm3,xmm4,xmm5,xmm6,xmm10,xmm11,xmm12,xmm13.
63 *  Output register: eax.
64 *  Function/Macro Call: None.
65 */
66
67.globl CRYPT_AES_ECB_Encrypt
68    .type CRYPT_AES_ECB_Encrypt, @function
69CRYPT_AES_ECB_Encrypt:
70    .cfi_startproc
71.align 16
72.Lecb_aesenc_start:
73    cmpl    $64, ARG4
74    jae     .Lecb_enc_above_equal_4_blks
75    cmpl    $32, ARG4
76    jae     .Lecb_enc_above_equal_2_blks
77    cmpl    $0, ARG4
78    je      .Lecb_aesdec_finish
79    jmp     .Lecb_enc_proc_1_blk
80
81.Lecb_enc_above_equal_2_blks:
82    cmpl    $48, ARG4
83    jb      .Lecb_enc_proc_2_blks
84    jmp     .Lecb_enc_proc_3_blks
85
86.Lecb_enc_above_equal_4_blks:
87    cmpl    $96, ARG4
88    jae     .Lecb_enc_above_equal_6_blks
89    cmpl    $80, ARG4
90    jb      .Lecb_enc_proc_4_blks
91    jmp     .Lecb_enc_proc_5_blks
92
93.Lecb_enc_above_equal_6_blks:
94    cmpl    $112, ARG4
95    jb      .Lecb_enc_proc_6_blks
96    cmpl    $128, ARG4
97    jb      .Lecb_enc_proc_7_blks
98    cmpl  $256, ARG4
99    jbe     .Lecb_enc_proc_8_blks
100
101.align 16
102.ecb_enc_proc_14_blks:
103.Lecb_aesenc_14_blks_loop:
104    movq    KEY, KTMP
105    vmovdqu (KEY), RDK
106    movl 240(KEY), ROUNDS
107    vpxor (ARG2), RDK, BLK0
108    vpxor 16(ARG2), RDK, BLK1
109    vpxor 32(ARG2), RDK, BLK2
110    vpxor 48(ARG2), RDK, BLK3
111    vpxor 64(ARG2), RDK, BLK4
112    vpxor 80(ARG2), RDK, BLK5
113    vpxor 96(ARG2), RDK, BLK6
114    vpxor 112(ARG2), RDK, BLK7
115    vpxor 128(ARG2), RDK, BLK8
116    vpxor 144(ARG2), RDK, BLK9
117    vpxor 160(ARG2), RDK, BLK10
118    vpxor 176(ARG2), RDK, BLK11
119    vpxor 192(ARG2), RDK, BLK12
120    vpxor 208(ARG2), RDK, BLK13
121    decl ROUNDS
122    AES_ENC_14_BLKS    ARG2 KTMP ROUNDS RDK BLK0 BLK1 BLK2 BLK3 BLK4 BLK5 BLK6 BLK7 BLK8 BLK9 BLK10 BLK11 BLK12 BLK13
123    vmovdqu BLK0, (ARG3)
124    vmovdqu BLK1, 16(ARG3)
125    vmovdqu BLK2, 32(ARG3)
126    vmovdqu BLK3, 48(ARG3)
127    vmovdqu BLK4, 64(ARG3)
128    vmovdqu BLK5, 80(ARG3)
129    vmovdqu BLK6, 96(ARG3)
130    vmovdqu BLK7, 112(ARG3)
131    vmovdqu BLK8, 128(ARG3)
132    vmovdqu BLK9, 144(ARG3)
133    vmovdqu BLK10, 160(ARG3)
134    vmovdqu BLK11, 176(ARG3)
135    vmovdqu BLK12, 192(ARG3)
136    vmovdqu BLK13, 208(ARG3)
137    leaq 224(ARG2), ARG2
138    leaq 224(ARG3), ARG3
139    subl $224, ARG4
140    cmpl    $224, ARG4
141    jb  .Lecb_aesenc_start
142    jmp  .Lecb_aesenc_14_blks_loop
143
144.align 16
145.Lecb_enc_proc_8_blks:
146.Lecb_aesenc_8_blks_loop:
147    movl 240(KEY), ROUNDS
148    vmovdqu (KEY), RDK
149    movq    KEY, KTMP
150    vpxor (ARG2), RDK, BLK0
151    vpxor 16(ARG2), RDK, BLK1
152    vpxor 32(ARG2), RDK, BLK2
153    vpxor 48(ARG2), RDK, BLK3
154    vpxor 64(ARG2), RDK, BLK4
155    vpxor 80(ARG2), RDK, BLK5
156    vpxor 96(ARG2), RDK, BLK6
157    vpxor 112(ARG2), RDK, BLK7
158    decl ROUNDS
159    AES_ENC_8_BLKS    KTMP ROUNDS RDK BLK0 BLK1 BLK2 BLK3 BLK4 BLK5 BLK6 BLK7
160    vmovdqu BLK0, (ARG3)
161    vmovdqu BLK1, 16(ARG3)
162    vmovdqu BLK2, 32(ARG3)
163    vmovdqu BLK3, 48(ARG3)
164    vmovdqu BLK4, 64(ARG3)
165    vmovdqu BLK5, 80(ARG3)
166    vmovdqu BLK6, 96(ARG3)
167    vmovdqu BLK7, 112(ARG3)
168    leaq 128(ARG2), ARG2
169    leaq 128(ARG3), ARG3
170    subl $128, ARG4
171    cmpl    $128, ARG4
172    jb  .Lecb_aesenc_start
173    jmp  .Lecb_aesenc_8_blks_loop
174
175.align 16
176.Lecb_enc_proc_1_blk:
177    movl 240(KEY), ROUNDS
178    vmovdqu (KEY), RDK
179    vpxor (ARG2), RDK, BLK0
180    decl ROUNDS
181    AES_ENC_1_BLK KEY ROUNDS RDK BLK0
182    vmovdqu BLK0, (ARG3)
183    jmp  .Lecb_aesenc_finish
184
185.align 16
186.Lecb_enc_proc_2_blks:
187    movl 240(KEY), ROUNDS
188    vmovdqu (KEY), RDK
189    vpxor (ARG2), RDK, BLK0
190    vpxor 16(ARG2), RDK, BLK1
191    decl ROUNDS
192    AES_ENC_2_BLKS    KEY ROUNDS RDK BLK0 BLK1
193    vmovdqu BLK0, (ARG3)
194    vmovdqu BLK1, 16(ARG3)
195    jmp  .Lecb_aesenc_finish
196
197.align 16
198.Lecb_enc_proc_3_blks:
199    movl 240(KEY), ROUNDS
200    vmovdqu (KEY), RDK
201    vpxor (ARG2), RDK, BLK0
202    vpxor 16(ARG2), RDK, BLK1
203    vpxor 32(ARG2), RDK, BLK2
204    decl ROUNDS
205    AES_ENC_3_BLKS    KEY ROUNDS RDK BLK0 BLK1 BLK2
206    vmovdqu BLK0, (ARG3)
207    vmovdqu BLK1, 16(ARG3)
208    vmovdqu BLK2, 32(ARG3)
209    jmp  .Lecb_aesenc_finish
210
211.align 16
212.Lecb_enc_proc_4_blks:
213    movl 240(KEY), ROUNDS
214    vmovdqu (KEY), RDK
215    vpxor (ARG2), RDK, BLK0
216    vpxor 16(ARG2), RDK, BLK1
217    vpxor 32(ARG2), RDK, BLK2
218    vpxor 48(ARG2), RDK, BLK3
219    decl ROUNDS
220    AES_ENC_4_BLKS    KEY ROUNDS RDK BLK0 BLK1 BLK2 BLK3
221    vmovdqu BLK0, (ARG3)
222    vmovdqu BLK1, 16(ARG3)
223    vmovdqu BLK2, 32(ARG3)
224    vmovdqu BLK3, 48(ARG3)
225    jmp  .Lecb_aesenc_finish
226
227.align 16
228.Lecb_enc_proc_5_blks:
229    movl 240(KEY), ROUNDS
230    vmovdqu (KEY), RDK
231    vpxor (ARG2), RDK, BLK0
232    vpxor 16(ARG2), RDK, BLK1
233    vpxor 32(ARG2), RDK, BLK2
234    vpxor 48(ARG2), RDK, BLK3
235    vpxor 64(ARG2), RDK, BLK4
236    decl ROUNDS
237    AES_ENC_5_BLKS    KEY ROUNDS RDK BLK0 BLK1 BLK2 BLK3 BLK4
238    vmovdqu BLK0, (ARG3)
239    vmovdqu BLK1, 16(ARG3)
240    vmovdqu BLK2, 32(ARG3)
241    vmovdqu BLK3, 48(ARG3)
242    vmovdqu BLK4, 64(ARG3)
243    jmp  .Lecb_aesenc_finish
244
245.align 16
246.Lecb_enc_proc_6_blks:
247    movl 240(KEY), ROUNDS
248    vmovdqu (KEY), RDK
249    vpxor (ARG2), RDK, BLK0
250    vpxor 16(ARG2), RDK, BLK1
251    vpxor 32(ARG2), RDK, BLK2
252    vpxor 48(ARG2), RDK, BLK3
253    vpxor 64(ARG2), RDK, BLK4
254    vpxor 80(ARG2), RDK, BLK5
255    decl ROUNDS
256    AES_ENC_6_BLKS    KEY ROUNDS RDK BLK0 BLK1 BLK2 BLK3 BLK4 BLK5
257    vmovdqu BLK0, (ARG3)
258    vmovdqu BLK1, 16(ARG3)
259    vmovdqu BLK2, 32(ARG3)
260    vmovdqu BLK3, 48(ARG3)
261    vmovdqu BLK4, 64(ARG3)
262    vmovdqu BLK5, 80(ARG3)
263    jmp  .Lecb_aesenc_finish
264
265.align 16
266.Lecb_enc_proc_7_blks:
267    movl 240(KEY), ROUNDS
268    vmovdqu (KEY), RDK
269    vpxor (ARG2), RDK, BLK0
270    vpxor 16(ARG2), RDK, BLK1
271    vpxor 32(ARG2), RDK, BLK2
272    vpxor 48(ARG2), RDK, BLK3
273    vpxor 64(ARG2), RDK, BLK4
274    vpxor 80(ARG2), RDK, BLK5
275    vpxor 96(ARG2), RDK, BLK6
276    decl ROUNDS
277    AES_ENC_7_BLKS    KEY ROUNDS RDK BLK0 BLK1 BLK2 BLK3 BLK4 BLK5 BLK6
278    vmovdqu BLK0, (ARG3)
279    vmovdqu BLK1, 16(ARG3)
280    vmovdqu BLK2, 32(ARG3)
281    vmovdqu BLK3, 48(ARG3)
282    vmovdqu BLK4, 64(ARG3)
283    vmovdqu BLK5, 80(ARG3)
284    vmovdqu BLK6, 96(ARG3)
285
286.align 16
287.Lecb_aesenc_finish:
288    vpxor RDK, RDK, RDK
289    movl $0, RET
290    ret
291    .cfi_endproc
292    .size CRYPT_AES_ECB_Encrypt, .-CRYPT_AES_ECB_Encrypt
293
294
295/**
296 *  Function description: Sets the AES decryption and assembly acceleration API in ECB mode.
297 *  Function prototype: int32_t CRYPT_AES_ECB_Decrypt(const CRYPT_AES_Key *ctx,
298 *                                              const uint8_t *in, uint8_t *out, uint32_t len);
299 *  Input register:
300 *        x0: Pointer to the input key structure.
301 *        x1: Points to the 128-bit input data.
302 *        x2: Indicates the 128-bit output data.
303 *        x3: Indicates the length of a data block, that is, 16 bytes.
304 *  Change register: xmm1,xmm3,xmm4,xmm5,xmm6,xmm10,xmm11,xmm12,xmm13.
305 *  Output register: eax.
306 *  Function/Macro Call: None.
307 */
308    .globl CRYPT_AES_ECB_Decrypt
309    .type CRYPT_AES_ECB_Decrypt, @function
310CRYPT_AES_ECB_Decrypt:
311    .cfi_startproc
312.align 16
313.ecb_aesdec_start:
314    cmpl    $64, ARG4
315    jae     .ecb_dec_above_equal_4_blks
316    cmpl    $32, ARG4
317    jae     .ecb_dec_above_equal_2_blks
318    cmpl    $0, ARG4
319    je      .Lecb_aesdec_finish
320    jmp     .ecb_dec_proc_1_blk
321.ecb_dec_above_equal_2_blks:
322    cmpl    $48, ARG4
323    jb      .ecb_dec_proc_2_blks
324    jmp     .ecb_dec_proc_3_blks
325
326.ecb_dec_above_equal_4_blks:
327    cmpl    $96, ARG4
328    jae     .ecb_dec_above_equal_6_blks
329    cmpl    $80, ARG4
330    jb      .ecb_dec_proc_4_blks
331    jmp     .ecb_dec_proc_5_blks
332
333.ecb_dec_above_equal_6_blks:
334    cmpl    $112, ARG4
335    jb      .ecb_dec_proc_6_blks
336    cmpl    $128, ARG4
337    jb      .ecb_dec_proc_7_blks
338    cmpl  $256, ARG4
339    jbe      .ecb_dec_proc_8_blks
340
341.align 16
342.ecb_dec_proc_14_blks:
343.ecb_aesdec_14_blks_loop:
344    movq    KEY, KTMP
345    movl 240(KEY), ROUNDS
346    vmovdqu (KEY), RDK
347    vpxor (ARG2), RDK, BLK0
348    vpxor 16(ARG2), RDK, BLK1
349    vpxor 32(ARG2), RDK, BLK2
350    vpxor 48(ARG2), RDK, BLK3
351    vpxor 64(ARG2), RDK, BLK4
352    vpxor 80(ARG2), RDK, BLK5
353    vpxor 96(ARG2), RDK, BLK6
354    vpxor 112(ARG2), RDK, BLK7
355    vpxor 128(ARG2), RDK, BLK8
356    vpxor 144(ARG2), RDK, BLK9
357    vpxor 160(ARG2), RDK, BLK10
358    vpxor 176(ARG2), RDK, BLK11
359    vpxor 192(ARG2), RDK, BLK12
360    vpxor 208(ARG2), RDK, BLK13
361    decl ROUNDS
362    AES_DEC_14_BLKS    KTMP ROUNDS RDK BLK0 BLK1 BLK2 BLK3 BLK4 BLK5 BLK6 BLK7 BLK8 BLK9 BLK10 BLK11 BLK12 BLK13
363    vmovdqu BLK0, (ARG3)
364    vmovdqu BLK1, 16(ARG3)
365    vmovdqu BLK2, 32(ARG3)
366    vmovdqu BLK3, 48(ARG3)
367    vmovdqu BLK4, 64(ARG3)
368    vmovdqu BLK5, 80(ARG3)
369    vmovdqu BLK6, 96(ARG3)
370    vmovdqu BLK7, 112(ARG3)
371    vmovdqu BLK8, 128(ARG3)
372    vmovdqu BLK9, 144(ARG3)
373    vmovdqu BLK10, 160(ARG3)
374    vmovdqu BLK11, 176(ARG3)
375    vmovdqu BLK12, 192(ARG3)
376    vmovdqu BLK13, 208(ARG3)
377    leaq 224(ARG2), ARG2
378    leaq 224(ARG3), ARG3
379    subl $224, ARG4
380    cmpl    $224, ARG4
381    jb  .ecb_aesdec_start
382    jmp  .ecb_aesdec_14_blks_loop
383
384.align 16
385.ecb_dec_proc_8_blks:
386.aesecbdec_8_blks_loop:
387    movq    KEY, KTMP
388    movl 240(KEY), ROUNDS
389    vmovdqu (KEY), RDK
390    vpxor (ARG2), RDK, BLK0
391    vpxor 16(ARG2), RDK, BLK1
392    vpxor 32(ARG2), RDK, BLK2
393    vpxor 48(ARG2), RDK, BLK3
394    vpxor 64(ARG2), RDK, BLK4
395    vpxor 80(ARG2), RDK, BLK5
396    vpxor 96(ARG2), RDK, BLK6
397    vpxor 112(ARG2), RDK, BLK7
398    decl ROUNDS
399    AES_DEC_8_BLKS    KTMP ROUNDS RDK BLK0 BLK1 BLK2 BLK3 BLK4 BLK5 BLK6 BLK7
400    vmovdqu BLK0, (ARG3)
401    vmovdqu BLK1, 16(ARG3)
402    vmovdqu BLK2, 32(ARG3)
403    vmovdqu BLK3, 48(ARG3)
404    vmovdqu BLK4, 64(ARG3)
405    vmovdqu BLK5, 80(ARG3)
406    vmovdqu BLK6, 96(ARG3)
407    vmovdqu BLK7, 112(ARG3)
408    leaq 128(ARG2), ARG2
409    leaq 128(ARG3), ARG3
410    subl $128, ARG4
411    cmpl    $128, ARG4
412    jb  .ecb_aesdec_start
413    jmp .aesecbdec_8_blks_loop
414
415.align 16
416.ecb_dec_proc_1_blk:
417    movl 240(KEY), ROUNDS
418    vmovdqu (KEY), RDK
419    vpxor (ARG2), RDK, BLK0
420    decl ROUNDS
421    AES_DEC_1_BLK    KEY ROUNDS RDK BLK0
422    vmovdqu BLK0, (ARG3)
423    jmp  .Lecb_aesdec_finish
424
425.align 16
426.ecb_dec_proc_2_blks:
427    movl 240(KEY), ROUNDS
428    vmovdqu (KEY), RDK
429    vpxor (ARG2), RDK, BLK0
430    vpxor 16(ARG2), RDK, BLK1
431    decl ROUNDS
432    AES_DEC_2_BLKS    KEY ROUNDS RDK BLK0 BLK1
433    vmovdqu BLK0, (ARG3)
434    vmovdqu BLK1, 16(ARG3)
435    jmp  .Lecb_aesdec_finish
436
437.align 16
438.ecb_dec_proc_3_blks:
439    movl 240(KEY), ROUNDS
440    vmovdqu (KEY), RDK
441    vpxor (ARG2), RDK, BLK0
442    vpxor 16(ARG2), RDK, BLK1
443    vpxor 32(ARG2), RDK, BLK2
444    decl ROUNDS
445    AES_DEC_3_BLKS    KEY ROUNDS RDK BLK0 BLK1 BLK2
446    vmovdqu BLK0, (ARG3)
447    vmovdqu BLK1, 16(ARG3)
448    vmovdqu BLK2, 32(ARG3)
449    jmp  .Lecb_aesdec_finish
450
451.align 16
452.ecb_dec_proc_4_blks:
453    movl 240(KEY), ROUNDS
454    vmovdqu (KEY), RDK
455    vpxor (ARG2), RDK, BLK0
456    vpxor 16(ARG2), RDK, BLK1
457    vpxor 32(ARG2), RDK, BLK2
458    vpxor 48(ARG2), RDK, BLK3
459    decl ROUNDS
460    AES_DEC_4_BLKS    KEY ROUNDS RDK BLK0 BLK1 BLK2 BLK3
461    vmovdqu BLK0, (ARG3)
462    vmovdqu BLK1, 16(ARG3)
463    vmovdqu BLK2, 32(ARG3)
464    vmovdqu BLK3, 48(ARG3)
465    jmp  .Lecb_aesdec_finish
466
467.align 16
468.ecb_dec_proc_5_blks:
469    movl 240(KEY), ROUNDS
470    vmovdqu (KEY), RDK
471    vpxor (ARG2), RDK, BLK0
472    vpxor 16(ARG2), RDK, BLK1
473    vpxor 32(ARG2), RDK, BLK2
474    vpxor 48(ARG2), RDK, BLK3
475    vpxor 64(ARG2), RDK, BLK4
476    decl ROUNDS
477    AES_DEC_5_BLKS    KEY ROUNDS RDK BLK0 BLK1 BLK2 BLK3 BLK4
478    vmovdqu BLK0, (ARG3)
479    vmovdqu BLK1, 16(ARG3)
480    vmovdqu BLK2, 32(ARG3)
481    vmovdqu BLK3, 48(ARG3)
482    vmovdqu BLK4, 64(ARG3)
483    jmp  .Lecb_aesdec_finish
484
485.align 16
486.ecb_dec_proc_6_blks:
487    movl 240(KEY), ROUNDS
488    vmovdqu (KEY), RDK
489    vpxor (ARG2), RDK, BLK0
490    vpxor 16(ARG2), RDK, BLK1
491    vpxor 32(ARG2), RDK, BLK2
492    vpxor 48(ARG2), RDK, BLK3
493    vpxor 64(ARG2), RDK, BLK4
494    vpxor 80(ARG2), RDK, BLK5
495    decl ROUNDS
496    AES_DEC_6_BLKS    KEY ROUNDS RDK BLK0 BLK1 BLK2 BLK3 BLK4 BLK5
497    vmovdqu BLK0, (ARG3)
498    vmovdqu BLK1, 16(ARG3)
499    vmovdqu BLK2, 32(ARG3)
500    vmovdqu BLK3, 48(ARG3)
501    vmovdqu BLK4, 64(ARG3)
502    vmovdqu BLK5, 80(ARG3)
503    jmp  .Lecb_aesdec_finish
504
505.align 16
506.ecb_dec_proc_7_blks:
507    movl 240(KEY), ROUNDS
508    vmovdqu (KEY), RDK
509    vpxor (ARG2), RDK, BLK0
510    vpxor 16(ARG2), RDK, BLK1
511    vpxor 32(ARG2), RDK, BLK2
512    vpxor 48(ARG2), RDK, BLK3
513    vpxor 64(ARG2), RDK, BLK4
514    vpxor 80(ARG2), RDK, BLK5
515    vpxor 96(ARG2), RDK, BLK6
516    decl ROUNDS
517    AES_DEC_7_BLKS    KEY ROUNDS RDK BLK0 BLK1 BLK2 BLK3 BLK4 BLK5 BLK6
518    vmovdqu BLK0, (ARG3)
519    vmovdqu BLK1, 16(ARG3)
520    vmovdqu BLK2, 32(ARG3)
521    vmovdqu BLK3, 48(ARG3)
522    vmovdqu BLK4, 64(ARG3)
523    vmovdqu BLK5, 80(ARG3)
524    vmovdqu BLK6, 96(ARG3)
525
526.align 16
527.Lecb_aesdec_finish:
528    vpxor BLK0, BLK0, BLK0
529    vpxor BLK1, BLK1, BLK1
530    vpxor BLK2, BLK2, BLK2
531    vpxor BLK3, BLK3, BLK3
532    vpxor BLK4, BLK4, BLK4
533    vpxor BLK5, BLK5, BLK5
534    vpxor BLK6, BLK6, BLK6
535    vpxor BLK7, BLK7, BLK7
536    vpxor BLK8, BLK8, BLK8
537    vpxor BLK9, BLK9, BLK9
538    vpxor BLK10, BLK10, BLK10
539    vpxor BLK11, BLK11, BLK11
540    vpxor BLK12, BLK12, BLK12
541    vpxor BLK13, BLK13, BLK13
542    vpxor RDK, RDK, RDK
543    movl $0, RET
544    ret
545    .cfi_endproc
546    .size CRYPT_AES_ECB_Decrypt, .-CRYPT_AES_ECB_Decrypt
547
548#endif
549