user: Translate the below assembly code into C programming language:

```asm
<FourByteSwap>:
  endbr64
  mov    %rdi,%rdx
  mov    %esi,%ecx
  test   %esi,%esi
  jle    L127
  lea    -0x1(%rsi),%eax
  mov    %eax,%edi
  shr    $0x2,%edi
  add    $0x1,%edi
  cmp    $0x3b,%eax
  jbe    L114
  mov    %edi,%esi
  movdqa D7(%rip),%xmm3
  mov    %rdx,%rax
  shr    $0x4,%esi
  sub    $0x1,%esi
  shl    $0x6,%rsi
  lea    0x40(%rdx,%rsi,1),%rsi
  nopl   0x0(%rax)
L87:
  movdqu (%rax),%xmm1
  movdqu 0x10(%rax),%xmm0
  movdqa %xmm3,%xmm6
  add    $0x40,%rax
  movdqu -0x30(%rax),%xmm2
  movdqu -0x20(%rax),%xmm4
  pand   %xmm3,%xmm0
  pand   %xmm3,%xmm1
  movdqu -0x10(%rax),%xmm5
  packuswb %xmm0,%xmm1
  movdqu -0x40(%rax),%xmm0
  psrlw  $0x8,%xmm2
  pand   %xmm3,%xmm4
  psrlw  $0x8,%xmm5
  psrlw  $0x8,%xmm0
  packuswb %xmm2,%xmm0
  movdqu -0x10(%rax),%xmm2
  pand   %xmm3,%xmm2
  packuswb %xmm2,%xmm4
  movdqu -0x20(%rax),%xmm2
  pand   %xmm4,%xmm6
  psrlw  $0x8,%xmm4
  psrlw  $0x8,%xmm2
  packuswb %xmm5,%xmm2
  movdqa %xmm3,%xmm5
  pand   %xmm1,%xmm5
  psrlw  $0x8,%xmm1
  packuswb %xmm6,%xmm5
  packuswb %xmm4,%xmm1
  movdqa %xmm3,%xmm6
  movdqa %xmm3,%xmm4
  pand   %xmm2,%xmm6
  pand   %xmm0,%xmm4
  psrlw  $0x8,%xmm2
  psrlw  $0x8,%xmm0
  packuswb %xmm6,%xmm4
  packuswb %xmm2,%xmm0
  movdqa %xmm0,%xmm2
  punpckhbw %xmm4,%xmm0
  punpcklbw %xmm4,%xmm2
  movdqa %xmm1,%xmm4
  punpckhbw %xmm5,%xmm1
  punpcklbw %xmm5,%xmm4
  movdqa %xmm2,%xmm5
  punpckhbw %xmm4,%xmm2
  punpcklbw %xmm4,%xmm5
  movups %xmm2,-0x30(%rax)
  movdqa %xmm0,%xmm2
  punpckhbw %xmm1,%xmm0
  punpcklbw %xmm1,%xmm2
  movups %xmm5,-0x40(%rax)
  movups %xmm2,-0x20(%rax)
  movups %xmm0,-0x10(%rax)
  cmp    %rsi,%rax
  jne    L87
  mov    %edi,%eax
  and    $0xfffffff0,%eax
  mov    %eax,%esi
  lea    (%rdx,%rsi,4),%rdx
  mov    %eax,%esi
  neg    %esi
  lea    (%rcx,%rsi,4),%ecx
  cmp    %eax,%edi
  je     L127
L114:
  movzbl (%rdx),%eax
  movzbl 0x3(%rdx),%esi
  rolw   $0x8,0x1(%rdx)
  mov    %al,0x3(%rdx)
  lea    -0x4(%rcx),%eax
  mov    %sil,(%rdx)
  test   %eax,%eax
  jle    L127
  movzbl 0x4(%rdx),%eax
  movzbl 0x7(%rdx),%esi
  rolw   $0x8,0x5(%rdx)
  mov    %al,0x7(%rdx)
  lea    -0x8(%rcx),%eax
  mov    %sil,0x4(%rdx)
  test   %eax,%eax
  jle    L127
  movzbl 0x8(%rdx),%eax
  movzbl 0xb(%rdx),%esi
  rolw   $0x8,0x9(%rdx)
  mov    %al,0xb(%rdx)
  lea    -0xc(%rcx),%eax
  mov    %sil,0x8(%rdx)
  test   %eax,%eax
  jle    L127
  movzbl 0xc(%rdx),%eax
  movzbl 0xf(%rdx),%esi
  rolw   $0x8,0xd(%rdx)
  mov    %al,0xf(%rdx)
  lea    -0x10(%rcx),%eax
  mov    %sil,0xc(%rdx)
  test   %eax,%eax
  jle    L127
  movzbl 0x10(%rdx),%eax
  movzbl 0x13(%rdx),%esi
  rolw   $0x8,0x11(%rdx)
  mov    %al,0x13(%rdx)
  lea    -0x14(%rcx),%eax
  mov    %sil,0x10(%rdx)
  test   %eax,%eax
  jle    L127
  movzbl 0x14(%rdx),%eax
  movzbl 0x17(%rdx),%esi
  rolw   $0x8,0x15(%rdx)
  mov    %al,0x17(%rdx)
  lea    -0x18(%rcx),%eax
  mov    %sil,0x14(%rdx)
  test   %eax,%eax
  jle    L127
  movzbl 0x18(%rdx),%eax
  movzbl 0x1b(%rdx),%esi
  rolw   $0x8,0x19(%rdx)
  mov    %al,0x1b(%rdx)
  lea    -0x1c(%rcx),%eax
  mov    %sil,0x18(%rdx)
  test   %eax,%eax
  jle    L127
  movzbl 0x1c(%rdx),%eax
  movzbl 0x1f(%rdx),%esi
  rolw   $0x8,0x1d(%rdx)
  mov    %al,0x1f(%rdx)
  lea    -0x20(%rcx),%eax
  mov    %sil,0x1c(%rdx)
  test   %eax,%eax
  jle    L127
  movzbl 0x20(%rdx),%eax
  movzbl 0x23(%rdx),%esi
  rolw   $0x8,0x21(%rdx)
  mov    %al,0x23(%rdx)
  lea    -0x24(%rcx),%eax
  mov    %sil,0x20(%rdx)
  test   %eax,%eax
  jle    L127
  movzbl 0x24(%rdx),%eax
  movzbl 0x27(%rdx),%esi
  rolw   $0x8,0x25(%rdx)
  mov    %al,0x27(%rdx)
  lea    -0x28(%rcx),%eax
  mov    %sil,0x24(%rdx)
  test   %eax,%eax
  jle    L127
  movzbl 0x28(%rdx),%eax
  movzbl 0x2b(%rdx),%esi
  rolw   $0x8,0x29(%rdx)
  mov    %al,0x2b(%rdx)
  lea    -0x2c(%rcx),%eax
  mov    %sil,0x28(%rdx)
  test   %eax,%eax
  jle    L127
  movzbl 0x2c(%rdx),%eax
  movzbl 0x2f(%rdx),%esi
  rolw   $0x8,0x2d(%rdx)
  mov    %al,0x2f(%rdx)
  lea    -0x30(%rcx),%eax
  mov    %sil,0x2c(%rdx)
  test   %eax,%eax
  jle    L127
  movzbl 0x30(%rdx),%eax
  movzbl 0x33(%rdx),%esi
  rolw   $0x8,0x31(%rdx)
  mov    %al,0x33(%rdx)
  lea    -0x34(%rcx),%eax
  mov    %sil,0x30(%rdx)
  test   %eax,%eax
  jle    L127
  movzbl 0x34(%rdx),%eax
  movzbl 0x37(%rdx),%esi
  rolw   $0x8,0x35(%rdx)
  mov    %sil,0x34(%rdx)
  mov    %al,0x37(%rdx)
  cmp    $0x38,%ecx
  jle    L127
  movzbl 0x38(%rdx),%eax
  movzbl 0x3b(%rdx),%ecx
  rolw   $0x8,0x39(%rdx)
  mov    %cl,0x38(%rdx)
  mov    %al,0x3b(%rdx)
L127:
  ret
```

tool_calls: name: unpack_data
arguments: label: D7
data_type: byte[16]

tool: {"D7": [0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00,0xff,0x00]}

assistant: ```c
void FourByteSwap(buf, nbytes) register unsigned char *buf;
register int nbytes;
{
  register unsigned char c;
  for (; nbytes > 0; nbytes -= 4, buf += 4) {
    c = buf[0];
    buf[0] = buf[3];
    buf[3] = c;
    c = buf[1];
    buf[1] = buf[2];
    buf[2] = c;
  }
}
```