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

```asm
<_i2_i2_swap>:
  endbr64
  add    %edx,%edx
  mov    %rdi,%rcx
  test   %edx,%edx
  jle    L96
  lea    0x1f(%rdi),%rax
  lea    -0x1(%rdx),%r8d
  sub    %rsi,%rax
  cmp    $0x3e,%rax
  jbe    L121
  cmp    $0x1d,%r8d
  jbe    L121
  shr    %r8d
  movdqa D4(%rip),%xmm3
  xor    %eax,%eax
  add    $0x1,%r8d
  mov    %r8d,%edi
  shr    $0x4,%edi
  shl    $0x5,%rdi
  nopl   0x0(%rax,%rax,1)
L29:
  movdqu (%rcx,%rax,1),%xmm1
  movdqu 0x10(%rcx,%rax,1),%xmm0
  movdqu 0x10(%rcx,%rax,1),%xmm2
  pand   %xmm3,%xmm0
  pand   %xmm3,%xmm1
  packuswb %xmm0,%xmm1
  movdqu (%rcx,%rax,1),%xmm0
  psrlw  $0x8,%xmm2
  psrlw  $0x8,%xmm0
  packuswb %xmm2,%xmm0
  movdqa %xmm0,%xmm2
  punpckhbw %xmm1,%xmm0
  punpcklbw %xmm1,%xmm2
  movups %xmm0,0x10(%rsi,%rax,1)
  movups %xmm2,(%rsi,%rax,1)
  add    $0x20,%rax
  cmp    %rax,%rdi
  jne    L29
  mov    %r8d,%edi
  and    $0xfffffff0,%edi
  lea    (%rdi,%rdi,1),%eax
  cmp    %edi,%r8d
  je     L96
  movslq %eax,%rdi
  movzbl (%rcx,%rdi,1),%r8d
  mov    %r8b,0x1(%rsi,%rdi,1)
  movzbl 0x1(%rcx,%rdi,1),%r8d
  mov    %r8b,(%rsi,%rdi,1)
  lea    0x2(%rax),%edi
  cmp    %edi,%edx
  jle    L96
  movslq %edi,%rdi
  movzbl (%rcx,%rdi,1),%r8d
  mov    %r8b,0x1(%rsi,%rdi,1)
  movzbl 0x1(%rcx,%rdi,1),%r8d
  mov    %r8b,(%rsi,%rdi,1)
  lea    0x4(%rax),%edi
  cmp    %edi,%edx
  jle    L96
  movslq %edi,%rdi
  movzbl (%rcx,%rdi,1),%r8d
  mov    %r8b,0x1(%rsi,%rdi,1)
  movzbl 0x1(%rcx,%rdi,1),%r8d
  mov    %r8b,(%rsi,%rdi,1)
  lea    0x6(%rax),%edi
  cmp    %edi,%edx
  jle    L96
  movslq %edi,%rdi
  movzbl (%rcx,%rdi,1),%r8d
  mov    %r8b,0x1(%rsi,%rdi,1)
  movzbl 0x1(%rcx,%rdi,1),%r8d
  mov    %r8b,(%rsi,%rdi,1)
  lea    0x8(%rax),%edi
  cmp    %edi,%edx
  jle    L96
  movslq %edi,%rdi
  movzbl (%rcx,%rdi,1),%r8d
  mov    %r8b,0x1(%rsi,%rdi,1)
  movzbl 0x1(%rcx,%rdi,1),%r8d
  mov    %r8b,(%rsi,%rdi,1)
  lea    0xa(%rax),%edi
  cmp    %edi,%edx
  jle    L96
  movslq %edi,%rdi
  movzbl (%rcx,%rdi,1),%r8d
  mov    %r8b,0x1(%rsi,%rdi,1)
  movzbl 0x1(%rcx,%rdi,1),%r8d
  mov    %r8b,(%rsi,%rdi,1)
  lea    0xc(%rax),%edi
  cmp    %edi,%edx
  jle    L96
  movslq %edi,%rdi
  movzbl (%rcx,%rdi,1),%r8d
  mov    %r8b,0x1(%rsi,%rdi,1)
  movzbl 0x1(%rcx,%rdi,1),%r8d
  mov    %r8b,(%rsi,%rdi,1)
  lea    0xe(%rax),%edi
  cmp    %edi,%edx
  jle    L96
  movslq %edi,%rdi
  movzbl (%rcx,%rdi,1),%r8d
  mov    %r8b,0x1(%rsi,%rdi,1)
  movzbl 0x1(%rcx,%rdi,1),%r8d
  mov    %r8b,(%rsi,%rdi,1)
  lea    0x10(%rax),%edi
  cmp    %edi,%edx
  jle    L96
  movslq %edi,%rdi
  movzbl (%rcx,%rdi,1),%r8d
  mov    %r8b,0x1(%rsi,%rdi,1)
  movzbl 0x1(%rcx,%rdi,1),%r8d
  mov    %r8b,(%rsi,%rdi,1)
  lea    0x12(%rax),%edi
  cmp    %edi,%edx
  jle    L96
  movslq %edi,%rdi
  movzbl (%rcx,%rdi,1),%r8d
  mov    %r8b,0x1(%rsi,%rdi,1)
  movzbl 0x1(%rcx,%rdi,1),%r8d
  mov    %r8b,(%rsi,%rdi,1)
  lea    0x14(%rax),%edi
  cmp    %edi,%edx
  jle    L96
  movslq %edi,%rdi
  movzbl (%rcx,%rdi,1),%r8d
  mov    %r8b,0x1(%rsi,%rdi,1)
  movzbl 0x1(%rcx,%rdi,1),%r8d
  mov    %r8b,(%rsi,%rdi,1)
  lea    0x16(%rax),%edi
  cmp    %edi,%edx
  jle    L96
  movslq %edi,%rdi
  movzbl (%rcx,%rdi,1),%r8d
  mov    %r8b,0x1(%rsi,%rdi,1)
  movzbl 0x1(%rcx,%rdi,1),%r8d
  mov    %r8b,(%rsi,%rdi,1)
  lea    0x18(%rax),%edi
  cmp    %edi,%edx
  jle    L96
  movslq %edi,%rdi
  movzbl (%rcx,%rdi,1),%r8d
  mov    %r8b,0x1(%rsi,%rdi,1)
  movzbl 0x1(%rcx,%rdi,1),%r8d
  mov    %r8b,(%rsi,%rdi,1)
  lea    0x1a(%rax),%edi
  cmp    %edi,%edx
  jle    L96
  movslq %edi,%rdi
  add    $0x1c,%eax
  movzbl (%rcx,%rdi,1),%r8d
  mov    %r8b,0x1(%rsi,%rdi,1)
  movzbl 0x1(%rcx,%rdi,1),%r8d
  mov    %r8b,(%rsi,%rdi,1)
  cmp    %eax,%edx
  jle    L96
  cltq
  movzbl (%rcx,%rax,1),%edx
  mov    %dl,0x1(%rsi,%rax,1)
  movzbl 0x1(%rcx,%rax,1),%edx
  mov    %dl,(%rsi,%rax,1)
  ret
  nopl   0x0(%rax,%rax,1)
L121:
  xor    %eax,%eax
  nopw   0x0(%rax,%rax,1)
L64:
  movzbl (%rcx,%rax,1),%edi
  mov    %dil,0x1(%rsi,%rax,1)
  movzbl 0x1(%rcx,%rax,1),%edi
  mov    %dil,(%rsi,%rax,1)
  add    $0x2,%rax
  cmp    %eax,%edx
  jg     L64
L96:
  ret
```

tool_calls: name: unpack_data
arguments: data_tag: D4
datatype: byte[16]

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

assistant: ```c
void _i2_i2_swap(void *pin, void *pout, int count) {
  unsigned char *in = (unsigned char *)pin;
  unsigned char *out = (unsigned char *)pout;
  int i;
  count *= 2;
  for (i = 0; i < count; i += 2) {
    out[i + 1] = in[i];
    out[i] = in[i + 1];
  }
}
```