user: Please show me the C implementation that matches the assembly code listed below:

```asm
<compute_smix>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x100,%rsp
  mov    %rdi,-0xd8(%rbp)
  mov    %rsi,-0xe0(%rbp)
  mov    %rdx,-0xe8(%rbp)
  mov    %rcx,-0xf0(%rbp)
  mov    %r8,-0xf8(%rbp)
  mov    -0xf8(%rbp),%rax
  mov    (%rax),%eax
  mov    %eax,-0xd0(%rbp)
  mov    -0xf8(%rbp),%rax
  mov    0x4(%rax),%eax
  mov    %eax,-0xcc(%rbp)
  mov    -0xf8(%rbp),%rax
  mov    0x8(%rax),%eax
  mov    %eax,-0xc8(%rbp)
  mov    -0xf8(%rbp),%rax
  mov    0xc(%rax),%eax
  mov    %eax,-0xc4(%rbp)
  mov    -0xd0(%rbp),%eax
  sar    $0x18,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0xd8(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0xc0(%rbp)
  mov    -0xd0(%rbp),%eax
  sar    $0x10,%eax
  cltq
  movzbl %al,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0xe0(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0xbc(%rbp)
  mov    -0xd0(%rbp),%eax
  sar    $0x8,%eax
  cltq
  movzbl %al,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0xe8(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0xb8(%rbp)
  mov    -0xd0(%rbp),%eax
  cltq
  movzbl %al,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0xf0(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0xb4(%rbp)
  mov    -0xcc(%rbp),%eax
  sar    $0x18,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0xd8(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0xb0(%rbp)
  mov    -0xcc(%rbp),%eax
  sar    $0x10,%eax
  cltq
  movzbl %al,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0xe0(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0xac(%rbp)
  mov    -0xcc(%rbp),%eax
  sar    $0x8,%eax
  cltq
  movzbl %al,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0xe8(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0xa8(%rbp)
  mov    -0xcc(%rbp),%eax
  cltq
  movzbl %al,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0xf0(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0xa4(%rbp)
  mov    -0xc8(%rbp),%eax
  sar    $0x18,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0xd8(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0xa0(%rbp)
  mov    -0xc8(%rbp),%eax
  sar    $0x10,%eax
  cltq
  movzbl %al,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0xe0(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x9c(%rbp)
  mov    -0xc8(%rbp),%eax
  sar    $0x8,%eax
  cltq
  movzbl %al,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0xe8(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x98(%rbp)
  mov    -0xc8(%rbp),%eax
  cltq
  movzbl %al,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0xf0(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x94(%rbp)
  mov    -0xc4(%rbp),%eax
  sar    $0x18,%eax
  cltq
  lea    0x0(,%rax,4),%rdx
  mov    -0xd8(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x90(%rbp)
  mov    -0xc4(%rbp),%eax
  sar    $0x10,%eax
  cltq
  movzbl %al,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0xe0(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x8c(%rbp)
  mov    -0xc4(%rbp),%eax
  sar    $0x8,%eax
  cltq
  movzbl %al,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0xe8(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x88(%rbp)
  mov    -0xc4(%rbp),%eax
  cltq
  movzbl %al,%eax
  lea    0x0(,%rax,4),%rdx
  mov    -0xf0(%rbp),%rax
  add    %rdx,%rax
  mov    (%rax),%eax
  mov    %eax,-0x84(%rbp)
  mov    -0xc0(%rbp),%eax
  xor    -0xbc(%rbp),%eax
  xor    -0xb8(%rbp),%eax
  xor    -0xb4(%rbp),%eax
  mov    %eax,-0xd0(%rbp)
  mov    -0xb0(%rbp),%eax
  xor    -0xac(%rbp),%eax
  xor    -0xa8(%rbp),%eax
  xor    -0xa4(%rbp),%eax
  mov    %eax,-0xcc(%rbp)
  mov    -0xa0(%rbp),%eax
  xor    -0x9c(%rbp),%eax
  xor    -0x98(%rbp),%eax
  xor    -0x94(%rbp),%eax
  mov    %eax,-0xc8(%rbp)
  mov    -0x90(%rbp),%eax
  xor    -0x8c(%rbp),%eax
  xor    -0x88(%rbp),%eax
  xor    -0x84(%rbp),%eax
  mov    %eax,-0xc4(%rbp)
  mov    -0xd0(%rbp),%eax
  and    $0xff00ff00,%eax
  mov    %eax,-0x80(%rbp)
  mov    -0xd0(%rbp),%eax
  and    $0xff00ff,%eax
  mov    %eax,-0x7c(%rbp)
  mov    -0xcc(%rbp),%eax
  and    $0xff00ff00,%eax
  mov    %eax,-0x78(%rbp)
  mov    -0xcc(%rbp),%eax
  and    $0xff00ff,%eax
  mov    %eax,-0x74(%rbp)
  mov    -0x78(%rbp),%eax
  sar    $0x8,%eax
  or     -0x80(%rbp),%eax
  mov    %eax,-0xd0(%rbp)
  mov    -0x7c(%rbp),%eax
  shl    $0x8,%eax
  or     -0x74(%rbp),%eax
  mov    %eax,-0xcc(%rbp)
  mov    -0xc8(%rbp),%eax
  and    $0xff00ff00,%eax
  mov    %eax,-0x70(%rbp)
  mov    -0xc8(%rbp),%eax
  and    $0xff00ff,%eax
  mov    %eax,-0x6c(%rbp)
  mov    -0xc4(%rbp),%eax
  and    $0xff00ff00,%eax
  mov    %eax,-0x68(%rbp)
  mov    -0xc4(%rbp),%eax
  and    $0xff00ff,%eax
  mov    %eax,-0x64(%rbp)
  mov    -0x68(%rbp),%eax
  sar    $0x8,%eax
  or     -0x70(%rbp),%eax
  mov    %eax,-0xc8(%rbp)
  mov    -0x6c(%rbp),%eax
  shl    $0x8,%eax
  or     -0x64(%rbp),%eax
  mov    %eax,-0xc4(%rbp)
  mov    -0xd0(%rbp),%eax
  mov    $0x0,%ax
  mov    %eax,-0x60(%rbp)
  mov    -0xd0(%rbp),%eax
  movzwl %ax,%eax
  mov    %eax,-0x5c(%rbp)
  mov    -0xc8(%rbp),%eax
  mov    $0x0,%ax
  mov    %eax,-0x58(%rbp)
  mov    -0xc8(%rbp),%eax
  movzwl %ax,%eax
  mov    %eax,-0x54(%rbp)
  mov    -0x58(%rbp),%eax
  sar    $0x10,%eax
  or     -0x60(%rbp),%eax
  mov    %eax,-0xd0(%rbp)
  mov    -0x5c(%rbp),%eax
  shl    $0x10,%eax
  or     -0x54(%rbp),%eax
  mov    %eax,-0xc8(%rbp)
  mov    -0xcc(%rbp),%eax
  mov    $0x0,%ax
  mov    %eax,-0x50(%rbp)
  mov    -0xcc(%rbp),%eax
  movzwl %ax,%eax
  mov    %eax,-0x4c(%rbp)
  mov    -0xc4(%rbp),%eax
  mov    $0x0,%ax
  mov    %eax,-0x48(%rbp)
  mov    -0xc4(%rbp),%eax
  movzwl %ax,%eax
  mov    %eax,-0x44(%rbp)
  mov    -0x48(%rbp),%eax
  sar    $0x10,%eax
  or     -0x50(%rbp),%eax
  mov    %eax,-0xcc(%rbp)
  mov    -0x4c(%rbp),%eax
  shl    $0x10,%eax
  or     -0x44(%rbp),%eax
  mov    %eax,-0xc4(%rbp)
  mov    -0xb0(%rbp),%eax
  xor    -0xa0(%rbp),%eax
  xor    -0x90(%rbp),%eax
  xor    %eax,-0xd0(%rbp)
  mov    -0xbc(%rbp),%eax
  xor    -0x9c(%rbp),%eax
  xor    -0x8c(%rbp),%eax
  xor    %eax,-0xcc(%rbp)
  mov    -0xb8(%rbp),%eax
  xor    -0xa8(%rbp),%eax
  xor    -0x88(%rbp),%eax
  xor    %eax,-0xc8(%rbp)
  mov    -0xb4(%rbp),%eax
  xor    -0xa4(%rbp),%eax
  xor    -0x94(%rbp),%eax
  xor    %eax,-0xc4(%rbp)
  mov    -0xcc(%rbp),%eax
  mov    $0x8,%esi
  mov    %eax,%edi
  call   <rol32@plt>
  mov    %eax,-0xcc(%rbp)
  mov    -0xc8(%rbp),%eax
  mov    $0x10,%esi
  mov    %eax,%edi
  call   <rol32@plt>
  mov    %eax,-0xc8(%rbp)
  mov    -0xc4(%rbp),%eax
  mov    $0x18,%esi
  mov    %eax,%edi
  call   <rol32@plt>
  mov    %eax,-0xc4(%rbp)
  mov    -0xd0(%rbp),%eax
  and    $0xff00ff00,%eax
  mov    %eax,-0x40(%rbp)
  mov    -0xd0(%rbp),%eax
  and    $0xff00ff,%eax
  mov    %eax,-0x3c(%rbp)
  mov    -0xcc(%rbp),%eax
  and    $0xff00ff00,%eax
  mov    %eax,-0x38(%rbp)
  mov    -0xcc(%rbp),%eax
  and    $0xff00ff,%eax
  mov    %eax,-0x34(%rbp)
  mov    -0x38(%rbp),%eax
  sar    $0x8,%eax
  or     -0x40(%rbp),%eax
  mov    %eax,-0xd0(%rbp)
  mov    -0x3c(%rbp),%eax
  shl    $0x8,%eax
  or     -0x34(%rbp),%eax
  mov    %eax,-0xcc(%rbp)
  mov    -0xc8(%rbp),%eax
  and    $0xff00ff00,%eax
  mov    %eax,-0x30(%rbp)
  mov    -0xc8(%rbp),%eax
  and    $0xff00ff,%eax
  mov    %eax,-0x2c(%rbp)
  mov    -0xc4(%rbp),%eax
  and    $0xff00ff00,%eax
  mov    %eax,-0x28(%rbp)
  mov    -0xc4(%rbp),%eax
  and    $0xff00ff,%eax
  mov    %eax,-0x24(%rbp)
  mov    -0x28(%rbp),%eax
  sar    $0x8,%eax
  or     -0x30(%rbp),%eax
  mov    %eax,-0xc8(%rbp)
  mov    -0x2c(%rbp),%eax
  shl    $0x8,%eax
  or     -0x24(%rbp),%eax
  mov    %eax,-0xc4(%rbp)
  mov    -0xd0(%rbp),%eax
  mov    $0x0,%ax
  mov    %eax,-0x20(%rbp)
  mov    -0xd0(%rbp),%eax
  movzwl %ax,%eax
  mov    %eax,-0x1c(%rbp)
  mov    -0xc8(%rbp),%eax
  mov    $0x0,%ax
  mov    %eax,-0x18(%rbp)
  mov    -0xc8(%rbp),%eax
  movzwl %ax,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x18(%rbp),%eax
  sar    $0x10,%eax
  or     -0x20(%rbp),%eax
  mov    %eax,-0xd0(%rbp)
  mov    -0x1c(%rbp),%eax
  shl    $0x10,%eax
  or     -0x14(%rbp),%eax
  mov    %eax,-0xc8(%rbp)
  mov    -0xcc(%rbp),%eax
  mov    $0x0,%ax
  mov    %eax,-0x10(%rbp)
  mov    -0xcc(%rbp),%eax
  movzwl %ax,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0xc4(%rbp),%eax
  mov    $0x0,%ax
  mov    %eax,-0x8(%rbp)
  mov    -0xc4(%rbp),%eax
  movzwl %ax,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x8(%rbp),%eax
  sar    $0x10,%eax
  or     -0x10(%rbp),%eax
  mov    %eax,-0xcc(%rbp)
  mov    -0xc(%rbp),%eax
  shl    $0x10,%eax
  or     -0x4(%rbp),%eax
  mov    %eax,-0xc4(%rbp)
  mov    -0xf8(%rbp),%rax
  mov    -0xd0(%rbp),%edx
  mov    %edx,(%rax)
  mov    -0xf8(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    -0xcc(%rbp),%eax
  mov    %eax,(%rdx)
  mov    -0xf8(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    -0xc8(%rbp),%eax
  mov    %eax,(%rdx)
  mov    -0xf8(%rbp),%rax
  lea    0xc(%rax),%rdx
  mov    -0xc4(%rbp),%eax
  mov    %eax,(%rdx)
  nop
  leave
  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;
}
```