user: 请将这段汇编代码片段转换成等效的C代码：

```asm
<horizontal_line_4_5_scale_c64>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x68,%rsp
  mov    %rdi,-0x58(%rbp)
  mov    %esi,-0x5c(%rbp)
  mov    %rdx,-0x68(%rbp)
  mov    %ecx,-0x60(%rbp)
  mov    -0x68(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x58(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  movl   $0x3300cd00,-0x44(%rbp)
  movl   $0xcd003300,-0x40(%rbp)
  movl   $0x66009a00,-0x3c(%rbp)
  movl   $0x9a006600,-0x38(%rbp)
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <_mem4@plt>
  mov    %eax,-0x48(%rbp)
  movl   $0x0,-0x4c(%rbp)
  jmp    L17
L19:
  mov    -0x18(%rbp),%rax
  lea    0x4(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  mov    %rax,%rdi
  call   <_mem4@plt>
  mov    %eax,-0x28(%rbp)
  mov    -0x48(%rbp),%eax
  mov    %eax,%edi
  call   <_unpklu4@plt>
  mov    %eax,-0x34(%rbp)
  mov    -0x48(%rbp),%eax
  mov    $0x8,%esi
  mov    %eax,%edi
  call   <_rotl@plt>
  mov    %eax,%edi
  call   <_unpkhu4@plt>
  mov    %eax,-0x30(%rbp)
  mov    -0x48(%rbp),%eax
  mov    %eax,%edi
  call   <_unpkhu4@plt>
  mov    %eax,-0x2c(%rbp)
  mov    -0x48(%rbp),%edx
  mov    -0x28(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_shrmb@plt>
  mov    %eax,%edi
  call   <_unpkhu4@plt>
  mov    %eax,-0x24(%rbp)
  mov    -0x48(%rbp),%eax
  mov    %eax,%edx
  mov    -0x20(%rbp),%rax
  mov    %dl,(%rax)
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rbx
  mov    -0x40(%rbp),%edx
  mov    -0x34(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_dotprsu2@plt>
  mov    %al,(%rbx)
  mov    -0x20(%rbp),%rax
  lea    0x2(%rax),%rbx
  mov    -0x38(%rbp),%edx
  mov    -0x30(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_dotprsu2@plt>
  mov    %al,(%rbx)
  mov    -0x20(%rbp),%rax
  lea    0x3(%rax),%rbx
  mov    -0x3c(%rbp),%edx
  mov    -0x2c(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_dotprsu2@plt>
  mov    %al,(%rbx)
  mov    -0x20(%rbp),%rax
  lea    0x4(%rax),%rbx
  mov    -0x44(%rbp),%edx
  mov    -0x24(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_dotprsu2@plt>
  mov    %al,(%rbx)
  addq   $0x5,-0x20(%rbp)
  mov    -0x28(%rbp),%eax
  mov    %eax,-0x48(%rbp)
  addl   $0x4,-0x4c(%rbp)
L17:
  mov    -0x5c(%rbp),%eax
  sub    $0x4,%eax
  cmp    %eax,-0x4c(%rbp)
  jb     L19
  mov    -0x48(%rbp),%eax
  mov    %eax,%edi
  call   <_unpklu4@plt>
  mov    %eax,-0x34(%rbp)
  mov    -0x48(%rbp),%eax
  mov    $0x8,%esi
  mov    %eax,%edi
  call   <_rotl@plt>
  mov    %eax,%edi
  call   <_unpkhu4@plt>
  mov    %eax,-0x30(%rbp)
  mov    -0x48(%rbp),%eax
  mov    %eax,%edi
  call   <_unpkhu4@plt>
  mov    %eax,-0x2c(%rbp)
  mov    -0x48(%rbp),%eax
  mov    %eax,%edx
  mov    -0x20(%rbp),%rax
  mov    %dl,(%rax)
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rbx
  mov    -0x40(%rbp),%edx
  mov    -0x34(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_dotprsu2@plt>
  mov    %al,(%rbx)
  mov    -0x20(%rbp),%rax
  lea    0x2(%rax),%rbx
  mov    -0x38(%rbp),%edx
  mov    -0x30(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_dotprsu2@plt>
  mov    %al,(%rbx)
  mov    -0x20(%rbp),%rax
  lea    0x3(%rax),%rbx
  mov    -0x3c(%rbp),%edx
  mov    -0x2c(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_dotprsu2@plt>
  mov    %al,(%rbx)
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  mov    -0x48(%rbp),%edx
  mov    %dl,(%rax)
  nop
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

assistant: ```c
void horizontal_line_4_5_scale_c64(const unsigned char *source, unsigned int source_width, unsigned char *dest, unsigned int dest_width) {
  unsigned i;
  unsigned int ba, cb, dc, ed;
  unsigned char *restrict des = dest;
  unsigned int *restrict src = (unsigned int *)source;
  unsigned int const_51_205, const_102_154, const_205_51, const_154_102;
  unsigned int src_current, src_next;
  (void)dest_width;
  const_51_205 = 0x3300CD00;
  const_205_51 = 0xCD003300;
  const_102_154 = 0x66009A00;
  const_154_102 = 0x9A006600;
  src_current = _mem4(src);
  for (i = 0; i < source_width - 4; i += 4) {
    src_next = _mem4(src++);
    ba = _unpklu4(src_current);
    cb = _unpkhu4(_rotl(src_current, 8));
    dc = _unpkhu4(src_current);
    ed = _unpkhu4(_shrmb(src_next, src_current));
    des[0] = src_current & 0xff;
    des[1] = _dotprsu2(ba, const_205_51);
    des[2] = _dotprsu2(cb, const_154_102);
    des[3] = _dotprsu2(dc, const_102_154);
    des[4] = _dotprsu2(ed, const_51_205);
    des += 5;
    src_current = src_next;
  }
  ba = _unpklu4(src_current);
  cb = _unpkhu4(_rotl(src_current, 8));
  dc = _unpkhu4(src_current);
  des[0] = src_current & 0xff;
  des[1] = _dotprsu2(ba, const_205_51);
  des[2] = _dotprsu2(cb, const_154_102);
  des[3] = _dotprsu2(dc, const_102_154);
  des[4] = src_current & 0xff;
}
```