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

```asm
<vp8_filter_block2d_bil_first_pass>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x70,%rsp
  mov    %r8d,-0x6c(%rsp)
  mov    0xa8(%rsp),%rax
  test   %r8d,%r8d
  je     L50
  mov    %r9d,%ebp
  sub    %r9d,%edx
  lea    0x0(%rbp,%rbp,1),%rbx
  mov    %rbx,-0x68(%rsp)
  test   %r9d,%r9d
  je     L50
  movslq %ecx,%r10
  lea    -0x1(%r9),%ecx
  mov    (%rax),%r8d
  mov    %r9d,%r15d
  mov    %ecx,-0x58(%rsp)
  lea    0x1(%rdx,%rcx,1),%rcx
  and    $0xfffffff0,%r15d
  xor    %r12d,%r12d
  mov    %rcx,-0x60(%rsp)
  mov    0x4(%rax),%ecx
  mov    %r9d,%eax
  movd   %r8d,%xmm6
  shr    $0x4,%eax
  mov    %r15d,-0x54(%rsp)
  lea    (%rsi,%rbx,1),%r13
  lea    (%rdi,%r10,1),%rdx
  lea    -0x1(%rax),%r11d
  mov    %r15d,%eax
  movd   %ecx,%xmm7
  mov    %r13,%rbx
  mov    %rax,-0x50(%rsp)
  add    %rax,%rax
  pshufd $0x0,%xmm6,%xmm5
  add    $0x1,%r11
  mov    %rax,-0x48(%rsp)
  lea    0x1(%r15),%eax
  shl    $0x4,%r11
  pxor   %xmm6,%xmm6
  mov    %eax,-0x38(%rsp)
  add    %rax,%rax
  pshufd $0x0,%xmm7,%xmm4
  pxor   %xmm3,%xmm3
  mov    %rax,-0x40(%rsp)
  lea    0x2(%r15),%eax
  movdqa %xmm5,%xmm9
  movdqa %xmm4,%xmm8
  mov    %eax,-0x34(%rsp)
  add    %rax,%rax
  psrlq  $0x20,%xmm9
  mov    %rax,-0x30(%rsp)
  lea    0x3(%r15),%eax
  psrlq  $0x20,%xmm8
  mov    %eax,-0x20(%rsp)
  add    %rax,%rax
  mov    %rax,-0x28(%rsp)
  lea    0x4(%r15),%eax
  mov    %eax,-0x1c(%rsp)
  add    %rax,%rax
  mov    %rax,-0x18(%rsp)
  lea    0x5(%r15),%eax
  mov    %eax,-0x8(%rsp)
  add    %rax,%rax
  mov    %rax,-0x10(%rsp)
  lea    0x6(%r15),%eax
  mov    %eax,-0x4(%rsp)
  add    %rax,%rax
  mov    %rax,(%rsp)
  lea    0x7(%r15),%eax
  mov    %eax,0x10(%rsp)
  add    %rax,%rax
  mov    %rax,0x8(%rsp)
  lea    0x8(%r15),%eax
  mov    %eax,0x14(%rsp)
  add    %rax,%rax
  mov    %rax,0x18(%rsp)
  lea    0x9(%r15),%eax
  mov    %eax,0x28(%rsp)
  add    %rax,%rax
  mov    %rax,0x20(%rsp)
  lea    0xa(%r15),%eax
  mov    %eax,0x2c(%rsp)
  add    %rax,%rax
  mov    %rax,0x30(%rsp)
  lea    0xb(%r15),%eax
  mov    %eax,0x40(%rsp)
  add    %rax,%rax
  mov    %rax,0x38(%rsp)
  lea    0xc(%r15),%eax
  mov    %eax,0x44(%rsp)
  add    %rax,%rax
  mov    %rax,0x48(%rsp)
  lea    0xd(%r15),%eax
  mov    %eax,0x58(%rsp)
  add    %rax,%rax
  mov    %rax,0x50(%rsp)
  lea    0xe(%r15),%eax
  movdqa D5(%rip),%xmm7
  mov    %eax,0x5c(%rsp)
  add    %rax,%rax
  mov    %rax,0x60(%rsp)
L13:
  lea    0x0(%rbp,%rdx,1),%rax
  cmp    %rax,%rsi
  setae  %r14b
  cmp    %rbx,%rdx
  setae  %al
  or     %r14d,%eax
  cmpl   $0xe,-0x58(%rsp)
  seta   %r14b
  test   %r14b,%al
  je     L155
  lea    (%rdi,%rbp,1),%rax
  cmp    %rax,%rsi
  setae  %r15b
  cmp    %rbx,%rdi
  setae  %r14b
  xor    %eax,%eax
  or     %r15b,%r14b
  je     L155
  nopl   0x0(%rax)
L154:
  movdqu (%rdi,%rax,1),%xmm2
  movdqu (%rdx,%rax,1),%xmm1
  movdqa %xmm2,%xmm11
  movdqa %xmm1,%xmm10
  punpckhbw %xmm6,%xmm2
  punpcklbw %xmm6,%xmm11
  punpcklbw %xmm6,%xmm10
  punpckhbw %xmm6,%xmm1
  movdqa %xmm11,%xmm12
  punpckhwd %xmm3,%xmm11
  punpcklwd %xmm3,%xmm12
  movdqa %xmm12,%xmm0
  psrlq  $0x20,%xmm12
  pmuludq %xmm5,%xmm0
  pmuludq %xmm9,%xmm12
  pshufd $0x8,%xmm0,%xmm0
  pshufd $0x8,%xmm12,%xmm12
  punpckldq %xmm12,%xmm0
  movdqa %xmm10,%xmm12
  punpckhwd %xmm3,%xmm10
  punpcklwd %xmm3,%xmm12
  movdqa %xmm12,%xmm13
  psrlq  $0x20,%xmm12
  pmuludq %xmm4,%xmm13
  pmuludq %xmm8,%xmm12
  pshufd $0x8,%xmm13,%xmm13
  pshufd $0x8,%xmm12,%xmm12
  punpckldq %xmm12,%xmm13
  movdqa %xmm11,%xmm12
  psrlq  $0x20,%xmm11
  pmuludq %xmm5,%xmm12
  paddd  %xmm13,%xmm0
  pmuludq %xmm9,%xmm11
  paddd  %xmm7,%xmm0
  psrad  $0x7,%xmm0
  pshufd $0x8,%xmm12,%xmm12
  pshufd $0x8,%xmm11,%xmm11
  punpckldq %xmm11,%xmm12
  movdqa %xmm10,%xmm11
  psrlq  $0x20,%xmm10
  pmuludq %xmm4,%xmm11
  pmuludq %xmm8,%xmm10
  pshufd $0x8,%xmm11,%xmm11
  pshufd $0x8,%xmm10,%xmm10
  punpckldq %xmm10,%xmm11
  movdqa %xmm0,%xmm10
  paddd  %xmm11,%xmm12
  paddd  %xmm7,%xmm12
  psrad  $0x7,%xmm12
  punpcklwd %xmm12,%xmm0
  punpckhwd %xmm12,%xmm10
  movdqa %xmm0,%xmm11
  punpcklwd %xmm10,%xmm0
  punpckhwd %xmm10,%xmm11
  punpcklwd %xmm11,%xmm0
  movups %xmm0,(%rsi,%rax,2)
  movdqa %xmm2,%xmm0
  punpckhwd %xmm3,%xmm2
  punpcklwd %xmm3,%xmm0
  movdqa %xmm0,%xmm11
  psrlq  $0x20,%xmm0
  pmuludq %xmm5,%xmm11
  pmuludq %xmm9,%xmm0
  pshufd $0x8,%xmm11,%xmm11
  pshufd $0x8,%xmm0,%xmm10
  movdqa %xmm11,%xmm0
  punpckldq %xmm10,%xmm0
  movdqa %xmm1,%xmm10
  punpckhwd %xmm3,%xmm1
  punpcklwd %xmm3,%xmm10
  movdqa %xmm10,%xmm11
  psrlq  $0x20,%xmm10
  pmuludq %xmm4,%xmm11
  pmuludq %xmm8,%xmm10
  pshufd $0x8,%xmm11,%xmm11
  pshufd $0x8,%xmm10,%xmm10
  punpckldq %xmm10,%xmm11
  movdqa %xmm2,%xmm10
  psrlq  $0x20,%xmm2
  pmuludq %xmm5,%xmm10
  paddd  %xmm11,%xmm0
  pmuludq %xmm9,%xmm2
  paddd  %xmm7,%xmm0
  psrad  $0x7,%xmm0
  pshufd $0x8,%xmm10,%xmm10
  pshufd $0x8,%xmm2,%xmm2
  punpckldq %xmm2,%xmm10
  movdqa %xmm1,%xmm2
  psrlq  $0x20,%xmm1
  pmuludq %xmm4,%xmm2
  pmuludq %xmm8,%xmm1
  pshufd $0x8,%xmm2,%xmm2
  pshufd $0x8,%xmm1,%xmm1
  punpckldq %xmm1,%xmm2
  movdqa %xmm10,%xmm1
  paddd  %xmm2,%xmm1
  movdqa %xmm0,%xmm2
  paddd  %xmm7,%xmm1
  psrad  $0x7,%xmm1
  punpcklwd %xmm1,%xmm0
  punpckhwd %xmm1,%xmm2
  movdqa %xmm0,%xmm1
  punpcklwd %xmm2,%xmm0
  punpckhwd %xmm2,%xmm1
  punpcklwd %xmm1,%xmm0
  movups %xmm0,0x10(%rsi,%rax,2)
  add    $0x10,%rax
  cmp    %rax,%r11
  jne    L154
  mov    -0x50(%rsp),%rax
  add    %rdi,%rax
  cmp    -0x54(%rsp),%r9d
  je     L220
  movzbl (%rax,%r10,1),%r15d
  movzbl (%rax),%r14d
  imul   %ecx,%r15d
  imul   %r8d,%r14d
  lea    0x40(%r15,%r14,1),%r14d
  mov    -0x48(%rsp),%r15
  sar    $0x7,%r14d
  mov    %r14w,(%rsi,%r15,1)
  cmp    -0x38(%rsp),%r9d
  jbe    L220
  movzbl 0x1(%rax,%r10,1),%r15d
  movzbl 0x1(%rax),%r14d
  imul   %ecx,%r15d
  imul   %r8d,%r14d
  lea    0x40(%r15,%r14,1),%r14d
  mov    -0x40(%rsp),%r15
  sar    $0x7,%r14d
  mov    %r14w,(%rsi,%r15,1)
  cmp    -0x34(%rsp),%r9d
  jbe    L220
  movzbl 0x2(%rax,%r10,1),%r15d
  movzbl 0x2(%rax),%r14d
  imul   %ecx,%r15d
  imul   %r8d,%r14d
  lea    0x40(%r15,%r14,1),%r14d
  mov    -0x30(%rsp),%r15
  sar    $0x7,%r14d
  mov    %r14w,(%rsi,%r15,1)
  cmp    -0x20(%rsp),%r9d
  jbe    L220
  movzbl 0x3(%rax,%r10,1),%r15d
  movzbl 0x3(%rax),%r14d
  imul   %ecx,%r15d
  imul   %r8d,%r14d
  lea    0x40(%r15,%r14,1),%r14d
  mov    -0x28(%rsp),%r15
  sar    $0x7,%r14d
  mov    %r14w,(%rsi,%r15,1)
  cmp    -0x1c(%rsp),%r9d
  jbe    L220
  movzbl 0x4(%rax,%r10,1),%r15d
  movzbl 0x4(%rax),%r14d
  imul   %ecx,%r15d
  imul   %r8d,%r14d
  lea    0x40(%r15,%r14,1),%r14d
  mov    -0x18(%rsp),%r15
  sar    $0x7,%r14d
  mov    %r14w,(%rsi,%r15,1)
  cmp    -0x8(%rsp),%r9d
  jbe    L220
  movzbl 0x5(%rax,%r10,1),%r15d
  movzbl 0x5(%rax),%r14d
  imul   %ecx,%r15d
  imul   %r8d,%r14d
  lea    0x40(%r15,%r14,1),%r14d
  mov    -0x10(%rsp),%r15
  sar    $0x7,%r14d
  mov    %r14w,(%rsi,%r15,1)
  cmp    -0x4(%rsp),%r9d
  jbe    L220
  movzbl 0x6(%rax,%r10,1),%r15d
  movzbl 0x6(%rax),%r14d
  imul   %ecx,%r15d
  imul   %r8d,%r14d
  lea    0x40(%r15,%r14,1),%r14d
  mov    (%rsp),%r15
  sar    $0x7,%r14d
  mov    %r14w,(%rsi,%r15,1)
  cmp    0x10(%rsp),%r9d
  jbe    L220
  movzbl 0x7(%rax,%r10,1),%r15d
  movzbl 0x7(%rax),%r14d
  imul   %ecx,%r15d
  imul   %r8d,%r14d
  lea    0x40(%r15,%r14,1),%r14d
  mov    0x8(%rsp),%r15
  sar    $0x7,%r14d
  mov    %r14w,(%rsi,%r15,1)
  cmp    0x14(%rsp),%r9d
  jbe    L220
  movzbl 0x8(%rax,%r10,1),%r15d
  movzbl 0x8(%rax),%r14d
  imul   %ecx,%r15d
  imul   %r8d,%r14d
  lea    0x40(%r15,%r14,1),%r14d
  mov    0x18(%rsp),%r15
  sar    $0x7,%r14d
  mov    %r14w,(%rsi,%r15,1)
  cmp    0x28(%rsp),%r9d
  jbe    L220
  movzbl 0x9(%rax,%r10,1),%r15d
  movzbl 0x9(%rax),%r14d
  imul   %ecx,%r15d
  imul   %r8d,%r14d
  lea    0x40(%r15,%r14,1),%r14d
  mov    0x20(%rsp),%r15
  sar    $0x7,%r14d
  mov    %r14w,(%rsi,%r15,1)
  cmp    0x2c(%rsp),%r9d
  jbe    L220
  movzbl 0xa(%rax,%r10,1),%r15d
  movzbl 0xa(%rax),%r14d
  imul   %ecx,%r15d
  imul   %r8d,%r14d
  lea    0x40(%r15,%r14,1),%r14d
  mov    0x30(%rsp),%r15
  sar    $0x7,%r14d
  mov    %r14w,(%rsi,%r15,1)
  cmp    0x40(%rsp),%r9d
  jbe    L220
  movzbl 0xb(%rax,%r10,1),%r15d
  movzbl 0xb(%rax),%r14d
  imul   %ecx,%r15d
  imul   %r8d,%r14d
  lea    0x40(%r15,%r14,1),%r14d
  mov    0x38(%rsp),%r15
  sar    $0x7,%r14d
  mov    %r14w,(%rsi,%r15,1)
  cmp    0x44(%rsp),%r9d
  jbe    L220
  movzbl 0xc(%rax,%r10,1),%r15d
  movzbl 0xc(%rax),%r14d
  imul   %ecx,%r15d
  imul   %r8d,%r14d
  lea    0x40(%r15,%r14,1),%r14d
  mov    0x48(%rsp),%r15
  sar    $0x7,%r14d
  mov    %r14w,(%rsi,%r15,1)
  cmp    0x58(%rsp),%r9d
  jbe    L220
  movzbl 0xd(%rax,%r10,1),%r15d
  movzbl 0xd(%rax),%r14d
  imul   %ecx,%r15d
  imul   %r8d,%r14d
  lea    0x40(%r15,%r14,1),%r14d
  mov    0x50(%rsp),%r15
  sar    $0x7,%r14d
  mov    %r14w,(%rsi,%r15,1)
  cmp    0x5c(%rsp),%r9d
  jbe    L220
  movzbl 0xe(%rax,%r10,1),%r14d
  movzbl 0xe(%rax),%eax
  imul   %ecx,%r14d
  imul   %r8d,%eax
  lea    0x40(%r14,%rax,1),%eax
  mov    0x60(%rsp),%r14
  sar    $0x7,%eax
  mov    %ax,(%rsi,%r14,1)
  nopl   (%rax)
L220:
  mov    -0x60(%rsp),%rax
  mov    %r13,%rsi
  add    $0x1,%r12d
  add    %rax,%rdi
  add    %rax,%rdx
  mov    -0x68(%rsp),%rax
  add    %rax,%rbx
  cmp    %r12d,-0x6c(%rsp)
  je     L50
  add    %rax,%r13
  jmp    L13
  nopl   0x0(%rax)
L155:
  xor    %eax,%eax
  nopw   0x0(%rax,%rax,1)
L157:
  movzbl (%rdx,%rax,1),%r15d
  movzbl (%rdi,%rax,1),%r14d
  imul   %ecx,%r15d
  imul   %r8d,%r14d
  lea    0x40(%r15,%r14,1),%r14d
  sar    $0x7,%r14d
  mov    %r14w,(%rsi,%rax,2)
  add    $0x1,%rax
  cmp    %rax,%rbp
  jne    L157
  jmp    L220
  nopl   0x0(%rax,%rax,1)
L50:
  add    $0x70,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

tool_calls: name: unpack_data
arguments: label: D5
type: byte[16]

tool: {"D5": [0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00,0x40,0x00,0x00,0x00]}

assistant: ```c
void vp8_filter_block2d_bil_first_pass(unsigned char *src_ptr, unsigned short *output_ptr, unsigned int src_pixels_per_line, int pixel_step, unsigned int output_height, unsigned int output_width, const int *vp8_filter) {
  unsigned int i, j;
  for (i = 0; i < output_height; i++) {
    for (j = 0; j < output_width; j++) {
      output_ptr[j] = (((int)src_ptr[0] * vp8_filter[0]) + ((int)src_ptr[pixel_step] * vp8_filter[1]) + (128 / 2)) >> 7;
      src_ptr++;
    }
    src_ptr += src_pixels_per_line - output_width;
    output_ptr += output_width;
  }
}
```