user: 请从给定的汇编指令推导出C源代码：

```asm
<vp8cx_horizontal_line_2_1_scale_c>:
  endbr64
  mov    %esi,%r8d
  test   %esi,%esi
  je     L94
  lea    -0x1(%rsi),%esi
  mov    %esi,%eax
  shr    %eax
  add    $0x1,%eax
  lea    -0x1(%rdi,%rax,2),%rcx
  cmp    %rcx,%rdx
  setae  %cl
  add    %rdx,%rax
  cmp    %rax,%rdi
  setae  %al
  or     %al,%cl
  je     L62
  cmp    $0xffffffff,%r8d
  setne  %cl
  cmp    $0x1f,%esi
  seta   %al
  test   %al,%cl
  je     L62
  movdqa D0(%rip),%xmm2
  shr    $0x5,%esi
  xor    %eax,%eax
  xor    %ecx,%ecx
  nopl   0x0(%rax)
L67:
  movdqu (%rdi,%rax,2),%xmm0
  movdqu 0x10(%rdi,%rax,2),%xmm1
  add    $0x1,%ecx
  pand   %xmm2,%xmm0
  pand   %xmm2,%xmm1
  packuswb %xmm1,%xmm0
  movups %xmm0,(%rdx,%rax,1)
  add    $0x10,%rax
  cmp    %esi,%ecx
  jb     L67
  shl    $0x4,%esi
  mov    %esi,%eax
  lea    (%rdi,%rax,2),%rcx
  add    %rax,%rdx
  movzbl (%rcx),%eax
  mov    %al,(%rdx)
  lea    0x2(%rsi,%rsi,1),%eax
  cmp    %eax,%r8d
  jbe    L94
  movzbl 0x2(%rcx),%esi
  mov    %sil,0x1(%rdx)
  lea    0x2(%rax),%esi
  cmp    %esi,%r8d
  jbe    L94
  movzbl 0x4(%rcx),%esi
  mov    %sil,0x2(%rdx)
  lea    0x4(%rax),%esi
  cmp    %esi,%r8d
  jbe    L94
  movzbl 0x6(%rcx),%esi
  mov    %sil,0x3(%rdx)
  lea    0x6(%rax),%esi
  cmp    %esi,%r8d
  jbe    L94
  movzbl 0x8(%rcx),%esi
  mov    %sil,0x4(%rdx)
  lea    0x8(%rax),%esi
  cmp    %esi,%r8d
  jbe    L94
  movzbl 0xa(%rcx),%esi
  mov    %sil,0x5(%rdx)
  lea    0xa(%rax),%esi
  cmp    %esi,%r8d
  jbe    L94
  movzbl 0xc(%rcx),%esi
  mov    %sil,0x6(%rdx)
  lea    0xc(%rax),%esi
  cmp    %esi,%r8d
  jbe    L94
  movzbl 0xe(%rcx),%esi
  mov    %sil,0x7(%rdx)
  lea    0xe(%rax),%esi
  cmp    %esi,%r8d
  jbe    L94
  movzbl 0x10(%rcx),%esi
  mov    %sil,0x8(%rdx)
  lea    0x10(%rax),%esi
  cmp    %esi,%r8d
  jbe    L94
  movzbl 0x12(%rcx),%esi
  mov    %sil,0x9(%rdx)
  lea    0x12(%rax),%esi
  cmp    %esi,%r8d
  jbe    L94
  movzbl 0x14(%rcx),%esi
  mov    %sil,0xa(%rdx)
  lea    0x14(%rax),%esi
  cmp    %esi,%r8d
  jbe    L94
  movzbl 0x16(%rcx),%esi
  mov    %sil,0xb(%rdx)
  lea    0x16(%rax),%esi
  cmp    %esi,%r8d
  jbe    L94
  movzbl 0x18(%rcx),%esi
  mov    %sil,0xc(%rdx)
  lea    0x18(%rax),%esi
  cmp    %esi,%r8d
  jbe    L94
  movzbl 0x1a(%rcx),%esi
  mov    %sil,0xd(%rdx)
  lea    0x1a(%rax),%esi
  cmp    %esi,%r8d
  jbe    L94
  movzbl 0x1c(%rcx),%esi
  add    $0x1c,%eax
  mov    %sil,0xe(%rdx)
  cmp    %eax,%r8d
  jbe    L94
  movzbl 0x1e(%rcx),%eax
  mov    %al,0xf(%rdx)
  ret
  nopl   0x0(%rax)
L62:
  xor    %eax,%eax
  nopw   0x0(%rax,%rax,1)
L61:
  movzbl (%rdi,%rax,2),%ecx
  mov    %cl,(%rdx,%rax,1)
  add    $0x1,%rax
  lea    (%rax,%rax,1),%ecx
  cmp    %ecx,%r8d
  ja     L61
L94:
  ret
```

tool_calls: name: disassemble_data
arguments: tag: D0
datatype: byte[16]

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

assistant: ```c
void vp8cx_horizontal_line_2_1_scale_c(const unsigned char *source, unsigned int source_width, unsigned char *dest, unsigned int dest_width) {
  unsigned int i;
  unsigned int a;
  unsigned char *des = dest;
  const unsigned char *src = source;
  (void)dest_width;
  for (i = 0; i < source_width; i += 2) {
    a = src[0];
    des[0] = (unsigned char)(a);
    src += 2;
    des += 1;
  }
}
```