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

```asm
<morus_tag_verification>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x58,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %rsi,-0x50(%rbp)
  mov    %rdx,-0x58(%rbp)
  mov    %rcx,-0x60(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x18(%rbp)
  xor    %eax,%eax
  movl   $0x0,-0x38(%rbp)
  mov    -0x60(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%edx
  lea    -0x30(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <_mm_store_si128@plt>
  lea    -0x30(%rbp),%rax
  mov    (%rax),%rdx
  mov    -0x50(%rbp),%rax
  lea    0x0(,%rax,8),%rcx
  lea    -0x30(%rbp),%rax
  xor    %rcx,%rdx
  mov    %rdx,(%rax)
  lea    -0x30(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rdx
  mov    -0x48(%rbp),%rax
  lea    0x0(,%rax,8),%rcx
  lea    -0x30(%rbp),%rax
  add    $0x8,%rax
  xor    %rcx,%rdx
  mov    %rdx,(%rax)
  mov    -0x60(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x60(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%eax
  mov    -0x60(%rbp),%rcx
  lea    0x10(%rcx),%rbx
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_mm_xor_si128@plt>
  mov    %eax,(%rbx)
  lea    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <_mm_load_si128@plt>
  mov    %eax,-0x34(%rbp)
  movl   $0x0,-0x3c(%rbp)
  jmp    L62
L52:
  mov    -0x60(%rbp),%rdx
  mov    -0x34(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <morus_stateupdate@plt>
  addl   $0x1,-0x3c(%rbp)
L62:
  cmpl   $0x7,-0x3c(%rbp)
  jle    L52
  movl   $0x2,-0x3c(%rbp)
  jmp    L57
L75:
  mov    -0x3c(%rbp),%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0x60(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%edx
  mov    -0x60(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  mov    -0x60(%rbp),%rcx
  lea    0x4(%rcx),%rbx
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_mm_xor_si128@plt>
  mov    %eax,(%rbx)
  addl   $0x1,-0x3c(%rbp)
L57:
  cmpl   $0x4,-0x3c(%rbp)
  jle    L75
  mov    -0x60(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%edx
  lea    -0x30(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <_mm_store_si128@plt>
  movl   $0x0,-0x3c(%rbp)
  jmp    L18
L77:
  mov    -0x3c(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x48(%rbp),%rax
  add    %rax,%rdx
  mov    -0x58(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%edx
  mov    -0x3c(%rbp),%eax
  cltq
  movzbl -0x30(%rbp,%rax,1),%eax
  xor    %edx,%eax
  movzbl %al,%eax
  or     %eax,-0x38(%rbp)
  addl   $0x1,-0x3c(%rbp)
L18:
  cmpl   $0xf,-0x3c(%rbp)
  jle    L77
  cmpl   $0x0,-0x38(%rbp)
  jne    L76
  mov    $0x0,%eax
  jmp    L2
L76:
  mov    $0xffffffff,%eax
L2:
  mov    -0x18(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L69
  call   <__stack_chk_fail@plt>
L69:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
int morus_tag_verification(unsigned long long msglen, unsigned long long adlen, const unsigned char *c, __m128i *state) {
  int i;
  unsigned char t[16];
  __m128i tmp;
  int check = 0;
  _mm_store_si128((__m128i *)t, state[3]);
  ((uint64_t *)t)[0] ^= (adlen << 3);
  ((uint64_t *)t)[1] ^= (msglen << 3);
  state[4] = _mm_xor_si128((state[4]), (state[0]));
  tmp = _mm_load_si128((__m128i *)t);
  for (i = 0; i < 8; i++)
    morus_stateupdate(tmp, state);
  for (i = 2; i < 5; i++)
    state[1] = _mm_xor_si128((state[1]), (state[i]));
  _mm_store_si128((__m128i *)t, state[1]);
  for (i = 0; i < 16; i++)
    check |= (c[msglen + i] ^ t[i]);
  if (0 == check)
    return 0;
  else
    return -1;
}
```