• 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#include "hitls_build.h"
16#if defined(HITLS_CRYPTO_AES) && defined(HITLS_CRYPTO_GCM)
17
18#include "aes_gcm_96block_x86_64.S"
19.text
20
21.balign 16
22g_byteSwapMask:
23.byte	0x0f, 0x0e, 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08
24.byte	0x07, 0x06, 0x05, 0x04, 0x03, 0x02, 0x01, 0x00
25.size   g_byteSwapMask, .-g_byteSwapMask
26.balign 16
27g_oneHigh:
28.byte   0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
29.byte   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
30.size   g_oneHigh, .-g_oneHigh
31.balign 16
32g_oneLow:
33.byte   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
34.byte   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01
35.size   g_oneLow, .-g_oneLow
36.balign 16
37g_poly:
38.byte   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00
39.byte   0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xc2
40.size   g_poly, .-g_poly
41
42/*
43 * uint32_t AES_GCM_EncryptBlockAsm(MODES_GCM_Ctx *ctx, const uint8_t *in,
44 *                                       uint8_t *out, uint32_t len, void *key);
45 * ctx  %rdi
46 * in   %rsi
47 * out  %rdx
48 * len  %rcx
49 * key  %r8
50 */
51.globl  AES_GCM_EncryptBlockAsm
52.type   AES_GCM_EncryptBlockAsm, @function
53.balign 32
54AES_GCM_EncryptBlockAsm:
55.cfi_startproc
56    push %r12
57    push %r13
58    leaq g_byteSwapMask(%rip), %r11
59    mov 240(%r8), %r9d                          // rounds
60    shrl $4, %ecx
61    movl 12(%rdi), %r12d                        // counter  r12d(32bit)
62    mov %ecx, %eax
63    lea 0x80(%r8), %r8
64    shl $4, %eax
65    cmp $6, %ecx
66    jb .Lm64_enc_pass                           // If the number of data blocks is less than six, the data is skipped.
67    call AES_GCM_Encrypt96BlockAsm              // Invoke six parallel processing parts.
68.Lm64_enc_pass:
69    cmp $4, %ecx                                // If the remaining data is less than four blocks,
70                                                // the function is returned.
71    jb .Lm64_enc_return
72    vmovdqu (%rdi), %xmm0                       // iv
73    and $0b11, %ecx
74    lea -2(%r9d), %r13d
75    addl $0x4000000, %r12d                      // ctr inc
76    jc .Lm64_enc_ctr_carry
77    mov %r12d, 12(%rdi)                         // out iv
78    vmovdqa 0x20(%r11), %xmm14                  // Lone_low
79    lea -0x70(%r8), %r10
80    vpaddb %xmm14, %xmm0, %xmm1
81    vmovdqu -0x80(%r8), %xmm4                   // key0
82    vpaddb %xmm14, %xmm1, %xmm2
83    vpxor %xmm4, %xmm0, %xmm0
84    vpxor %xmm4, %xmm1, %xmm1
85    vpaddb %xmm14, %xmm2, %xmm3
86    vpxor %xmm4, %xmm2, %xmm2
87    vpxor %xmm4, %xmm3, %xmm3
88    jmp .Lm64_enc_aes
89.Lm64_enc_ctr_carry:
90    vmovdqa 0x10(%r11), %xmm14                  // Lone_high
91    bswap %r12d
92    vmovdqa (%r11), %xmm15
93    addl $0x100, %r12d                          // add carry bit
94    vpshufb %xmm15, %xmm0, %xmm0
95    bswap %r12d
96    vpaddd %xmm14, %xmm0, %xmm1
97    vpshufb %xmm15, %xmm0, %xmm0
98    mov %r12d, 12(%rdi)                         // out iv
99    vpaddd %xmm14, %xmm1, %xmm2
100    lea -0x70(%r8), %r10
101    vpshufb %xmm15, %xmm1, %xmm1
102    vmovdqu -0x80(%r8), %xmm4                   // key0
103    vpaddd %xmm14, %xmm2, %xmm3
104    vpxor %xmm4, %xmm0, %xmm0
105    vpshufb %xmm15, %xmm2, %xmm2
106    vpxor %xmm4, %xmm1, %xmm1
107    vpshufb %xmm15, %xmm3, %xmm3
108    vpxor %xmm4, %xmm2, %xmm2
109    vpxor %xmm4, %xmm3, %xmm3
110    jmp .Lm64_enc_aes
111.balign 16
112.Lm64_enc_aes:
113    vmovdqu (%r10), %xmm4                       // key1-8/10/12
114    vaesenc %xmm4, %xmm0, %xmm0
115    vaesenc %xmm4, %xmm1, %xmm1
116    vaesenc %xmm4, %xmm2, %xmm2
117    vaesenc %xmm4, %xmm3, %xmm3
118    lea 0x10(%r10), %r10
119    dec %r13d
120    jnz .Lm64_enc_aes
121    vmovdqu (%r10), %xmm4                       // key9/11/13
122    vmovdqu 0x10(%r10), %xmm5                   // key10/12/14
123    vaesenc %xmm4, %xmm0, %xmm0
124    vpxor (%rsi), %xmm5, %xmm6                  // last key xor plaintext
125    vaesenc %xmm4, %xmm1, %xmm1
126    vpxor 0x10(%rsi), %xmm5, %xmm7
127    vaesenc %xmm4, %xmm2, %xmm2
128    vpxor 0x20(%rsi), %xmm5, %xmm8
129    vaesenc %xmm4, %xmm3, %xmm3
130    vpxor 0x30(%rsi), %xmm5, %xmm9
131    vaesenclast %xmm6, %xmm0, %xmm10
132    vmovdqu 16(%rdi), %xmm5                     // ghash
133    vaesenclast %xmm7, %xmm1, %xmm11
134    vmovdqu %xmm10, (%rdx)                      // out ciphertext
135    vaesenclast %xmm8, %xmm2, %xmm12
136    vmovdqu %xmm11, 0x10(%rdx)
137    vaesenclast %xmm9, %xmm3, %xmm13
138    vmovdqu %xmm12, 0x20(%rdx)
139// +++++++++++++++++ ghash process +++++++++++++++++++++++++++++++++
140    vmovdqu %xmm13, 0x30(%rdx)
141    vpxor %xmm5, %xmm10, %xmm0                  // input for ghash operation
142    vmovdqu 0x20+0x40(%rdi), %xmm1              // hash key h^4
143    vpshufb (%r11), %xmm0, %xmm0                // data transform
144    vmovdqu 0x20+0x50(%rdi), %xmm2              // hash key h^3_4
145    vpalignr $8, %xmm0, %xmm0, %xmm3
146
147    vpclmulqdq $0x11, %xmm1, %xmm0, %xmm9       // Karatsuba Multiply
148    vpxor %xmm0, %xmm3, %xmm3
149    vpclmulqdq $0x00, %xmm1, %xmm0, %xmm7
150    vmovdqu 0x20+0x30(%rdi), %xmm1              // hash key h^3
151    vpclmulqdq $0x11, %xmm2, %xmm3, %xmm8
152    vpshufb (%r11), %xmm11, %xmm0               // data transform
153    vpalignr $8, %xmm0, %xmm0, %xmm3
154
155    vpclmulqdq $0x11, %xmm1, %xmm0, %xmm5       // Karatsuba Multiply
156    vpxor %xmm0, %xmm3, %xmm3
157    vpclmulqdq $0x00, %xmm1, %xmm0, %xmm0
158    vpxor %xmm5, %xmm9, %xmm9
159    vmovdqu 0x20+0x10(%rdi), %xmm1              // hash key h^2
160    vpclmulqdq $0x00, %xmm2, %xmm3, %xmm3
161    vpxor %xmm0, %xmm7, %xmm7
162    vpshufb (%r11), %xmm12, %xmm0               // data transform
163    vpxor %xmm3, %xmm8, %xmm8
164    vmovdqu 0x20+0x20(%rdi), %xmm2              // hash key h^1_2
165    vpalignr $8, %xmm0, %xmm0, %xmm3
166
167    vpclmulqdq $0x11, %xmm1, %xmm0, %xmm5       // Karatsuba Multiply
168    vpxor %xmm0, %xmm3, %xmm3
169    vpclmulqdq $0x00, %xmm1, %xmm0, %xmm0
170    vmovdqu 0x20(%rdi), %xmm1                   // hash key h^1
171    vpxor %xmm5, %xmm9, %xmm9
172    vpclmulqdq $0x11, %xmm2, %xmm3, %xmm3
173    vpxor %xmm0, %xmm7, %xmm7
174    vpshufb (%r11), %xmm13, %xmm0               // data transform
175    vpxor %xmm3, %xmm8, %xmm8
176    vpalignr $8, %xmm0, %xmm0, %xmm3
177
178    vpclmulqdq $0x11, %xmm1, %xmm0, %xmm5       // Karatsuba Multiply
179    vpxor %xmm0, %xmm3, %xmm3
180    vpclmulqdq $0x00, %xmm1, %xmm0, %xmm0
181    vpxor %xmm5, %xmm9, %xmm5
182    vpclmulqdq $0x00, %xmm2, %xmm3, %xmm3
183    vpxor %xmm0, %xmm7, %xmm0
184    vpxor %xmm3, %xmm8, %xmm3
185    vpxor %xmm0, %xmm5, %xmm1
186    vpxor %xmm1, %xmm3, %xmm3
187
188    vpslldq $8, %xmm3, %xmm4
189    vmovdqa 0x30(%r11), %xmm14                  // Lpoly
190    vpxor %xmm4, %xmm0, %xmm0
191
192    vpalignr $8, %xmm0, %xmm0, %xmm2            // 1st phase of reduction
193    vpclmulqdq $0x10, %xmm14, %xmm0, %xmm0
194    vpsrldq $8, %xmm3, %xmm3
195    vpxor %xmm2, %xmm0, %xmm0
196
197    vpalignr $8, %xmm0, %xmm0, %xmm2            // 2nd phase of reduction
198    vpxor %xmm3, %xmm5, %xmm5
199    vpclmulqdq $0x10, %xmm14, %xmm0, %xmm0
200    vpxor %xmm5, %xmm2, %xmm2
201    vpxor %xmm2, %xmm0, %xmm0
202
203    vpshufb (%r11), %xmm0, %xmm0                // results for ghash
204// ------------------- ghash complete ---------------------------------
205    vmovdqu %xmm0, 16(%rdi)                     // out ghash
206.Lm64_enc_return:
207    shl $4, %ecx
208    sub %ecx, %eax
209    pop %r13
210    pop %r12
211    ret
212.cfi_endproc
213.size   AES_GCM_EncryptBlockAsm, .-AES_GCM_EncryptBlockAsm
214
215/*
216 * uint32_t AES_GCM_DecryptBlockAsm(MODES_GCM_Ctx *ctx, const uint8_t *in,
217 *                                       uint8_t *out, uint32_t len, void *key);
218 * ctx  %rdi
219 * in   %rsi
220 * out  %rdx
221 * len  %rcx
222 * key  %r8
223 */
224.globl  AES_GCM_DecryptBlockAsm
225.type   AES_GCM_DecryptBlockAsm, @function
226.balign 32
227AES_GCM_DecryptBlockAsm:
228.cfi_startproc
229    leaq g_byteSwapMask(%rip), %r11
230    shrl $4, %ecx
231    mov %ecx, %eax
232    shll $4, %eax
233    vmovdqa (%r11), %xmm15                      // g_byteSwapMask
234    mov 240(%r8), %r9d                          // rounds
235    cmp $6, %ecx                                // invoke six parallel processing parts.
236    jb .Lm64_dec_pass                           // if the number of data blocks is less than six, the data is skipped.
237    call AES_GCM_Decrypt96BlockAsm
238.Lm64_dec_pass:
239    cmp $4, %ecx                                // If the remaining data is less than four blocks,
240                                                // the function is returned.
241    jb .Lm64_dec_return
242.balign 16
243.Lm64_dec_loop:
244    vmovdqu (%rdi), %xmm0                       // iv
245    mov 12(%rdi), %r10d                         // counter  r10d(32bit)
246    addl $0x4000000, %r10d                      // ctr inc
247    jc .Lm64_dec_ctr_carry
248    vmovdqa 0x20(%r11), %xmm14                  // Lone_low
249    vpaddb %xmm14, %xmm0, %xmm1
250    vpaddb %xmm14, %xmm1, %xmm2
251    vpaddb %xmm14, %xmm2, %xmm3
252    jmp .Lm64_dec_aes_cipher
253.Lm64_dec_ctr_carry:
254    vmovdqa (%r11), %xmm15
255    bswap %r10d
256    vpshufb %xmm15, %xmm0, %xmm0
257    vmovdqa 0x10(%r11), %xmm14                  // Lone_high
258    addl $0x100, %r10d                          // add carry bit
259    vpaddd %xmm14, %xmm0, %xmm1
260    vpshufb %xmm15, %xmm0, %xmm0
261    vpaddd %xmm14, %xmm1, %xmm2
262    vpshufb %xmm15, %xmm1, %xmm1
263    vpaddd %xmm14, %xmm2, %xmm3
264    vpshufb %xmm15, %xmm2, %xmm2
265    bswap %r10d
266    vpshufb %xmm15, %xmm3, %xmm3
267    jmp .Lm64_dec_aes_cipher
268.balign 32
269.Lm64_dec_aes_cipher:
270    vmovdqu (%r8), %xmm7
271    mov %r10d, 12(%rdi)                         // out iv
272    lea 0x10(%r8), %r10
273    vmovdqu 0x10(%rsi), %xmm5
274    vpxor %xmm7, %xmm0, %xmm0                   // key 0
275    vmovdqu 0x20(%rsi), %xmm6
276    vpxor %xmm7, %xmm1, %xmm1
277    vmovdqu 0x30(%rsi), %xmm9
278    vpxor %xmm7, %xmm2, %xmm2
279
280    vmovdqu (%r10), %xmm4
281    vpxor %xmm7, %xmm3, %xmm3
282// +++++++++++++++++ ghash process +++++++++++++++++++++++++++++++++
283    vmovdqu 16(%rdi), %xmm11                    // ghash
284    lea 0x10(%r10), %r10
285    vaesenc %xmm4, %xmm0, %xmm0                 // key 1
286    vpxor (%rsi), %xmm11, %xmm10                // input for ghash operation
287    vmovdqu 0x20+0x40(%rdi), %xmm11             // hash key h^4
288    vaesenc %xmm4, %xmm1, %xmm1
289    vmovdqu 0x20+0x50(%rdi), %xmm12             // hash key h^3_4
290    vpshufb (%r11), %xmm10, %xmm10              // data transform
291    vaesenc %xmm4, %xmm2, %xmm2
292    vpalignr $8, %xmm10, %xmm10, %xmm13
293    vaesenc %xmm4, %xmm3, %xmm3
294    vmovdqu (%r10), %xmm4
295
296    vpclmulqdq $0x11, %xmm11, %xmm10, %xmm15    // Karatsuba Multiply
297    lea 0x10(%r10), %r10
298    vaesenc %xmm4, %xmm0, %xmm0                 // key 2
299    vpxor %xmm10, %xmm13, %xmm13
300    vpclmulqdq $0x00, %xmm11, %xmm10, %xmm7
301    vaesenc %xmm4, %xmm1, %xmm1
302    vmovdqu 0x20+0x30(%rdi), %xmm11             // hash key h^3
303    vpclmulqdq $0x11, %xmm12, %xmm13, %xmm8
304    vaesenc %xmm4, %xmm2, %xmm2
305    vpshufb (%r11), %xmm5, %xmm10               // data transform
306    vaesenc %xmm4, %xmm3, %xmm3
307    vmovdqu (%r10), %xmm4
308
309    vpalignr $8, %xmm10, %xmm10, %xmm13
310    lea 0x10(%r10), %r10
311    vaesenc %xmm4, %xmm0, %xmm0                 // key 3
312    vpclmulqdq $0x11, %xmm11, %xmm10, %xmm14    // Karatsuba Multiply
313    vaesenc %xmm4, %xmm1, %xmm1
314    vpxor %xmm10, %xmm13, %xmm13
315    vpclmulqdq $0x00, %xmm11, %xmm10, %xmm10
316    vaesenc %xmm4, %xmm2, %xmm2
317    vpxor %xmm14, %xmm15, %xmm15
318    vpclmulqdq $0x00, %xmm12, %xmm13, %xmm13
319    vaesenc %xmm4, %xmm3, %xmm3
320    vmovdqu (%r10), %xmm4
321
322    vpxor %xmm10, %xmm7, %xmm7
323    lea 0x10(%r10), %r10
324    vaesenc %xmm4, %xmm0, %xmm0                 // key 4
325    vpxor %xmm13, %xmm8, %xmm8
326    vaesenc %xmm4, %xmm1, %xmm1
327    vmovdqu 0x20+0x10(%rdi), %xmm11             // hash key h^2
328    vmovdqu 0x20+0x20(%rdi), %xmm12             // hash key h^1_2
329    vaesenc %xmm4, %xmm2, %xmm2
330    vpshufb (%r11), %xmm6, %xmm10               // data transform
331    vaesenc %xmm4, %xmm3, %xmm3
332    vmovdqu (%r10), %xmm4
333    vpalignr $8, %xmm10, %xmm10, %xmm13
334    vpclmulqdq $0x11, %xmm11, %xmm10, %xmm14    // Karatsuba Multiply
335
336    lea 0x10(%r10), %r10
337    vaesenc %xmm4, %xmm0, %xmm0                 // key 5
338    vpxor %xmm10, %xmm13, %xmm13
339    vpclmulqdq $0x00, %xmm11, %xmm10, %xmm10
340    vaesenc %xmm4, %xmm1, %xmm1
341    vpxor %xmm14, %xmm15, %xmm15
342    vpclmulqdq $0x11, %xmm12, %xmm13, %xmm13
343    vaesenc %xmm4, %xmm2, %xmm2
344    vpxor %xmm10, %xmm7, %xmm7
345    vaesenc %xmm4, %xmm3, %xmm3
346    vmovdqu (%r10), %xmm4
347
348    vpxor %xmm13, %xmm8, %xmm8
349    lea 0x10(%r10), %r10
350    vaesenc %xmm4, %xmm0, %xmm0                 // key 6
351    vmovdqu 0x20(%rdi), %xmm11                  // hash key h^1
352    vpshufb (%r11), %xmm9, %xmm10               // data transform
353    vpalignr $8, %xmm10, %xmm10, %xmm13
354    vaesenc %xmm4, %xmm1, %xmm1
355    vpclmulqdq $0x11, %xmm11, %xmm10, %xmm14    // Karatsuba Multiply
356    vpxor %xmm10, %xmm13, %xmm13
357    vaesenc %xmm4, %xmm2, %xmm2
358    vpclmulqdq $0x00, %xmm11, %xmm10, %xmm10
359    vpxor %xmm14, %xmm15, %xmm14
360    vaesenc %xmm4, %xmm3, %xmm3
361    vmovdqu (%r10), %xmm4
362    vpclmulqdq $0x00, %xmm12, %xmm13, %xmm13
363    vpxor %xmm10, %xmm7, %xmm10
364    vpxor %xmm13, %xmm8, %xmm13
365
366    lea 0x10(%r10), %r10
367    vaesenc %xmm4, %xmm0, %xmm0                 // key 7
368    vpxor %xmm10, %xmm14, %xmm11
369    vaesenc %xmm4, %xmm1, %xmm1
370    vpxor %xmm11, %xmm13, %xmm13
371    vpslldq $8, %xmm13, %xmm11
372    vaesenc %xmm4, %xmm2, %xmm2
373    vpsrldq $8, %xmm13, %xmm13
374    vpxor %xmm13, %xmm14, %xmm14
375    vaesenc %xmm4, %xmm3, %xmm3
376    vmovdqu (%r10), %xmm4
377
378    vpxor %xmm11, %xmm10, %xmm10
379    lea 0x10(%r10), %r10
380    vaesenc %xmm4, %xmm0, %xmm0                 // key 8
381    vmovdqa 0x30(%r11), %xmm13                  // Lpoly
382    vaesenc %xmm4, %xmm1, %xmm1
383    vpalignr $8, %xmm10, %xmm10, %xmm12         // 1st phase of reduction
384    vpclmulqdq $0x10, %xmm13, %xmm10, %xmm10
385    vpxor %xmm12, %xmm10, %xmm10
386    vaesenc %xmm4, %xmm2, %xmm2
387    vpalignr $8, %xmm10, %xmm10, %xmm12         // 2nd phase of reduction
388    vaesenc %xmm4, %xmm3, %xmm3
389    vmovdqu (%r10), %xmm4
390
391    vpclmulqdq $0x10, %xmm13, %xmm10, %xmm10
392    vpxor %xmm14, %xmm12, %xmm12
393    vaesenc %xmm4, %xmm0, %xmm0                 // key 9
394    vpxor %xmm12, %xmm10, %xmm10
395    vaesenc %xmm4, %xmm1, %xmm1
396    lea 0x10(%r10), %r10
397    vaesenc %xmm4, %xmm2, %xmm2
398    vpshufb (%r11), %xmm10, %xmm10
399// ------------------- ghash complete ---------------------------------
400    vaesenc %xmm4, %xmm3, %xmm3
401    vmovdqu %xmm10, 16(%rdi)                    // out ghash
402
403    cmp $12, %r9d
404    jb .Lm64_dec_ending
405
406    vmovdqu (%r10), %xmm4
407    vmovdqu 0x10(%r10), %xmm5
408    vaesenc %xmm4, %xmm0, %xmm0                 // key 10
409    vaesenc %xmm4, %xmm1, %xmm1
410    vaesenc %xmm4, %xmm2, %xmm2
411    vaesenc %xmm4, %xmm3, %xmm3
412
413    lea 0x20(%r10), %r10
414    vaesenc %xmm5, %xmm0, %xmm0                 // key 11
415    vaesenc %xmm5, %xmm1, %xmm1
416    vaesenc %xmm5, %xmm2, %xmm2
417    vaesenc %xmm5, %xmm3, %xmm3
418
419    je .Lm64_dec_ending
420
421    vmovdqu (%r10), %xmm4
422    vmovdqu 0x10(%r10), %xmm5
423    vaesenc %xmm4, %xmm0, %xmm0                 // key 12
424    vaesenc %xmm4, %xmm1, %xmm1
425    vaesenc %xmm4, %xmm2, %xmm2
426    vaesenc %xmm4, %xmm3, %xmm3
427
428    lea 0x20(%r10), %r10
429    vaesenc %xmm5, %xmm0, %xmm0                 // key 13
430    vaesenc %xmm5, %xmm1, %xmm1
431    vaesenc %xmm5, %xmm2, %xmm2
432    vaesenc %xmm5, %xmm3, %xmm3
433
434    jmp .Lm64_dec_ending
435.Lm64_dec_ending:
436    vmovdqu (%r10), %xmm4                       // key10/12/14
437    vpxor (%rsi), %xmm4, %xmm5                  // last key xor plaintext
438    vpxor 0x10(%rsi), %xmm4, %xmm6
439    vaesenclast %xmm5, %xmm0, %xmm0
440    vpxor 0x20(%rsi), %xmm4, %xmm7
441    vaesenclast %xmm6, %xmm1, %xmm1
442    vpxor 0x30(%rsi), %xmm4, %xmm8
443    vmovdqu %xmm0, (%rdx)                       // out ciphertext
444    vaesenclast %xmm7, %xmm2, %xmm2
445    vmovdqu %xmm1, 0x10(%rdx)
446    vaesenclast %xmm8, %xmm3, %xmm3
447    vmovdqu %xmm2, 0x20(%rdx)
448    and $0b11, %ecx
449    vmovdqu %xmm3, 0x30(%rdx)
450.Lm64_dec_return:
451    shl $4, %ecx
452    sub %ecx, %eax
453    ret
454.cfi_endproc
455.size   AES_GCM_DecryptBlockAsm, .-AES_GCM_DecryptBlockAsm
456#endif