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

```asm
<horizontal_line_4_5_scale_c64>:
  endbr64
  push   %r15
  mov    %esi,%r15d
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdx,%rbx
  sub    $0x28,%rsp
  mov    %rdi,0x8(%rsp)
  call   <_mem4@plt>
  sub    $0x4,%r15d
  mov    %r15d,0x1c(%rsp)
  mov    %eax,%r12d
  je     L13
  mov    0x8(%rsp),%rcx
  xor    %r15d,%r15d
  nopl   0x0(%rax)
L15:
  mov    %r12d,%ebp
  mov    %rcx,%rdi
  add    $0x4,%rcx
  add    $0x5,%rbx
  mov    %rcx,0x10(%rsp)
  add    $0x4,%r15d
  call   <_mem4@plt>
  mov    %ebp,%edi
  mov    %eax,%r12d
  call   <_unpklu4@plt>
  mov    $0x8,%esi
  mov    %ebp,%edi
  mov    %eax,0x18(%rsp)
  call   <_rotl@plt>
  mov    %eax,%edi
  call   <_unpkhu4@plt>
  mov    %ebp,%edi
  mov    %eax,0x8(%rsp)
  call   <_unpkhu4@plt>
  mov    %ebp,%esi
  mov    %r12d,%edi
  mov    %eax,%r14d
  call   <_shrmb@plt>
  mov    %eax,%edi
  call   <_unpkhu4@plt>
  mov    %bpl,-0x5(%rbx)
  mov    0x18(%rsp),%edi
  mov    $0xcd003300,%esi
  mov    %eax,%r13d
  call   <_dotprsu2@plt>
  mov    0x8(%rsp),%edi
  mov    $0x9a006600,%esi
  mov    %al,-0x4(%rbx)
  call   <_dotprsu2@plt>
  mov    $0x66009a00,%esi
  mov    %r14d,%edi
  mov    %al,-0x3(%rbx)
  call   <_dotprsu2@plt>
  mov    $0x3300cd00,%esi
  mov    %r13d,%edi
  mov    %al,-0x2(%rbx)
  call   <_dotprsu2@plt>
  mov    0x10(%rsp),%rcx
  mov    %al,-0x1(%rbx)
  cmp    0x1c(%rsp),%r15d
  jb     L15
L13:
  mov    %r12d,%edi
  call   <_unpklu4@plt>
  mov    $0x8,%esi
  mov    %r12d,%edi
  mov    %eax,%r14d
  call   <_rotl@plt>
  mov    %eax,%edi
  call   <_unpkhu4@plt>
  mov    %r12d,%edi
  mov    %eax,%r13d
  call   <_unpkhu4@plt>
  mov    %r12b,(%rbx)
  mov    %r14d,%edi
  mov    $0xcd003300,%esi
  mov    %eax,%ebp
  call   <_dotprsu2@plt>
  mov    %r13d,%edi
  mov    $0x9a006600,%esi
  mov    %al,0x1(%rbx)
  call   <_dotprsu2@plt>
  mov    %ebp,%edi
  mov    $0x66009a00,%esi
  mov    %al,0x2(%rbx)
  call   <_dotprsu2@plt>
  mov    %r12b,0x4(%rbx)
  mov    %al,0x3(%rbx)
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  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;
}
```