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

```asm
<serpent_inv_lt>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x18,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  mov    -0x18(%rbp),%rdx
  lea    0x8(%rdx),%rbx
  mov    $0xa,%esi
  mov    %eax,%edi
  call   <rotl32@plt>
  mov    %eax,(%rbx)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  mov    $0x5,%esi
  mov    %eax,%edi
  call   <rotr32@plt>
  mov    -0x18(%rbp),%rdx
  mov    %eax,(%rdx)
  mov    -0x18(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%edx
  mov    -0x18(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%ecx
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  shl    $0x7,%eax
  xor    %eax,%ecx
  mov    -0x18(%rbp),%rax
  add    $0x8,%rax
  xor    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%edx
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%ecx
  mov    -0x18(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%eax
  xor    %ecx,%eax
  xor    %eax,%edx
  mov    -0x18(%rbp),%rax
  mov    %edx,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%eax
  mov    -0x18(%rbp),%rdx
  lea    0xc(%rdx),%rbx
  mov    $0x7,%esi
  mov    %eax,%edi
  call   <rotr32@plt>
  mov    %eax,(%rbx)
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%eax
  mov    -0x18(%rbp),%rdx
  lea    0x4(%rdx),%rbx
  mov    $0x1,%esi
  mov    %eax,%edi
  call   <rotr32@plt>
  mov    %eax,(%rbx)
  mov    -0x18(%rbp),%rax
  add    $0xc,%rax
  mov    (%rax),%edx
  mov    -0x18(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%ecx
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  shl    $0x3,%eax
  xor    %eax,%ecx
  mov    -0x18(%rbp),%rax
  add    $0xc,%rax
  xor    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  mov    (%rax),%edx
  mov    -0x18(%rbp),%rax
  mov    (%rax),%ecx
  mov    -0x18(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  xor    %eax,%ecx
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  xor    %ecx,%edx
  mov    %edx,(%rax)
  mov    -0x18(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%eax
  mov    -0x18(%rbp),%rdx
  lea    0x8(%rdx),%rbx
  mov    $0x3,%esi
  mov    %eax,%edi
  call   <rotr32@plt>
  mov    %eax,(%rbx)
  mov    -0x18(%rbp),%rax
  mov    (%rax),%eax
  mov    $0xd,%esi
  mov    %eax,%edi
  call   <rotr32@plt>
  mov    -0x18(%rbp),%rdx
  mov    %eax,(%rdx)
  nop
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
void serpent_inv_lt(uint8_t *b) {
  (((uint32_t *)b)[2]) = rotl32((((uint32_t *)b)[2]), 10);
  (((uint32_t *)b)[0]) = rotr32((((uint32_t *)b)[0]), 5);
  (((uint32_t *)b)[2]) ^= (((uint32_t *)b)[3]) ^ ((((uint32_t *)b)[1]) << 7);
  (((uint32_t *)b)[0]) ^= (((uint32_t *)b)[1]) ^ (((uint32_t *)b)[3]);
  (((uint32_t *)b)[3]) = rotr32((((uint32_t *)b)[3]), 7);
  (((uint32_t *)b)[1]) = rotr32((((uint32_t *)b)[1]), 1);
  (((uint32_t *)b)[3]) ^= (((uint32_t *)b)[2]) ^ ((((uint32_t *)b)[0]) << 3);
  (((uint32_t *)b)[1]) ^= (((uint32_t *)b)[0]) ^ (((uint32_t *)b)[2]);
  (((uint32_t *)b)[2]) = rotr32((((uint32_t *)b)[2]), 3);
  (((uint32_t *)b)[0]) = rotr32((((uint32_t *)b)[0]), 13);
}
```