user: Converte this assembly snippet into its equivalent C code:

```asm
<E512>:
  endbr64
  push   %r15
  mov    %rdx,%rax
  mov    %r8,%rdx
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0xb68,%rsp
  movdqu (%rdi),%xmm4
  movdqu 0x30(%rax),%xmm7
  mov    %rsi,0x68(%rsp)
  mov    %rcx,%rsi
  movdqu 0x60(%rax),%xmm3
  lea    0xd0(%rsp),%rbx
  lea    0x80(%rsp),%r12
  lea    0x70(%rsp),%rbp
  mov    %fs:0x28,%rcx
  mov    %rcx,0xb58(%rsp)
  xor    %ecx,%ecx
  movaps %xmm4,0x90(%rsp)
  movdqu 0x10(%rdi),%xmm4
  movaps %xmm7,0x100(%rsp)
  movdqu 0x50(%rax),%xmm7
  movaps %xmm4,0xa0(%rsp)
  movdqu 0x20(%rdi),%xmm4
  movaps %xmm7,0x120(%rsp)
  movaps %xmm4,0xb0(%rsp)
  movdqu 0x30(%rdi),%xmm4
  mov    %rbx,%rdi
  movaps %xmm3,0x130(%rsp)
  movaps %xmm4,0xc0(%rsp)
  movdqu (%rax),%xmm4
  movaps %xmm4,0xd0(%rsp)
  movdqu 0x10(%rax),%xmm4
  movaps %xmm4,0xe0(%rsp)
  movdqu 0x20(%rax),%xmm4
  movaps %xmm4,0xf0(%rsp)
  movdqu 0x40(%rax),%xmm4
  movaps %xmm4,0x110(%rsp)
  movdqu 0x70(%rax),%xmm5
  movaps %xmm5,0x140(%rsp)
  call   <MessageExpansion512@plt>
  mov    0x9c(%rsp),%eax
  movdqa 0xc0(%rsp),%xmm6
  mov    0x90(%rsp),%r15d
  mov    0x94(%rsp),%r14d
  mov    %eax,0x1c(%rsp)
  lea    0x7d0(%rsp),%rax
  movdqa 0xb0(%rsp),%xmm1
  mov    %rax,0x60(%rsp)
  mov    0x98(%rsp),%r13d
  movdqa 0xa0(%rsp),%xmm0
  movaps %xmm6,(%rsp)
  jmp    L13
  xchg   %ax,%ax
L1:
  movdqa 0x50(%rsp),%xmm7
  movaps %xmm7,(%rsp)
L13:
  pshufd $0xff,%xmm0,%xmm2
  mov    0x1c(%rsp),%ecx
  mov    %rbx,%rdx
  mov    %r12,%rsi
  movd   %xmm2,0x1c(%rsp)
  movdqa %xmm0,%xmm2
  mov    %rbp,%rdi
  punpckhdq %xmm0,%xmm2
  mov    %r13d,0x28(%rsp)
  movd   %xmm2,%r13d
  pshufd $0x55,%xmm0,%xmm2
  movaps %xmm0,0x70(%rsp)
  movaps %xmm0,0x30(%rsp)
  mov    %ecx,0x2c(%rsp)
  movaps %xmm1,0x40(%rsp)
  mov    %r14d,0x24(%rsp)
  movd   %xmm2,%r14d
  mov    %r15d,0x20(%rsp)
  movd   %xmm0,%r15d
  call   <roundAESkeyfirst@plt>
  lea    0x10(%rbx),%rdx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movdqa 0x80(%rsp),%xmm5
  movaps %xmm5,0x70(%rsp)
  call   <roundAESkeyfirst@plt>
  lea    0x20(%rbx),%rdx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movdqa 0x80(%rsp),%xmm6
  movaps %xmm6,0x70(%rsp)
  call   <roundAESkeyfirst@plt>
  lea    0x30(%rbx),%rdx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movdqa 0x80(%rsp),%xmm7
  movaps %xmm7,0x70(%rsp)
  call   <roundAESkeyfirst@plt>
  mov    0x20(%rsp),%r10d
  mov    0x2c(%rsp),%ecx
  mov    %r12,%rsi
  xor    0x80(%rsp),%r10d
  mov    0x24(%rsp),%r9d
  lea    0x40(%rbx),%rdx
  mov    %rbp,%rdi
  movd   %r10d,%xmm3
  mov    0x28(%rsp),%r8d
  movdqa (%rsp),%xmm1
  mov    %r10d,0x24(%rsp)
  xor    0x84(%rsp),%r9d
  xor    0x88(%rsp),%r8d
  movd   %r9d,%xmm6
  movd   %r8d,%xmm2
  mov    %r8d,0x2c(%rsp)
  xor    0x8c(%rsp),%ecx
  movd   %ecx,%xmm5
  punpckldq %xmm6,%xmm3
  mov    %ecx,0x28(%rsp)
  punpckldq %xmm5,%xmm2
  movdqa %xmm3,%xmm4
  mov    %r9d,0x20(%rsp)
  punpcklqdq %xmm2,%xmm4
  movaps %xmm1,0x70(%rsp)
  movaps %xmm4,0x50(%rsp)
  call   <roundAESkeyfirst@plt>
  lea    0x50(%rbx),%rdx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movdqa 0x80(%rsp),%xmm7
  movaps %xmm7,0x70(%rsp)
  call   <roundAESkeyfirst@plt>
  lea    0x60(%rbx),%rdx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movdqa 0x80(%rsp),%xmm5
  movaps %xmm5,0x70(%rsp)
  call   <roundAESkeyfirst@plt>
  lea    0x70(%rbx),%rdx
  mov    %r12,%rsi
  mov    %rbp,%rdi
  movdqa 0x80(%rsp),%xmm6
  sub    $0xffffffffffffff80,%rbx
  movaps %xmm6,0x70(%rsp)
  call   <roundAESkeyfirst@plt>
  movdqa 0x30(%rsp),%xmm0
  movdqa 0x40(%rsp),%xmm1
  mov    0x24(%rsp),%r10d
  mov    0x20(%rsp),%r9d
  movdqa %xmm0,%xmm2
  mov    0x2c(%rsp),%r8d
  mov    0x28(%rsp),%ecx
  movdqa 0x80(%rsp),%xmm0
  mov    %r10d,0xc0(%rsp)
  mov    %r9d,0xc4(%rsp)
  pxor   %xmm1,%xmm0
  movdqa (%rsp),%xmm1
  mov    %r8d,0xc8(%rsp)
  mov    %ecx,0xcc(%rsp)
  movaps %xmm2,0x90(%rsp)
  movaps %xmm0,0xa0(%rsp)
  movaps %xmm1,0xb0(%rsp)
  cmp    0x60(%rsp),%rbx
  jne    L1
  movdqa 0x90(%rsp),%xmm4
  mov    0x68(%rsp),%rax
  movdqa 0xa0(%rsp),%xmm7
  movdqa 0xb0(%rsp),%xmm3
  movdqa 0xc0(%rsp),%xmm5
  movups %xmm4,(%rax)
  movups %xmm7,0x10(%rax)
  movups %xmm3,0x20(%rax)
  movups %xmm5,0x30(%rax)
  mov    0xb58(%rsp),%rax
  sub    %fs:0x28,%rax
  jne    L27
  add    $0xb68,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L27:
  call   <__stack_chk_fail@plt>
```

assistant: ```c
void E512(uint32_t pt[16], uint32_t ct[16], uint32_t message[32], uint32_t salt[16], uint32_t counter[4]) {
  uint32_t state[16], i, j;
  uint32_t input[4], output[4], temp;
  uint32_t rk[(14 * 4 * (4) * 3)];
  for (i = 0; i < 16; i++)
    state[i] = pt[i];
  for (i = 0; i < 32; i++)
    rk[i] = message[i];
  MessageExpansion512(rk, salt, counter);
  for (i = 0; i < 14; i++) {
    for (j = 0; j < 4; j++)
      input[j] = state[4 + j];
    roundAESkeyfirst(input, output, rk + 32 * i);
    for (j = 0; j < 4; j++)
      input[j] = output[j];
    roundAESkeyfirst(input, output, rk + 32 * i + 4);
    for (j = 0; j < 4; j++)
      input[j] = output[j];
    roundAESkeyfirst(input, output, rk + 32 * i + 8);
    for (j = 0; j < 4; j++)
      input[j] = output[j];
    roundAESkeyfirst(input, output, rk + 32 * i + 12);
    for (j = 0; j < 4; j++)
      state[j] ^= output[j];
    for (j = 0; j < 4; j++)
      input[j] = state[12 + j];
    roundAESkeyfirst(input, output, rk + 32 * i + 16);
    for (j = 0; j < 4; j++)
      input[j] = output[j];
    roundAESkeyfirst(input, output, rk + 32 * i + 20);
    for (j = 0; j < 4; j++)
      input[j] = output[j];
    roundAESkeyfirst(input, output, rk + 32 * i + 24);
    for (j = 0; j < 4; j++)
      input[j] = output[j];
    roundAESkeyfirst(input, output, rk + 32 * i + 28);
    for (j = 0; j < 4; j++)
      state[8 + j] ^= output[j];
    for (j = 0; j < 4; j++) {
      temp = state[j];
      state[j] = state[j + 4];
      state[j + 4] = state[j + 8];
      state[j + 8] = state[j + 12];
      state[j + 12] = temp;
    }
  }
  for (i = 0; i < 16; i++)
    ct[i] = state[i];
  return;
}
```