user: Converte this assembly snippet into its equivalent C code:

```asm
<array_reverse_bits>:
  endbr64
  mov    %esi,%r8d
  test   %esi,%esi
  je     L47
  lea    -0x1(%rsi),%eax
  cmp    $0xe,%eax
  jbe    L32
  mov    %esi,%edx
  mov    %rdi,%rax
  movdqa D18(%rip),%xmm15
  movdqa D51(%rip),%xmm14
  shr    $0x4,%edx
  movdqa D89(%rip),%xmm13
  movdqa D38(%rip),%xmm12
  sub    $0x1,%edx
  movdqa D74(%rip),%xmm11
  movdqa D86(%rip),%xmm10
  shl    $0x4,%rdx
  movdqa D39(%rip),%xmm7
  movdqa D57(%rip),%xmm9
  movdqa D5(%rip),%xmm8
  lea    0x10(%rdi,%rdx,1),%rdx
  nop
L29:
  movdqu (%rax),%xmm0
  add    $0x10,%rax
  movdqa %xmm0,%xmm2
  movdqa %xmm0,%xmm4
  movdqa %xmm0,%xmm1
  paddb  %xmm0,%xmm2
  psrlw  $0x3,%xmm4
  movdqa %xmm0,%xmm3
  movdqa %xmm2,%xmm5
  psrlw  $0x5,%xmm1
  pand   %xmm15,%xmm4
  paddb  %xmm2,%xmm5
  pand   %xmm13,%xmm1
  pand   %xmm14,%xmm4
  paddb  %xmm5,%xmm5
  pand   %xmm12,%xmm1
  pand   %xmm7,%xmm2
  psrlw  $0x1,%xmm3
  psrlw  $0x7,%xmm0
  paddb  %xmm1,%xmm4
  movdqa %xmm5,%xmm1
  pand   %xmm11,%xmm3
  pand   D65(%rip),%xmm0
  paddb  %xmm5,%xmm1
  pand   %xmm10,%xmm3
  pand   %xmm8,%xmm5
  paddb  %xmm1,%xmm1
  paddb  %xmm2,%xmm0
  movdqa %xmm1,%xmm6
  paddb  %xmm1,%xmm6
  pand   %xmm9,%xmm1
  paddb  %xmm6,%xmm6
  paddb  %xmm5,%xmm1
  paddb  %xmm6,%xmm3
  paddb  %xmm3,%xmm4
  paddb  %xmm1,%xmm4
  paddb  %xmm0,%xmm4
  movups %xmm4,-0x10(%rax)
  cmp    %rdx,%rax
  jne    L29
  mov    %r8d,%esi
  and    $0xfffffff0,%esi
  test   $0xf,%r8b
  je     L40
  nopl   (%rax)
L30:
  mov    %esi,%ecx
  add    $0x1,%esi
  add    %rdi,%rcx
  movzbl (%rcx),%edx
  mov    %edx,%eax
  mov    %edx,%r9d
  shl    $0x7,%r9d
  shr    $0x7,%al
  add    %r9d,%eax
  mov    %edx,%r9d
  shl    $0x5,%r9d
  and    $0x40,%r9d
  add    %r9d,%eax
  lea    0x0(,%rdx,8),%r9d
  and    $0x20,%r9d
  add    %r9d,%eax
  lea    (%rdx,%rdx,1),%r9d
  and    $0x10,%r9d
  add    %r9d,%eax
  mov    %edx,%r9d
  sar    %r9d
  and    $0x8,%r9d
  add    %r9d,%eax
  mov    %edx,%r9d
  sar    $0x5,%edx
  sar    $0x3,%r9d
  and    $0x2,%edx
  and    $0x4,%r9d
  add    %r9d,%eax
  add    %eax,%edx
  mov    %dl,(%rcx)
  cmp    %esi,%r8d
  ja     L30
L47:
  ret
L32:
  xor    %esi,%esi
  jmp    L30
L40:
  ret
```

tool_calls: name: parse_data
arguments: data_tag: D18
type: byte[16]
name: parse_data
arguments: data_tag: D51
type: byte[16]
name: parse_data
arguments: data_tag: D89
type: byte[16]
name: parse_data
arguments: data_tag: D38
type: byte[16]
name: parse_data
arguments: data_tag: D74
type: byte[16]
name: parse_data
arguments: data_tag: D86
type: byte[16]
name: parse_data
arguments: data_tag: D39
type: byte[16]
name: parse_data
arguments: data_tag: D57
type: byte[16]
name: parse_data
arguments: data_tag: D5
type: byte[16]
name: parse_data
arguments: data_tag: D65
type: byte[16]

tool: {"D18": [0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f,0x1f]}

tool: {"D51": [0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04]}

tool: {"D89": [0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07,0x07]}

tool: {"D38": [0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02]}

tool: {"D74": [0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f,0x7f]}

tool: {"D86": [0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08]}

tool: {"D39": [0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10]}

tool: {"D57": [0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40]}

tool: {"D5": [0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20]}

tool: {"D65": [0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01]}

assistant: ```c
void array_reverse_bits(unsigned char data[], unsigned int size) {
  for (unsigned int i = 0; i < size; ++i) {
    unsigned char j = 0;
    j = (data[i] & 0x01) << 7;
    j += (data[i] & 0x02) << 5;
    j += (data[i] & 0x04) << 3;
    j += (data[i] & 0x08) << 1;
    j += (data[i] & 0x10) >> 1;
    j += (data[i] & 0x20) >> 3;
    j += (data[i] & 0x40) >> 5;
    j += (data[i] & 0x80) >> 7;
    data[i] = j;
  }
}
```