user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<AEAD_TGEN>:
  endbr64
  push   %r15
  pxor   %xmm0,%xmm0
  push   %r14
  push   %r13
  mov    %rdi,%r13
  push   %r12
  mov    %rsi,%r12
  push   %rbp
  push   %rbx
  sub    $0xd8,%rsp
  mov    0x110(%rsp),%rax
  mov    %rcx,0x48(%rsp)
  mov    %rdx,0x28(%rsp)
  mov    %r8,0x20(%rsp)
  mov    %r9,0x30(%rsp)
  mov    %rax,0x38(%rsp)
  mov    %fs:0x28,%rax
  mov    %rax,0xc8(%rsp)
  mov    %ecx,%eax
  shr    $0x5,%rcx
  movb   $0x0,0x5f(%rsp)
  movq   $0x0,0x53(%rsp)
  movl   $0x0,0x5b(%rsp)
  movaps %xmm0,0xa0(%rsp)
  movaps %xmm0,0xb0(%rsp)
  and    $0x1f,%eax
  cmp    $0x1,%eax
  mov    %eax,0x18(%rsp)
  sbb    $0xffffffffffffffff,%rcx
  mov    %rcx,(%rsp)
  cmp    $0x1,%rcx
  jbe    L218
  lea    0x80(%rsp),%rbx
  mov    %rsi,0x40(%rsp)
  lea    0x60(%rsp),%rbp
  mov    $0x1,%r15d
  mov    %rbx,%rax
  lea    0x53(%rsp),%r14
  mov    %rbp,%rbx
  mov    %rdx,%r12
  mov    %rax,%rbp
  nopw   0x0(%rax,%rax,1)
L272:
  movdqu (%r12),%xmm2
  sub    $0x8,%rsp
  mov    %r15d,%ecx
  mov    %r14,%rdx
  movdqu 0x10(%r12),%xmm3
  mov    %rbx,%r9
  xor    %r8d,%r8d
  xor    %esi,%esi
  movaps %xmm2,0x68(%rsp)
  mov    %r13,%rdi
  add    $0x20,%r12
  movaps %xmm3,0x78(%rsp)
  push   %rbp
  call   <TEM_ENC@plt>
  mov    %r15,%rax
  add    $0x1,%r15
  movdqa 0xb0(%rsp),%xmm0
  pxor   0x90(%rsp),%xmm0
  movaps %xmm0,0xb0(%rsp)
  movdqa 0xc0(%rsp),%xmm0
  pxor   0xa0(%rsp),%xmm0
  movaps %xmm0,0xc0(%rsp)
  pop    %rdx
  pop    %rcx
  cmp    %r15,(%rsp)
  jne    L272
  shl    $0x5,%rax
  add    %rax,0x28(%rsp)
  mov    %rbp,%rsi
  mov    0x40(%rsp),%r12
  mov    %rbx,%rbp
  mov    %rsi,%rbx
L283:
  mov    0x18(%rsp),%eax
  test   %eax,%eax
  jne    L271
  cmpq   $0x0,0x48(%rsp)
  je     L268
  mov    0x28(%rsp),%rax
  lea    -0x1(%r15),%ecx
  movdqu (%rax),%xmm1
  movdqu 0x10(%rax),%xmm0
  pxor   0xa0(%rsp),%xmm1
  pxor   0xb0(%rsp),%xmm0
  movaps %xmm1,0x60(%rsp)
  movaps %xmm0,0x70(%rsp)
L160:
  sub    $0x8,%rsp
  mov    %rbp,%r9
  mov    $0x1,%r8d
  push   %rbx
L172:
  mov    %r13,%rdi
  mov    %r14,%rdx
  xor    %esi,%esi
  call   <TEM_ENC@plt>
  pop    %rdi
  pop    %r8
  movdqa 0x80(%rsp),%xmm1
  movaps %xmm1,0xa0(%rsp)
  movdqa 0x90(%rsp),%xmm1
  movaps %xmm1,0xb0(%rsp)
L28:
  mov    0x30(%rsp),%rax
  mov    $0x1,%ecx
  mov    %rax,%rdx
  shr    $0x5,%rdx
  mov    %rdx,0x18(%rsp)
  cmp    $0x3f,%rax
  jbe    L109
  mov    0x20(%rsp),%r15
  mov    %rdx,%rax
  mov    $0x2,%r14d
  shl    $0x5,%rax
  lea    -0x20(%r15,%rax,1),%rax
  mov    %rax,(%rsp)
  mov    %rbx,%rax
  mov    %rbp,%rbx
  mov    %rax,%rbp
  nopw   0x0(%rax,%rax,1)
L161:
  movdqu (%r15),%xmm4
  sub    $0x8,%rsp
  mov    %r14d,%ecx
  mov    %rbx,%r9
  movdqu 0x10(%r15),%xmm5
  xor    %r8d,%r8d
  mov    %r12,%rdx
  mov    %r13,%rdi
  movaps %xmm4,0x68(%rsp)
  mov    $0x40,%esi
  add    $0x20,%r15
  add    $0x2,%r14d
  movaps %xmm5,0x78(%rsp)
  push   %rbp
  call   <TEM_ENC@plt>
  movdqa 0xb0(%rsp),%xmm0
  pxor   0x90(%rsp),%xmm0
  movaps %xmm0,0xb0(%rsp)
  movdqa 0xc0(%rsp),%xmm0
  pxor   0xa0(%rsp),%xmm0
  movaps %xmm0,0xc0(%rsp)
  pop    %rcx
  pop    %rsi
  cmp    %r15,(%rsp)
  jne    L161
  mov    0x18(%rsp),%rdx
  mov    %rbp,%rax
  mov    %rbx,%rbp
  mov    %rax,%rbx
  lea    -0x1(%rdx),%rax
  lea    -0x1(%rdx,%rdx,1),%ecx
  shl    $0x5,%rax
  add    %rax,0x20(%rsp)
L109:
  mov    0x20(%rsp),%rax
  sub    $0x8,%rsp
  mov    %r12,%rdx
  mov    %rbp,%r9
  mov    $0x1,%r8d
  mov    $0x40,%esi
  mov    %r13,%rdi
  movdqa 0xa8(%rsp),%xmm0
  movdqu (%rax),%xmm6
  pxor   %xmm6,%xmm0
  movaps %xmm6,0x8(%rsp)
  movaps %xmm0,0x68(%rsp)
  movdqu 0x10(%rax),%xmm0
  pxor   0xb8(%rsp),%xmm0
  movaps %xmm0,0x78(%rsp)
  push   %rbx
  call   <TEM_ENC@plt>
  mov    0x48(%rsp),%rax
  movdqa 0x90(%rsp),%xmm7
  movups %xmm7,(%rax)
  pop    %rax
  pop    %rdx
  mov    0xc8(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L6
  add    $0xd8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L268:
  mov    0x18(%rsp),%r11d
  test   %r11d,%r11d
  je     L252
L271:
  mov    0x28(%rsp),%rdi
  mov    0x18(%rsp),%edx
  mov    %rbp,%rsi
  mov    %rdi,%rax
  cmp    $0x8,%edx
  jae    L221
L217:
  xor    %ecx,%ecx
  testb  $0x4,0x18(%rsp)
  je     L210
  mov    (%rax),%ecx
  mov    %ecx,(%rsi)
  mov    $0x4,%ecx
L210:
  testb  $0x2,0x18(%rsp)
  je     L139
  movzwl (%rax,%rcx,1),%r8d
  mov    %r8w,(%rsi,%rcx,1)
  add    $0x2,%rcx
L139:
  testb  $0x1,0x18(%rsp)
  je     L252
  movzbl (%rax,%rcx,1),%eax
  mov    %al,(%rsi,%rcx,1)
L252:
  mov    0x18(%rsp),%esi
  movslq %esi,%rax
  lea    0x1(%rsi),%r8d
  movb   $0x80,0x60(%rsp,%rax,1)
  cmp    $0x1f,%esi
  je     L237
  mov    $0x1f,%eax
  movslq %r8d,%r8
  sub    0x18(%rsp),%eax
  xor    %esi,%esi
  add    %rbp,%r8
  cmp    $0x8,%eax
  jae    L29
  test   $0x4,%al
  jne    L44
  test   %eax,%eax
  je     L274
  movb   $0x0,(%r8)
  test   $0x2,%al
  jne    L134
L274:
  movdqa 0x60(%rsp),%xmm0
  mov    0x18(%rsp),%r9d
  lea    -0x1(%r15),%ecx
  pxor   0xa0(%rsp),%xmm0
  movaps %xmm0,0x60(%rsp)
  movdqa 0x70(%rsp),%xmm0
  pxor   0xb0(%rsp),%xmm0
  movaps %xmm0,0x70(%rsp)
  test   %r9d,%r9d
  je     L160
L8:
  sub    $0x8,%rsp
  mov    %rbp,%r9
  mov    $0x2,%r8d
  push   %rbx
  jmp    L172
L29:
  mov    %eax,%ecx
  movq   $0x0,(%r8)
  movq   $0x0,-0x8(%r8,%rcx,1)
  lea    0x8(%r8),%rcx
  and    $0xfffffffffffffff8,%rcx
  sub    %rcx,%r8
  add    %r8d,%eax
  and    $0xfffffff8,%eax
  cmp    $0x8,%eax
  jb     L274
  and    $0xfffffff8,%eax
  xor    %r8d,%r8d
L81:
  mov    %r8d,%edx
  add    $0x8,%r8d
  mov    %rsi,(%rcx,%rdx,1)
  cmp    %eax,%r8d
  jb     L81
  jmp    L274
L218:
  je     L286
  lea    0x60(%rsp),%rbp
  lea    0x80(%rsp),%rbx
  jmp    L28
L221:
  mov    %edx,%esi
  xor    %eax,%eax
  and    $0xfffffff8,%esi
L72:
  mov    %eax,%edx
  add    $0x8,%eax
  mov    (%rdi,%rdx,1),%rcx
  mov    %rcx,0x0(%rbp,%rdx,1)
  cmp    %esi,%eax
  jb     L72
  lea    0x0(%rbp,%rax,1),%rsi
  add    0x28(%rsp),%rax
  jmp    L217
L44:
  movl   $0x0,(%r8)
  movl   $0x0,-0x4(%r8,%rax,1)
  jmp    L274
L237:
  movdqa 0x60(%rsp),%xmm0
  lea    -0x1(%r15),%ecx
  pxor   0xa0(%rsp),%xmm0
  movaps %xmm0,0x60(%rsp)
  movdqa 0x70(%rsp),%xmm0
  pxor   0xb0(%rsp),%xmm0
  movaps %xmm0,0x70(%rsp)
  jmp    L8
L6:
  call   <__stack_chk_fail@plt>
  nopl   0x0(%rax)
L286:
  mov    $0x1,%r15d
  lea    0x60(%rsp),%rbp
  lea    0x53(%rsp),%r14
  lea    0x80(%rsp),%rbx
  jmp    L283
L134:
  xor    %r10d,%r10d
  mov    %r10w,-0x2(%r8,%rax,1)
  jmp    L274
```

assistant: ```c
void AEAD_TGEN(const unsigned char *_K, const unsigned char *_N, const unsigned char *_A, unsigned long long _alen, const unsigned char *_C, unsigned long long _clen, unsigned char *tag_) {
  int d, pad;
  unsigned long long i, j, blocknum;
  const unsigned char *ap, *cp;
  unsigned char in[32], out[32], t[32], zero[13];
  i = 1;
  j = 1;
  ap = _A;
  cp = _C;
  pad = _alen % 32;
  blocknum = _alen / 32;
  if (pad != 0)
    blocknum += 1;
  do {
    int u;
    for (u = 0; u < 32; u++)
      (t)[u] = 0x00;
  } while (0);
  do {
    int u;
    for (u = 0; u < 13; u++)
      (zero)[u] = 0x00;
  } while (0);
  while (blocknum > 1) {
    do {
      int u;
      for (u = 0; u < 32; u++)
        (in)[u] = (ap)[u];
    } while (0);
    TEM_ENC(_K, 0x00, zero, i, 0, in, out);
    do {
      int u;
      for (u = 0; u < 32; u++)
        (t)[u] ^= (out)[u];
    } while (0);
    i++;
    blocknum--;
    ap += 32;
  }
  if (blocknum == 1) {
    if ((pad == 0) && (_alen != 0)) {
      do {
        int u;
        for (u = 0; u < 32; u++)
          (in)[u] = (ap)[u];
      } while (0);
    } else {
      do {
        int u;
        for (u = 0; u < pad; u++)
          (in)[u] = (ap)[u];
      } while (0);
      in[pad] = 0x80;
      for (d = pad + 1; d < 32; d++)
        in[d] = 0x00;
    }
    do {
      int u;
      for (u = 0; u < 32; u++)
        (in)[u] ^= (t)[u];
    } while (0);
    if (pad == 0) {
      TEM_ENC(_K, 0x00, zero, i - 1, 1, in, out);
    } else {
      TEM_ENC(_K, 0x00, zero, i - 1, 2, in, out);
    }
    do {
      int u;
      for (u = 0; u < 32; u++)
        (t)[u] = (out)[u];
    } while (0);
  }
  i = 1;
  blocknum = _clen / 32;
  while (blocknum > 1) {
    do {
      int u;
      for (u = 0; u < 32; u++)
        (in)[u] = (cp)[u];
    } while (0);
    TEM_ENC(_K, 0x40, _N, 2 * i, 0, in, out);
    do {
      int u;
      for (u = 0; u < 32; u++)
        (t)[u] ^= (out)[u];
    } while (0);
    i++;
    blocknum--;
    cp += 32;
  }
  for (d = 0; d < 32; d++)
    in[d] = cp[d] ^ t[d];
  TEM_ENC(_K, 0x40, _N, 2 * i - 1, 1, in, out);
  do {
    int u;
    for (u = 0; u < 16; u++)
      (tag_)[u] = (out)[u];
  } while (0);
}
```