user: What is the c source code of the assembly code below:

```asm
<SHA512_finish>:
  endbr64
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    %rdi,%r12
  mov    %rsi,%rbp
  mov    %rdx,%r13
  mov    %rdx,%rsi
  and    $0x7f,%esi
  shr    $0x3,%rsi
  mov    %esi,%r10d
  mov    %edx,%r9d
  and    $0x7,%r9d
  shl    $0x3,%r9d
  mov    %rbp,%rbx
  mov    %rbp,%r8
  mov    $0x0,%edi
L63:
  mov    (%r8),%rcx
  mov    0x8(%r8),%rdx
  mov    %rcx,%rax
  shl    $0x18,%rax
  mov    %rcx,%r11
  shr    $0x18,%r11
  or     %r11,%rax
  mov    %rcx,%r11
  shl    $0x8,%r11
  and    $0xff0000,%r11d
  or     %r11,%rax
  shr    $0x8,%rcx
  and    $0xff00,%ecx
  or     %rcx,%rax
  shl    $0x20,%rax
  mov    %rdx,%rcx
  shl    $0x18,%rcx
  mov    %rdx,%r11
  shr    $0x18,%r11
  or     %r11,%rcx
  mov    %rdx,%r11
  shl    $0x8,%r11
  and    $0xff0000,%r11d
  or     %r11,%rcx
  shr    $0x8,%rdx
  and    $0xff00,%edx
  or     %rcx,%rdx
  or     %rdx,%rax
  mov    %rax,0x0(%rbp,%rdi,8)
  add    $0x1,%rdi
  add    $0x10,%r8
  cmp    %edi,%r10d
  jge    L63
  test   %r9d,%r9d
  jne    L97
  movabs $0x8000000000000000,%rax
  mov    %rax,0x0(%rbp,%rsi,8)
L51:
  lea    0x1(%rsi),%eax
  cmp    $0xe,%eax
  jle    L50
  cmp    $0xf,%eax
  jle    L71
L59:
  lea    0x200(%rbp),%rdi
  mov    %rbp,%rdx
L58:
  mov    0x70(%rdx),%rcx
  mov    0x8(%rdx),%rsi
  mov    %rcx,%rax
  ror    $0x13,%rax
  mov    %rcx,%r8
  rol    $0x3,%r8
  xor    %r8,%rax
  shr    $0x6,%rcx
  xor    %rcx,%rax
  mov    (%rdx),%rcx
  add    0x48(%rdx),%rcx
  add    %rcx,%rax
  mov    %rsi,%rcx
  ror    %rcx
  mov    %rsi,%r8
  ror    $0x8,%r8
  xor    %r8,%rcx
  shr    $0x7,%rsi
  xor    %rsi,%rcx
  add    %rcx,%rax
  mov    %rax,0x80(%rdx)
  add    $0x8,%rdx
  cmp    %rdi,%rdx
  jne    L58
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <SHA512_transform@plt>
  mov    $0x0,%eax
L106:
  cltq
L31:
  movq   $0x0,0x0(%rbp,%rax,8)
  add    $0x1,%rax
  cmp    $0xd,%eax
  jle    L31
L25:
  mov    %r13,%rax
  shr    $0x3d,%rax
  mov    %rax,0x70(%rbp)
  shl    $0x3,%r13
  mov    %r13,0x78(%rbp)
  lea    0x200(%rbp),%rsi
L93:
  mov    0x70(%rbx),%rdx
  mov    0x8(%rbx),%rcx
  mov    %rdx,%rax
  ror    $0x13,%rax
  mov    %rdx,%rdi
  rol    $0x3,%rdi
  xor    %rdi,%rax
  shr    $0x6,%rdx
  xor    %rdx,%rax
  mov    (%rbx),%rdx
  add    0x48(%rbx),%rdx
  add    %rdx,%rax
  mov    %rcx,%rdx
  ror    %rdx
  mov    %rcx,%rdi
  ror    $0x8,%rdi
  xor    %rdi,%rdx
  shr    $0x7,%rcx
  xor    %rcx,%rdx
  add    %rdx,%rax
  mov    %rax,0x80(%rbx)
  add    $0x8,%rbx
  cmp    %rsi,%rbx
  jne    L93
  mov    %rbp,%rsi
  mov    %r12,%rdi
  call   <SHA512_transform@plt>
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  ret
L97:
  lea    0x0(%rbp,%rsi,8),%rdi
  mov    $0x40,%ecx
  sub    %r9d,%ecx
  mov    $0xffffffffffffffff,%rax
  shl    %cl,%rax
  and    (%rdi),%rax
  movabs $0x8000000000000000,%rdx
  mov    %r9d,%ecx
  shr    %cl,%rdx
  or     %rdx,%rax
  mov    %rax,(%rdi)
  jmp    L51
L50:
  cmp    $0xd,%eax
  jle    L106
  jmp    L25
L71:
  movq   $0x0,0x78(%rbp)
  jmp    L59
```

assistant: ```c
void SHA512_finish(unsigned long long H[], unsigned long long W[], unsigned long long FileLen) {
  unsigned long *Buf = (unsigned long *)W;
  int t;
  int Witi = (FileLen % 128) / 8;
  int amari = (FileLen % 8) * 8;
  for (t = 0; t <= Witi; t++)
    W[t] = (unsigned long long)(Buf[t * 2] << 24 | Buf[t * 2] << 8 & 0xFF0000 | Buf[t * 2] >> 8 & 0xFF00 | Buf[t * 2] >> 24) << 32 | (unsigned long long)(Buf[t * 2 + 1] << 24 | Buf[t * 2 + 1] << 8 & 0xFF0000 | Buf[t * 2 + 1] >> 8 & 0xFF00 | Buf[t * 2 + 1] >> 24);
  if (amari == 0)
    W[Witi] = 0x8000000000000000ULL;
  else
    W[Witi] = W[Witi] & 0xFFFFFFFFFFFFFFFFULL << (64 - amari) | 0x8000000000000000ULL >> amari;
  Witi++;
  if (Witi >= 15) {
    for (t = Witi; t < 16; t++)
      W[t] = 0;
    for (t = 16; t < 80; t++)
      W[t] = ((((W[t - 2]) >> (19)) | ((W[t - 2]) << (64 - 19))) ^ (((W[t - 2]) >> (61)) | ((W[t - 2]) << (64 - 61))) ^ ((W[t - 2]) >> (6))) + W[t - 7] + ((((W[t - 15]) >> (1)) | ((W[t - 15]) << (64 - 1))) ^ (((W[t - 15]) >> (8)) | ((W[t - 15]) << (64 - 8))) ^ ((W[t - 15]) >> (7))) + W[t - 16];
    SHA512_transform(H, W);
    Witi = 0;
  }
  for (t = Witi; t < 14; t++)
    W[t] = 0;
  W[14] = FileLen >> 61;
  W[15] = FileLen << 3;
  for (t = 16; t < 80; t++)
    W[t] = ((((W[t - 2]) >> (19)) | ((W[t - 2]) << (64 - 19))) ^ (((W[t - 2]) >> (61)) | ((W[t - 2]) << (64 - 61))) ^ ((W[t - 2]) >> (6))) + W[t - 7] + ((((W[t - 15]) >> (1)) | ((W[t - 15]) << (64 - 1))) ^ (((W[t - 15]) >> (8)) | ((W[t - 15]) << (64 - 8))) ^ ((W[t - 15]) >> (7))) + W[t - 16];
  SHA512_transform(H, W);
}
```