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

```asm
<mc>:
  endbr64
  push   %rbp
  mov    %rdi,%rax
  push   %rbx
  mov    (%rdi),%r9d
  mov    0x10(%rdi),%ebp
  mov    0x20(%rdi),%ecx
  mov    %r9d,%r8d
  lea    (%r9,%r9,1),%edx
  sar    $0x7,%r8b
  mov    %ebp,%r11d
  mov    %ecx,%r10d
  sar    $0x7,%r11b
  and    $0x1b,%r8d
  sar    $0x7,%r10b
  xor    %edx,%r8d
  and    $0x1b,%r11d
  lea    0x0(%rbp,%rbp,1),%edx
  and    $0x1b,%r10d
  xor    %edx,%r11d
  lea    (%rcx,%rcx,1),%edx
  xor    %edx,%r10d
  mov    0x30(%rdi),%edx
  mov    %edx,%edi
  lea    (%rdx,%rdx,1),%esi
  sar    $0x7,%dil
  and    $0x1b,%edi
  xor    %esi,%edi
  mov    %ecx,%esi
  xor    %edx,%ecx
  xor    %ebp,%esi
  xor    %r9d,%ecx
  mov    %esi,%ebx
  xor    %r9d,%esi
  xor    %r11d,%ecx
  xor    %r8d,%esi
  xor    %edx,%ebx
  xor    %ebp,%edx
  xor    %r10d,%ecx
  xor    %edi,%esi
  xor    %r9d,%edx
  xor    %r8d,%ebx
  mov    %ecx,0x10(%rax)
  mov    %esi,0x30(%rax)
  mov    0x4(%rax),%esi
  xor    %r10d,%edx
  xor    %r11d,%ebx
  xor    %edi,%edx
  mov    %ebx,(%rax)
  mov    0x34(%rax),%ebx
  mov    %esi,%r8d
  mov    %edx,0x20(%rax)
  lea    (%rsi,%rsi,1),%edx
  sar    $0x7,%r8b
  lea    (%rbx,%rbx,1),%r9d
  mov    %ebx,%ebp
  and    $0x1b,%r8d
  xor    %edx,%r8d
  mov    0x14(%rax),%edx
  mov    %edx,%r11d
  lea    (%rdx,%rdx,1),%ecx
  sar    $0x7,%r11b
  and    $0x1b,%r11d
  xor    %ecx,%r11d
  mov    0x24(%rax),%ecx
  mov    %ecx,%r10d
  lea    (%rcx,%rcx,1),%edi
  sar    $0x7,%r10b
  and    $0x1b,%r10d
  xor    %edi,%r10d
  mov    %ebx,%edi
  sar    $0x7,%dil
  and    $0x1b,%edi
  xor    %r9d,%edi
  mov    %ecx,%r9d
  xor    %esi,%ecx
  xor    %edx,%r9d
  xor    %esi,%edx
  xor    %ebx,%ecx
  xor    %r9d,%esi
  xor    %r9d,%ebp
  xor    %ebx,%edx
  xor    %r11d,%ecx
  xor    %r8d,%esi
  xor    %r8d,%ebp
  xor    %r10d,%edx
  xor    %r10d,%ecx
  xor    %edi,%esi
  xor    %edi,%edx
  xor    %r11d,%ebp
  mov    %ecx,0x14(%rax)
  mov    %esi,0x34(%rax)
  mov    0x8(%rax),%esi
  mov    %edx,0x24(%rax)
  mov    0x38(%rax),%ebx
  mov    %esi,%r8d
  lea    (%rsi,%rsi,1),%edx
  mov    %ebp,0x4(%rax)
  sar    $0x7,%r8b
  lea    (%rbx,%rbx,1),%r9d
  mov    %ebx,%ebp
  and    $0x1b,%r8d
  xor    %edx,%r8d
  mov    0x18(%rax),%edx
  mov    %edx,%r11d
  lea    (%rdx,%rdx,1),%ecx
  sar    $0x7,%r11b
  and    $0x1b,%r11d
  xor    %ecx,%r11d
  mov    0x28(%rax),%ecx
  mov    %ecx,%r10d
  lea    (%rcx,%rcx,1),%edi
  sar    $0x7,%r10b
  and    $0x1b,%r10d
  xor    %edi,%r10d
  mov    %ebx,%edi
  sar    $0x7,%dil
  and    $0x1b,%edi
  xor    %r9d,%edi
  mov    %edx,%r9d
  xor    %esi,%edx
  xor    %ecx,%r9d
  xor    %esi,%ecx
  xor    %ebx,%edx
  xor    %r9d,%ebp
  xor    %r9d,%esi
  mov    0xc(%rax),%r9d
  xor    %r10d,%edx
  xor    %r8d,%ebp
  xor    %r8d,%esi
  xor    %edi,%edx
  xor    %ebx,%ecx
  mov    %r9d,%r8d
  mov    %edx,0x28(%rax)
  lea    (%r9,%r9,1),%edx
  xor    %r11d,%ebp
  sar    $0x7,%r8b
  xor    %r11d,%ecx
  mov    0x3c(%rax),%ebx
  xor    %edi,%esi
  and    $0x1b,%r8d
  xor    %r10d,%ecx
  mov    %esi,0x38(%rax)
  xor    %edx,%r8d
  mov    0x1c(%rax),%edx
  mov    %ecx,0x18(%rax)
  mov    %ebx,%edi
  sar    $0x7,%dil
  mov    %ebp,0x8(%rax)
  mov    %edx,%r11d
  lea    (%rdx,%rdx,1),%ecx
  and    $0x1b,%edi
  sar    $0x7,%r11b
  and    $0x1b,%r11d
  xor    %ecx,%r11d
  mov    0x2c(%rax),%ecx
  mov    %ecx,%r10d
  lea    (%rcx,%rcx,1),%esi
  sar    $0x7,%r10b
  and    $0x1b,%r10d
  xor    %esi,%r10d
  lea    (%rbx,%rbx,1),%esi
  xor    %esi,%edi
  mov    %edx,%esi
  xor    %ecx,%esi
  mov    %esi,%ebp
  xor    %ebx,%ebp
  xor    %r8d,%ebp
  xor    %r11d,%ebp
  xor    %r9d,%ecx
  xor    %r9d,%edx
  xor    %r9d,%esi
  xor    %ebx,%ecx
  xor    %ebx,%edx
  xor    %r8d,%esi
  mov    %ebp,0xc(%rax)
  xor    %r11d,%ecx
  xor    %r10d,%edx
  xor    %edi,%esi
  xor    %r10d,%ecx
  xor    %edi,%edx
  mov    %ecx,0x1c(%rax)
  mov    %edx,0x2c(%rax)
  pop    %rbx
  mov    %esi,0x3c(%rax)
  pop    %rbp
  ret
```

assistant: ```c
void mc(uint8_t *arr) {
  for (int i = 0; i < 4; i++) {
    uint8_t a[4];
    uint8_t b[4];
    uint8_t c;
    uint8_t h;
    for (c = 0; c < 4; c++) {
      a[c] = arr[(4 * c + i)];
      h = (uint8_t)((signed char)arr[(4 * c + i)] >> 7);
      b[c] = arr[(4 * c + i)] << 1;
      b[c] ^= 0x1B & h;
    }
    arr[(i)] = b[0] ^ a[3] ^ a[2] ^ b[1] ^ a[1];
    arr[(4 + i)] = b[1] ^ a[0] ^ a[3] ^ b[2] ^ a[2];
    arr[(8 + i)] = b[2] ^ a[1] ^ a[0] ^ b[3] ^ a[3];
    arr[(12 + i)] = b[3] ^ a[2] ^ a[1] ^ b[0] ^ a[0];
  }
}
```