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

```asm
<interpRGB32>:
  endbr64
  push   %r15
  sar    %r8d
  push   %r14
  mov    %rcx,%r14
  push   %r13
  mov    %rdx,%r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rsi,-0x18(%rsp)
  cmp    $0x1,%r8d
  je     L9
  lea    -0x2(%r8),%eax
  mov    %rcx,%r9
  mov    %rdx,%r8
  mov    %rsi,%r11
  add    $0x1,%rax
  mov    %rax,-0x8(%rsp)
  shl    $0x3,%rax
  mov    %rax,-0x10(%rsp)
  lea    (%rdi,%rax,1),%r15
  nopl   0x0(%rax)
L2:
  mov    (%rdi),%r10d
  mov    0x4(%rdi),%ecx
  mov    0x8(%rdi),%edx
  mov    %r10d,%eax
  mov    %r10d,%r12d
  lea    (%r10,%rcx,1),%esi
  shr    $0x3,%eax
  shr    $0x6,%r12d
  lea    0x400801(%rsi),%ebp
  add    %ecx,%edx
  and    $0xff0000,%r12d
  and    $0xff00,%eax
  lea    0x400801(%rdx),%ebx
  or     %r12d,%eax
  movzbl %r10b,%r12d
  or     %r12d,%eax
  mov    %ebp,%r12d
  mov    %eax,(%r8)
  mov    %ebp,%eax
  shr    $0x4,%r12d
  shr    %eax
  and    $0xff00,%r12d
  shr    $0x7,%ebp
  movzbl %al,%eax
  and    $0xff0000,%ebp
  or     %r12d,%eax
  or     %ebp,%eax
  mov    %ecx,%ebp
  mov    %eax,0x4(%r8)
  mov    %ecx,%eax
  shr    $0x6,%ebp
  shr    $0x3,%eax
  and    $0xff0000,%ebp
  and    $0xff00,%eax
  or     %ebp,%eax
  movzbl %cl,%ebp
  or     %ebp,%eax
  mov    %ebx,%ebp
  mov    %eax,0x8(%r8)
  mov    %ebx,%eax
  shr    $0x4,%ebp
  shr    %eax
  and    $0xff00,%ebp
  shr    $0x7,%ebx
  movzbl %al,%eax
  and    $0xff0000,%ebx
  or     %ebp,%eax
  or     %ebx,%eax
  mov    %eax,0xc(%r8)
  mov    0x4(%r11),%ebx
  mov    (%r11),%eax
  lea    0x400801(%rcx,%rbx,1),%ecx
  lea    0x400801(%r10,%rax,1),%r10d
  lea    0x801002(%rax,%rbx,1),%eax
  add    0x8(%r11),%ebx
  add    %esi,%eax
  lea    0x801002(%rdx,%rbx,1),%edx
  mov    %r10d,%esi
  mov    %r10d,%ebx
  shr    %esi
  shr    $0x4,%ebx
  movzbl %sil,%esi
  and    $0xff00,%ebx
  or     %ebx,%esi
  shr    $0x7,%r10d
  add    $0x8,%rdi
  add    $0x8,%r11
  and    $0xff0000,%r10d
  add    $0x10,%r8
  add    $0x10,%r9
  or     %r10d,%esi
  mov    %eax,%r10d
  mov    %esi,-0x10(%r9)
  mov    %eax,%esi
  shr    $0x5,%r10d
  shr    $0x2,%esi
  and    $0xff00,%r10d
  shr    $0x8,%eax
  movzbl %sil,%esi
  and    $0xff0000,%eax
  or     %r10d,%esi
  or     %esi,%eax
  mov    %ecx,%esi
  mov    %eax,-0xc(%r9)
  mov    %ecx,%eax
  shr    $0x4,%esi
  shr    %eax
  and    $0xff00,%esi
  shr    $0x7,%ecx
  movzbl %al,%eax
  and    $0xff0000,%ecx
  or     %esi,%eax
  or     %ecx,%eax
  mov    %edx,%ecx
  mov    %eax,-0x8(%r9)
  mov    %edx,%eax
  shr    $0x5,%ecx
  shr    $0x2,%eax
  and    $0xff00,%ecx
  shr    $0x8,%edx
  movzbl %al,%eax
  and    $0xff0000,%edx
  or     %ecx,%eax
  or     %edx,%eax
  mov    %eax,-0x4(%r9)
  cmp    %r15,%rdi
  jne    L2
  mov    -0x10(%rsp),%rdi
  mov    -0x8(%rsp),%rax
  add    %rdi,-0x18(%rsp)
  shl    $0x4,%rax
  add    %rax,%r13
  add    %rax,%r14
L1:
  mov    (%r15),%edi
  mov    0x4(%r15),%ecx
  mov    %edi,%eax
  lea    (%rdi,%rcx,1),%r8d
  lea    (%rcx,%rcx,1),%esi
  mov    %edi,%r10d
  shr    $0x3,%eax
  shr    $0x6,%r10d
  lea    0x400801(%r8),%r9d
  lea    0x400801(%rsi),%edx
  and    $0xff0000,%r10d
  and    $0xff00,%eax
  or     %r10d,%eax
  movzbl %dil,%r10d
  or     %r10d,%eax
  mov    %r9d,%r10d
  mov    %eax,0x0(%r13)
  mov    %r9d,%eax
  shr    $0x4,%r10d
  shr    %eax
  and    $0xff00,%r10d
  shr    $0x7,%r9d
  movzbl %al,%eax
  and    $0xff0000,%r9d
  or     %r10d,%eax
  or     %r9d,%eax
  mov    %ecx,%r9d
  mov    %eax,0x4(%r13)
  mov    %ecx,%eax
  shr    $0x6,%r9d
  shr    $0x3,%eax
  and    $0xff0000,%r9d
  and    $0xff00,%eax
  or     %r9d,%eax
  movzbl %cl,%r9d
  or     %r9d,%eax
  mov    %edx,%r9d
  mov    %eax,0x8(%r13)
  mov    %edx,%eax
  shr    $0x4,%r9d
  shr    %eax
  and    $0xff00,%r9d
  shr    $0x7,%edx
  movzbl %al,%eax
  and    $0xff0000,%edx
  or     %r9d,%eax
  or     %edx,%eax
  mov    -0x18(%rsp),%rdx
  pop    %rbx
  mov    %eax,0xc(%r13)
  pop    %rbp
  mov    (%rdx),%eax
  mov    0x4(%rdx),%edx
  pop    %r12
  pop    %r13
  lea    0x400801(%rdi,%rax,1),%edi
  lea    0x801002(%rax,%rdx,1),%eax
  add    %r8d,%eax
  lea    0x400801(%rcx,%rdx,1),%ecx
  mov    %edi,%r8d
  lea    0x801002(%rsi,%rdx,2),%edx
  mov    %edi,%esi
  shr    $0x4,%r8d
  shr    %esi
  and    $0xff00,%r8d
  shr    $0x7,%edi
  movzbl %sil,%esi
  or     %r8d,%esi
  and    $0xff0000,%edi
  or     %edi,%esi
  mov    %eax,%edi
  mov    %esi,(%r14)
  mov    %eax,%esi
  shr    $0x5,%edi
  shr    $0x2,%esi
  and    $0xff00,%edi
  shr    $0x8,%eax
  movzbl %sil,%esi
  and    $0xff0000,%eax
  or     %edi,%esi
  or     %esi,%eax
  mov    %ecx,%esi
  mov    %eax,0x4(%r14)
  mov    %ecx,%eax
  shr    $0x4,%esi
  shr    %eax
  and    $0xff00,%esi
  shr    $0x7,%ecx
  movzbl %al,%eax
  and    $0xff0000,%ecx
  or     %esi,%eax
  or     %ecx,%eax
  mov    %edx,%ecx
  mov    %eax,0x8(%r14)
  mov    %edx,%eax
  shr    $0x5,%ecx
  shr    $0x2,%eax
  and    $0xff00,%ecx
  shr    $0x8,%edx
  movzbl %al,%eax
  and    $0xff0000,%edx
  or     %ecx,%eax
  or     %edx,%eax
  mov    %eax,0xc(%r14)
  pop    %r14
  pop    %r15
  ret
  xchg   %ax,%ax
L9:
  mov    %rdi,%r15
  jmp    L1
```

assistant: ```c
void interpRGB32(unsigned char *src1, unsigned char *src2, unsigned char *dst1, unsigned char *dst2, int width) {
  unsigned int a, b, c, d, e, f;
  unsigned int w, x, y, z;
  width >>= 1;
  while (--width) {
    a = *(unsigned int *)(src1 + 0);
    b = *(unsigned int *)(src1 + 4);
    e = *(unsigned int *)(src1 + 8);
    w = a;
    x = a + b + 0x00400801;
    y = b;
    z = b + e + 0x00400801;
    *(unsigned int *)(dst1 + 0) = ((w & 0x000000ff) >> 0) | ((w & 0x0007f800) >> 3) | ((w & 0x3fc00000) >> 6);
    *(unsigned int *)(dst1 + 4) = ((x & 0x000001fe) >> 1) | ((x & 0x000ff000) >> 4) | ((x & 0x7f800000) >> 7);
    *(unsigned int *)(dst1 + 8) = ((y & 0x000000ff) >> 0) | ((y & 0x0007f800) >> 3) | ((y & 0x3fc00000) >> 6);
    *(unsigned int *)(dst1 + 12) = ((z & 0x000001fe) >> 1) | ((z & 0x000ff000) >> 4) | ((z & 0x7f800000) >> 7);
    c = *(unsigned int *)(src2 + 0);
    d = *(unsigned int *)(src2 + 4);
    f = *(unsigned int *)(src2 + 8);
    w = a + c + 0x00400801;
    x = a + b + c + d + (0x00400801 << 1);
    y = b + d + 0x00400801;
    z = b + e + d + f + (0x00400801 << 1);
    *(unsigned int *)(dst2 + 0) = ((w & 0x000001fe) >> 1) | ((w & 0x000ff000) >> 4) | ((w & 0x7f800000) >> 7);
    *(unsigned int *)(dst2 + 4) = ((x & 0x000003fc) >> 2) | ((x & 0x001fe000) >> 5) | ((x & 0xff000000) >> 8);
    *(unsigned int *)(dst2 + 8) = ((y & 0x000001fe) >> 1) | ((y & 0x000ff000) >> 4) | ((y & 0x7f800000) >> 7);
    *(unsigned int *)(dst2 + 12) = ((z & 0x000003fc) >> 2) | ((z & 0x001fe000) >> 5) | ((z & 0xff000000) >> 8);
    src1 += 8;
    src2 += 8;
    dst1 += 16;
    dst2 += 16;
  }
  a = *(unsigned int *)(src1 + 0);
  b = *(unsigned int *)(src1 + 4);
  e = b;
  w = a;
  x = a + b + 0x00400801;
  y = b;
  z = b + e + 0x00400801;
  *(unsigned int *)(dst1 + 0) = ((w & 0x000000ff) >> 0) | ((w & 0x0007f800) >> 3) | ((w & 0x3fc00000) >> 6);
  *(unsigned int *)(dst1 + 4) = ((x & 0x000001fe) >> 1) | ((x & 0x000ff000) >> 4) | ((x & 0x7f800000) >> 7);
  *(unsigned int *)(dst1 + 8) = ((y & 0x000000ff) >> 0) | ((y & 0x0007f800) >> 3) | ((y & 0x3fc00000) >> 6);
  *(unsigned int *)(dst1 + 12) = ((z & 0x000001fe) >> 1) | ((z & 0x000ff000) >> 4) | ((z & 0x7f800000) >> 7);
  c = *(unsigned int *)(src2 + 0);
  d = *(unsigned int *)(src2 + 4);
  f = d;
  w = a + c + 0x00400801;
  x = a + b + c + d + (0x00400801 << 1);
  y = b + d + 0x00400801;
  z = b + e + d + f + (0x00400801 << 1);
  *(unsigned int *)(dst2 + 0) = ((w & 0x000001fe) >> 1) | ((w & 0x000ff000) >> 4) | ((w & 0x7f800000) >> 7);
  *(unsigned int *)(dst2 + 4) = ((x & 0x000003fc) >> 2) | ((x & 0x001fe000) >> 5) | ((x & 0xff000000) >> 8);
  *(unsigned int *)(dst2 + 8) = ((y & 0x000001fe) >> 1) | ((y & 0x000ff000) >> 4) | ((y & 0x7f800000) >> 7);
  *(unsigned int *)(dst2 + 12) = ((z & 0x000003fc) >> 2) | ((z & 0x001fe000) >> 5) | ((z & 0xff000000) >> 8);
}
```