user: 请将这段汇编代码片段转换成等效的C代码:

```asm
<compute_smix>:
  endbr64
  push   %r15
  mov    %rsi,%r10
  mov    %rcx,%rsi
  mov    %rdi,%rax
  push   %r14
  mov    %rdx,%r9
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %r8,%rbx
  sub    $0x28,%rsp
  mov    (%r8),%r15d
  mov    0x4(%r8),%edx
  mov    0x8(%r8),%r11d
  mov    0xc(%r8),%edi
  mov    %r15d,%ecx
  sar    $0x10,%ecx
  movzbl %cl,%ecx
  mov    (%r10,%rcx,4),%ecx
  mov    %ecx,0x4(%rsp)
  mov    %r15d,%ecx
  movzbl %ch,%ecx
  movslq %ecx,%r8
  mov    (%r9,%r8,4),%r14d
  movzbl %r15b,%r8d
  sar    $0x18,%r15d
  mov    (%rsi,%r8,4),%r13d
  mov    %edx,%r8d
  movslq %r15d,%r15
  sar    $0x18,%r8d
  mov    %r14d,0x8(%rsp)
  movslq %r8d,%r8
  mov    (%rax,%r8,4),%ecx
  mov    %ecx,0x18(%rsp)
  movzbl %dh,%ecx
  movslq %ecx,%r8
  mov    (%r9,%r8,4),%ecx
  movzbl %dl,%r8d
  sar    $0x10,%edx
  mov    (%rsi,%r8,4),%r8d
  mov    %ecx,0xc(%rsp)
  mov    %r11d,%ecx
  mov    %r8d,0x10(%rsp)
  mov    %r11d,%r8d
  movzbl %ch,%ecx
  sar    $0x18,%r8d
  movslq %r8d,%r8
  mov    (%rax,%r8,4),%r14d
  mov    %r11d,%r8d
  movzbl %r11b,%r11d
  sar    $0x10,%r8d
  mov    (%rsi,%r11,4),%r11d
  movzbl %r8b,%r8d
  mov    %r14d,0x1c(%rsp)
  mov    (%r10,%r8,4),%ebp
  movslq %ecx,%r8
  mov    %edi,%ecx
  mov    %ebp,0x14(%rsp)
  mov    %edi,%ebp
  sar    $0x18,%ebp
  movslq %ebp,%rbp
  mov    (%rax,%rbp,4),%r14d
  mov    %edi,%ebp
  movzbl %dil,%edi
  sar    $0x10,%ebp
  movzbl %bpl,%ebp
  mov    (%r10,%rbp,4),%r12d
  movzbl %ch,%ebp
  mov    (%rax,%r15,4),%ecx
  movzbl %dl,%r15d
  mov    0x4(%rsp),%eax
  movslq %ebp,%rbp
  xor    %r13d,%ecx
  mov    (%r9,%rbp,4),%ebp
  xor    %ecx,%eax
  xor    0x8(%rsp),%eax
  mov    0x18(%rsp),%ecx
  mov    0x10(%rsp),%edx
  xor    %ecx,%edx
  xor    (%r10,%r15,4),%edx
  mov    0x1c(%rsp),%r15d
  xor    0xc(%rsp),%edx
  mov    %r15d,%r10d
  xor    %r11d,%r10d
  xor    0x14(%rsp),%r10d
  xor    (%r9,%r8,4),%r10d
  mov    %eax,%r8d
  mov    (%rsi,%rdi,4),%r9d
  shl    $0x8,%eax
  mov    %edx,%edi
  sar    $0x8,%edx
  and    $0xff00ff00,%r8d
  and    $0xff00ff,%edi
  xor    %dh,%dh
  and    $0xff00ff00,%eax
  xor    %r14d,%r9d
  or     %r8d,%edx
  or     %edi,%eax
  mov    %r10d,%r8d
  mov    %r9d,%esi
  and    $0xff00ff00,%r8d
  xor    %r12d,%esi
  xor    %ebp,%esi
  mov    %esi,%edi
  sar    $0x8,%esi
  and    $0xff00ff,%edi
  and    $0xffff00ff,%esi
  shl    $0x8,%r10d
  xor    0x10(%rsp),%r13d
  or     %r8d,%esi
  and    $0xff00ff00,%r10d
  mov    %edx,%r8d
  shl    $0x10,%edx
  or     %edi,%r10d
  xor    %r8w,%r8w
  movzwl %si,%edi
  sar    $0x10,%esi
  or     %edi,%edx
  or     %r8d,%esi
  movzwl %r10w,%edi
  mov    %eax,%r8d
  shl    $0x10,%eax
  xor    %r8w,%r8w
  sar    $0x10,%r10d
  xor    %r11d,%r13d
  or     %edi,%eax
  mov    %ecx,%edi
  mov    0xc(%rsp),%ecx
  xor    0x8(%rsp),%ecx
  xor    %r15d,%edi
  or     %r8d,%r10d
  xor    %ecx,%ebp
  xor    %eax,%r13d
  xor    %edi,%r14d
  mov    0x4(%rsp),%edi
  xor    0x14(%rsp),%edi
  xor    %edx,%ebp
  xor    %r12d,%edi
  xor    %esi,%r14d
  mov    $0x8,%esi
  xor    %r10d,%edi
  call   <rol32@plt>
  mov    %ebp,%edi
  mov    $0x10,%esi
  mov    %eax,%r12d
  call   <rol32@plt>
  mov    %r13d,%edi
  mov    $0x18,%esi
  mov    %eax,%ebp
  call   <rol32@plt>
  mov    %r14d,%esi
  mov    %r12d,%ecx
  mov    %r12d,%edx
  and    $0xff00ff00,%esi
  and    $0xff00ff,%ecx
  sar    $0x8,%edx
  shl    $0x8,%r14d
  xor    %dh,%dh
  and    $0xff00ff00,%r14d
  or     %esi,%edx
  mov    %ebp,%esi
  shl    $0x8,%ebp
  or     %ecx,%r14d
  mov    %eax,%ecx
  sar    $0x8,%eax
  and    $0xff00ff00,%esi
  and    $0xff00ff,%ecx
  xor    %ah,%ah
  mov    %edx,%r8d
  mov    %r14d,%edi
  and    $0xff00ff00,%ebp
  or     %esi,%eax
  xor    %r8w,%r8w
  xor    %di,%di
  shl    $0x10,%edx
  or     %ecx,%ebp
  movzwl %ax,%esi
  shl    $0x10,%r14d
  movzwl %bp,%ecx
  sar    $0x10,%eax
  or     %esi,%edx
  sar    $0x10,%ebp
  or     %ecx,%r14d
  or     %r8d,%eax
  mov    %edx,0x8(%rbx)
  or     %edi,%ebp
  mov    %r14d,0xc(%rbx)
  mov    %ebp,0x4(%rbx)
  mov    %eax,(%rbx)
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
void compute_smix(uint32_t *tab0, uint32_t *tab1, uint32_t *tab2, uint32_t *tab3, uint32_t *x) {
  uint32_t x0 = x[0];
  uint32_t x1 = x[1];
  uint32_t x2 = x[2];
  uint32_t x3 = x[3];
  uint32_t mu00 = tab0[x0 >> 24];
  uint32_t mu01 = tab1[(x0 >> 16) & 0xFF];
  uint32_t mu02 = tab2[(x0 >> 8) & 0xFF];
  uint32_t mu03 = tab3[x0 & 0xFF];
  uint32_t mu10 = tab0[x1 >> 24];
  uint32_t mu11 = tab1[(x1 >> 16) & 0xFF];
  uint32_t mu12 = tab2[(x1 >> 8) & 0xFF];
  uint32_t mu13 = tab3[x1 & 0xFF];
  uint32_t mu20 = tab0[x2 >> 24];
  uint32_t mu21 = tab1[(x2 >> 16) & 0xFF];
  uint32_t mu22 = tab2[(x2 >> 8) & 0xFF];
  uint32_t mu23 = tab3[x2 & 0xFF];
  uint32_t mu30 = tab0[x3 >> 24];
  uint32_t mu31 = tab1[(x3 >> 16) & 0xFF];
  uint32_t mu32 = tab2[(x3 >> 8) & 0xFF];
  uint32_t mu33 = tab3[x3 & 0xFF];
  x0 = mu00 ^ mu01 ^ mu02 ^ mu03;
  x1 = mu10 ^ mu11 ^ mu12 ^ mu13;
  x2 = mu20 ^ mu21 ^ mu22 ^ mu23;
  x3 = mu30 ^ mu31 ^ mu32 ^ mu33;
  do {
    do {
      uint32_t t00 = (x0) & (uint32_t)0xFF00FF00;
      uint32_t t01 = (x0) & (uint32_t)0x00FF00FF;
      uint32_t t10 = (x1) & (uint32_t)0xFF00FF00;
      uint32_t t11 = (x1) & (uint32_t)0x00FF00FF;
      (x0) = t00 | (t10 >> 8);
      (x1) = (t01 << 8) | t11;
    } while (0);
    do {
      uint32_t t00 = (x2) & (uint32_t)0xFF00FF00;
      uint32_t t01 = (x2) & (uint32_t)0x00FF00FF;
      uint32_t t10 = (x3) & (uint32_t)0xFF00FF00;
      uint32_t t11 = (x3) & (uint32_t)0x00FF00FF;
      (x2) = t00 | (t10 >> 8);
      (x3) = (t01 << 8) | t11;
    } while (0);
    do {
      uint32_t t00 = (x0) & (uint32_t)0xFFFF0000;
      uint32_t t01 = (x0) & (uint32_t)0x0000FFFF;
      uint32_t t10 = (x2) & (uint32_t)0xFFFF0000;
      uint32_t t11 = (x2) & (uint32_t)0x0000FFFF;
      (x0) = t00 | (t10 >> 16);
      (x2) = (t01 << 16) | t11;
    } while (0);
    do {
      uint32_t t00 = (x1) & (uint32_t)0xFFFF0000;
      uint32_t t01 = (x1) & (uint32_t)0x0000FFFF;
      uint32_t t10 = (x3) & (uint32_t)0xFFFF0000;
      uint32_t t11 = (x3) & (uint32_t)0x0000FFFF;
      (x1) = t00 | (t10 >> 16);
      (x3) = (t01 << 16) | t11;
    } while (0);
  } while (0);
  x0 ^= mu10 ^ mu20 ^ mu30;
  x1 ^= mu01 ^ mu21 ^ mu31;
  x2 ^= mu02 ^ mu12 ^ mu32;
  x3 ^= mu03 ^ mu13 ^ mu23;
  x1 = rol32(x1, 8);
  x2 = rol32(x2, 16);
  x3 = rol32(x3, 24);
  do {
    do {
      uint32_t t00 = (x0) & (uint32_t)0xFF00FF00;
      uint32_t t01 = (x0) & (uint32_t)0x00FF00FF;
      uint32_t t10 = (x1) & (uint32_t)0xFF00FF00;
      uint32_t t11 = (x1) & (uint32_t)0x00FF00FF;
      (x0) = t00 | (t10 >> 8);
      (x1) = (t01 << 8) | t11;
    } while (0);
    do {
      uint32_t t00 = (x2) & (uint32_t)0xFF00FF00;
      uint32_t t01 = (x2) & (uint32_t)0x00FF00FF;
      uint32_t t10 = (x3) & (uint32_t)0xFF00FF00;
      uint32_t t11 = (x3) & (uint32_t)0x00FF00FF;
      (x2) = t00 | (t10 >> 8);
      (x3) = (t01 << 8) | t11;
    } while (0);
    do {
      uint32_t t00 = (x0) & (uint32_t)0xFFFF0000;
      uint32_t t01 = (x0) & (uint32_t)0x0000FFFF;
      uint32_t t10 = (x2) & (uint32_t)0xFFFF0000;
      uint32_t t11 = (x2) & (uint32_t)0x0000FFFF;
      (x0) = t00 | (t10 >> 16);
      (x2) = (t01 << 16) | t11;
    } while (0);
    do {
      uint32_t t00 = (x1) & (uint32_t)0xFFFF0000;
      uint32_t t01 = (x1) & (uint32_t)0x0000FFFF;
      uint32_t t10 = (x3) & (uint32_t)0xFFFF0000;
      uint32_t t11 = (x3) & (uint32_t)0x0000FFFF;
      (x1) = t00 | (t10 >> 16);
      (x3) = (t01 << 16) | t11;
    } while (0);
  } while (0);
  x[0] = x0;
  x[1] = x1;
  x[2] = x2;
  x[3] = x3;
}
```