user: 下面的汇编指令对应的C源代码是什么：

```asm
<rescale>:
  endbr64
  mov    %rdi,%rax
  mov    %esi,%r8d
  nopw   0x0(%rax,%rax,1)
L7:
  movswl 0x2(%rax),%esi
  movswl 0x8(%rax),%ecx
  movswl 0xa(%rax),%edi
  movswl 0x6(%rax),%r9d
  imul   $0xe000,%esi,%esi
  shl    $0xd,%ecx
  shl    $0xd,%edi
  shl    $0xd,%r9d
  add    %ecx,%esi
  movswl 0x4(%rax),%ecx
  sar    $0x10,%esi
  imul   $0xe000,%ecx,%ecx
  add    %edi,%ecx
  movswl (%rax),%edi
  mov    %si,0x2(%rdx)
  sar    $0x10,%ecx
  imul   $0xe000,%edi,%edi
  mov    %cx,0x4(%rdx)
  add    %r9d,%edi
  sar    $0x10,%edi
  mov    %di,(%rdx)
  movswl 0x8(%rax),%ecx
  movswl 0xe(%rax),%esi
  movswl 0x10(%rax),%edi
  lea    (%rcx,%rcx,2),%ecx
  movswl 0xc(%rax),%r9d
  add    %ecx,%esi
  movswl 0xa(%rax),%ecx
  shl    $0xe,%esi
  lea    (%rcx,%rcx,2),%ecx
  sar    $0x10,%esi
  add    %edi,%ecx
  movswl 0x6(%rax),%edi
  mov    %si,0x8(%rdx)
  shl    $0xe,%ecx
  lea    (%rdi,%rdi,2),%edi
  sar    $0x10,%ecx
  add    %r9d,%edi
  mov    %cx,0xa(%rdx)
  shl    $0xe,%edi
  sar    $0x10,%edi
  mov    %di,0x6(%rdx)
  movswl 0xe(%rax),%ecx
  lea    (%rcx,%rcx,4),%esi
  movswl 0x14(%rax),%ecx
  lea    (%rcx,%rcx,2),%ecx
  add    %ecx,%esi
  movswl 0x10(%rax),%ecx
  shl    $0xd,%esi
  lea    (%rcx,%rcx,4),%edi
  movswl 0x16(%rax),%ecx
  sar    $0x10,%esi
  lea    (%rcx,%rcx,2),%ecx
  add    %edi,%ecx
  movswl 0xc(%rax),%edi
  shl    $0xd,%ecx
  lea    (%rdi,%rdi,4),%r9d
  movswl 0x12(%rax),%edi
  sar    $0x10,%ecx
  mov    %si,0xe(%rdx)
  mov    %cx,0x10(%rdx)
  lea    (%rdi,%rdi,2),%edi
  add    %r9d,%edi
  shl    $0xd,%edi
  sar    $0x10,%edi
  mov    %di,0xc(%rdx)
  movswl 0x1a(%rax),%ecx
  movswl 0x14(%rax),%esi
  movswl 0x1c(%rax),%edi
  add    %ecx,%esi
  movswl 0x16(%rax),%ecx
  sar    %esi
  add    %edi,%ecx
  movswl 0x12(%rax),%edi
  movswl 0x18(%rax),%r9d
  mov    %si,0x14(%rdx)
  sar    %ecx
  add    %r9d,%edi
  mov    %cx,0x16(%rdx)
  sar    %edi
  mov    %di,0x12(%rdx)
  movswl 0x1a(%rax),%ecx
  lea    (%rcx,%rcx,2),%esi
  movswl 0x20(%rax),%ecx
  lea    (%rcx,%rcx,4),%ecx
  add    %ecx,%esi
  movswl 0x1c(%rax),%ecx
  shl    $0xd,%esi
  lea    (%rcx,%rcx,2),%edi
  movswl 0x22(%rax),%ecx
  sar    $0x10,%esi
  lea    (%rcx,%rcx,4),%ecx
  add    %edi,%ecx
  movswl 0x18(%rax),%edi
  shl    $0xd,%ecx
  lea    (%rdi,%rdi,2),%r9d
  movswl 0x1e(%rax),%edi
  sar    $0x10,%ecx
  mov    %si,0x1a(%rdx)
  mov    %cx,0x1c(%rdx)
  lea    (%rdi,%rdi,4),%edi
  add    %r9d,%edi
  shl    $0xd,%edi
  sar    $0x10,%edi
  mov    %di,0x18(%rdx)
  movswl 0x26(%rax),%ecx
  movswl 0x20(%rax),%esi
  movswl 0x22(%rax),%edi
  lea    (%rcx,%rcx,2),%ecx
  movswl 0x1e(%rax),%r9d
  add    %ecx,%esi
  movswl 0x28(%rax),%ecx
  shl    $0xe,%esi
  lea    (%rcx,%rcx,2),%ecx
  sar    $0x10,%esi
  add    %edi,%ecx
  movswl 0x24(%rax),%edi
  mov    %si,0x20(%rdx)
  shl    $0xe,%ecx
  lea    (%rdi,%rdi,2),%edi
  sar    $0x10,%ecx
  add    %r9d,%edi
  mov    %cx,0x22(%rdx)
  shl    $0xe,%edi
  sar    $0x10,%edi
  mov    %di,0x1e(%rdx)
  movswl 0x2c(%rax),%ecx
  movswl 0x26(%rax),%esi
  movswl 0x2e(%rax),%edi
  imul   $0xe000,%ecx,%ecx
  movswl 0x2a(%rax),%r9d
  shl    $0xd,%esi
  imul   $0xe000,%edi,%edi
  imul   $0xe000,%r9d,%r9d
  add    %ecx,%esi
  movswl 0x28(%rax),%ecx
  sar    $0x10,%esi
  shl    $0xd,%ecx
  add    %edi,%ecx
  movswl 0x24(%rax),%edi
  mov    %si,0x26(%rdx)
  sar    $0x10,%ecx
  shl    $0xd,%edi
  add    %r9d,%edi
  add    $0x2a,%rdx
  sub    $0x7,%r8d
  add    $0x30,%rax
  sar    $0x10,%edi
  mov    %di,-0x6(%rdx)
  mov    %cx,-0x2(%rdx)
  test   %r8d,%r8d
  jg     L7
  ret
```

assistant: ```c
void rescale(short const *in, int count, short *out) {
  do {
    int const accuracy = 16;
    int const unit = 1 << accuracy;
    int const step = unit / 8;
    int left = unit - step;
    int right = step;
    int n = 7;
    while (n--) {
      int r = (in[0] * left + in[3] * right) >> accuracy;
      int g = (in[1] * left + in[4] * right) >> accuracy;
      int b = (in[2] * left + in[5] * right) >> accuracy;
      *out++ = r;
      *out++ = g;
      *out++ = b;
      left -= step;
      right += step;
      in += 3;
    }
    in += 3;
  } while ((count -= 7) > 0);
}
```