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

```asm
<morus_dec_aut_partialblock>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x60,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %rsi,-0x50(%rbp)
  mov    %rdx,-0x58(%rbp)
  mov    %rcx,-0x60(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  lea    -0x20(%rbp),%rax
  mov    $0x10,%edx
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  mov    -0x58(%rbp),%rdx
  mov    -0x50(%rbp),%rcx
  lea    -0x20(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  lea    -0x20(%rbp),%rax
  mov    %rax,%rdi
  call   <_mm_load_si128@plt>
  mov    %eax,-0x38(%rbp)
  mov    $0x1,%ecx
  mov    $0x2,%edx
  mov    $0x3,%esi
  mov    $0x0,%edi
  call   <_MM_SHUFFLE@plt>
  mov    %eax,%edx
  mov    -0x60(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_mm_shuffle_epi32@plt>
  mov    %eax,%edx
  mov    -0x60(%rbp),%rax
  mov    (%rax),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_mm_xor_si128@plt>
  mov    %eax,-0x34(%rbp)
  mov    -0x60(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%edx
  mov    -0x60(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_mm_and_si128@plt>
  mov    %eax,%edx
  mov    -0x34(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_mm_xor_si128@plt>
  mov    %eax,-0x34(%rbp)
  mov    -0x38(%rbp),%edx
  mov    -0x34(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_mm_xor_si128@plt>
  mov    %eax,-0x38(%rbp)
  mov    -0x38(%rbp),%edx
  lea    -0x30(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <_mm_store_si128@plt>
  mov    -0x58(%rbp),%rax
  mov    %eax,%edx
  mov    $0x10,%eax
  sub    %edx,%eax
  mov    %eax,%edx
  lea    -0x30(%rbp),%rcx
  mov    -0x58(%rbp),%rax
  add    %rcx,%rax
  mov    $0x0,%esi
  mov    %rax,%rdi
  call   <memset@plt>
  mov    -0x58(%rbp),%rdx
  lea    -0x30(%rbp),%rcx
  mov    -0x48(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <memcpy@plt>
  lea    -0x30(%rbp),%rax
  mov    %rax,%rdi
  call   <_mm_load_si128@plt>
  mov    %eax,-0x38(%rbp)
  mov    -0x60(%rbp),%rdx
  mov    -0x38(%rbp),%eax
  mov    %rdx,%rsi
  mov    %eax,%edi
  call   <morus_stateupdate@plt>
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L5
  call   <__stack_chk_fail@plt>
L5:
  leave
  ret
```

assistant: ```c
void morus_dec_aut_partialblock(unsigned char *plaintext, const unsigned char *ciphertext, unsigned long len, __m128i *state) {
  unsigned char plaintextblock[16], ciphertextblock[16];
  __m128i keystream;
  __m128i msgblk;
  memset(ciphertextblock, 0, 16);
  memcpy(ciphertextblock, ciphertext, len);
  msgblk = _mm_load_si128((__m128i *)ciphertextblock);
  keystream = _mm_xor_si128((state[0]), (_mm_shuffle_epi32((state[1]), _MM_SHUFFLE(0, 3, 2, 1))));
  keystream = _mm_xor_si128((keystream), (_mm_and_si128((state[2]), (state[3]))));
  msgblk = _mm_xor_si128((keystream), (msgblk));
  _mm_store_si128((__m128i *)plaintextblock, msgblk);
  memset(plaintextblock + len, 0, 16 - len);
  memcpy(plaintext, plaintextblock, len);
  msgblk = _mm_load_si128((__m128i *)plaintextblock);
  morus_stateupdate(msgblk, state);
}
```