user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<compute_smix>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %rdi,%rax
  mov    %rsi,%r9
  mov    %rdx,%rdi
  mov    %rcx,%rsi
  mov    %r8,%rbp
  mov    (%r8),%r15d
  mov    0x4(%r8),%edx
  mov    0x8(%r8),%r10d
  mov    0xc(%r8),%ebx
  mov    %r15d,%ecx
  sar    $0x10,%ecx
  movzbl %cl,%ecx
  mov    (%r9,%rcx,4),%ecx
  mov    %ecx,0x4(%rsp)
  mov    %r15d,%ecx
  movzbl %ch,%ecx
  movslq %ecx,%rcx
  mov    (%rdi,%rcx,4),%r14d
  mov    %r14d,0x8(%rsp)
  movzbl %r15b,%ecx
  mov    (%rsi,%rcx,4),%ecx
  mov    %ecx,0xc(%rsp)
  mov    %edx,%r8d
  sar    $0x18,%r8d
  movslq %r8d,%r8
  mov    (%rax,%r8,4),%ecx
  mov    %ecx,0x18(%rsp)
  movzbl %dh,%ecx
  movslq %ecx,%r8
  mov    (%rdi,%r8,4),%r12d
  movzbl %dl,%r8d
  mov    (%rsi,%r8,4),%r14d
  mov    %r14d,0x10(%rsp)
  mov    %r10d,%r8d
  sar    $0x18,%r8d
  movslq %r8d,%r8
  mov    (%rax,%r8,4),%r11d
  mov    %r11d,0x1c(%rsp)
  mov    %r10d,%r8d
  sar    $0x10,%r8d
  movzbl %r8b,%r8d
  mov    (%r9,%r8,4),%r13d
  mov    %r10d,%ecx
  movzbl %ch,%ecx
  movslq %ecx,%r8
  movzbl %r10b,%r10d
  mov    (%rsi,%r10,4),%r10d
  mov    %ebx,%r11d
  sar    $0x18,%r11d
  movslq %r11d,%r11
  mov    (%rax,%r11,4),%r14d
  mov    %ebx,%r11d
  sar    $0x10,%r11d
  movzbl %r11b,%r11d
  mov    (%r9,%r11,4),%r11d
  mov    %r11d,0x14(%rsp)
  movzbl %bh,%ecx
  movslq %ecx,%r11
  mov    (%rdi,%r11,4),%r11d
  sar    $0x18,%r15d
  movslq %r15d,%r15
  mov    0xc(%rsp),%ecx
  xor    (%rax,%r15,4),%ecx
  mov    %ecx,%eax
  xor    0x4(%rsp),%eax
  xor    0x8(%rsp),%eax
  sar    $0x10,%edx
  movzbl %dl,%r15d
  mov    0x18(%rsp),%ecx
  mov    %ecx,%edx
  xor    0x10(%rsp),%edx
  xor    (%r9,%r15,4),%edx
  xor    %r12d,%edx
  mov    0x1c(%rsp),%r15d
  mov    %r15d,%r9d
  xor    %r10d,%r9d
  xor    %r13d,%r9d
  xor    (%rdi,%r8,4),%r9d
  movzbl %bl,%ebx
  mov    %r14d,%r8d
  xor    (%rsi,%rbx,4),%r8d
  mov    %r8d,%esi
  xor    0x14(%rsp),%esi
  xor    %r11d,%esi
  mov    %eax,%r8d
  and    $0xff00ff00,%r8d
  mov    %edx,%ebx
  and    $0xff00ff,%ebx
  sar    $0x8,%edx
  xor    %dh,%dh
  or     %r8d,%edx
  shl    $0x8,%eax
  and    $0xff00ff00,%eax
  or     %ebx,%eax
  mov    %r9d,%r8d
  and    $0xff00ff00,%r8d
  mov    %esi,%edi
  and    $0xff00ff,%edi
  sar    $0x8,%esi
  and    $0xffff00ff,%esi
  or     %r8d,%esi
  shl    $0x8,%r9d
  and    $0xff00ff00,%r9d
  or     %edi,%r9d
  mov    %edx,%r8d
  mov    $0x0,%r8w
  movzwl %si,%edi
  sar    $0x10,%esi
  or     %r8d,%esi
  shl    $0x10,%edx
  or     %edi,%edx
  mov    %eax,%r8d
  mov    $0x0,%r8w
  movzwl %r9w,%edi
  sar    $0x10,%r9d
  or     %r8d,%r9d
  shl    $0x10,%eax
  or     %edi,%eax
  mov    %ecx,%ebx
  xor    %r15d,%ebx
  xor    %r14d,%ebx
  xor    %esi,%ebx
  mov    0x4(%rsp),%edi
  xor    %r13d,%edi
  xor    0x14(%rsp),%edi
  xor    %r9d,%edi
  xor    0x8(%rsp),%r12d
  xor    %r11d,%r12d
  xor    %edx,%r12d
  mov    0x10(%rsp),%r14d
  xor    0xc(%rsp),%r14d
  xor    %r10d,%r14d
  xor    %eax,%r14d
  mov    $0x8,%esi
  call   <rol32@plt>
  mov    %eax,%r13d
  mov    $0x10,%esi
  mov    %r12d,%edi
  call   <rol32@plt>
  mov    %eax,%r12d
  mov    $0x18,%esi
  mov    %r14d,%edi
  call   <rol32@plt>
  mov    %ebx,%ecx
  and    $0xff00ff00,%ecx
  mov    %r13d,%edx
  and    $0xff00ff,%edx
  sar    $0x8,%r13d
  and    $0xffff00ff,%r13d
  or     %ecx,%r13d
  shl    $0x8,%ebx
  and    $0xff00ff00,%ebx
  or     %edx,%ebx
  mov    %r12d,%ecx
  and    $0xff00ff00,%ecx
  mov    %eax,%edx
  and    $0xff00ff,%edx
  sar    $0x8,%eax
  xor    %ah,%ah
  or     %ecx,%eax
  shl    $0x8,%r12d
  and    $0xff00ff00,%r12d
  or     %edx,%r12d
  mov    %r13d,%edi
  mov    $0x0,%di
  movzwl %ax,%ecx
  mov    %ebx,%esi
  mov    $0x0,%si
  movzwl %r12w,%edx
  sar    $0x10,%eax
  or     %edi,%eax
  mov    %eax,0x0(%rbp)
  sar    $0x10,%r12d
  or     %esi,%r12d
  mov    %r12d,0x4(%rbp)
  shl    $0x10,%r13d
  or     %ecx,%r13d
  mov    %r13d,0x8(%rbp)
  shl    $0x10,%ebx
  or     %edx,%ebx
  mov    %ebx,0xc(%rbp)
  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;
}
```