user: Translate the below assembly code into C programming language:

```asm
<horizontal_line_3_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,-0x40(%rbp)
  movl   $0xcd003300,-0x3c(%rbp)
  movl   $0x66009a00,-0x38(%rbp)
  movl   $0x9a006600,-0x34(%rbp)
  movl   $0x0,-0x44(%rbp)
  jmp    L19
L5:
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <_mem4@plt>
  mov    %eax,-0x30(%rbp)
  mov    -0x30(%rbp),%eax
  mov    %eax,%edi
  call   <_unpklu4@plt>
  mov    %eax,-0x2c(%rbp)
  mov    -0x30(%rbp),%eax
  mov    $0x8,%esi
  mov    %eax,%edi
  call   <_rotl@plt>
  mov    %eax,%edi
  call   <_unpkhu4@plt>
  mov    %eax,-0x28(%rbp)
  mov    -0x30(%rbp),%eax
  mov    %eax,%edi
  call   <_unpkhu4@plt>
  mov    %eax,-0x24(%rbp)
  mov    -0x30(%rbp),%eax
  mov    %eax,%edx
  mov    -0x20(%rbp),%rax
  mov    %dl,(%rax)
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rbx
  mov    -0x34(%rbp),%edx
  mov    -0x2c(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_dotprsu2@plt>
  mov    %al,(%rbx)
  mov    -0x20(%rbp),%rax
  lea    0x2(%rax),%rbx
  mov    -0x40(%rbp),%edx
  mov    -0x28(%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    -0x28(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_dotprsu2@plt>
  mov    %al,(%rbx)
  mov    -0x20(%rbp),%rax
  lea    0x4(%rax),%rbx
  mov    -0x38(%rbp),%edx
  mov    -0x24(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_dotprsu2@plt>
  mov    %al,(%rbx)
  addq   $0x3,-0x18(%rbp)
  addq   $0x5,-0x20(%rbp)
  addl   $0x3,-0x44(%rbp)
L19:
  mov    -0x5c(%rbp),%eax
  sub    $0x3,%eax
  cmp    %eax,-0x44(%rbp)
  jb     L5
  mov    -0x18(%rbp),%rax
  mov    %rax,%rdi
  call   <_mem4@plt>
  mov    %eax,-0x30(%rbp)
  mov    -0x30(%rbp),%eax
  mov    %eax,%edi
  call   <_unpklu4@plt>
  mov    %eax,-0x2c(%rbp)
  mov    -0x30(%rbp),%eax
  mov    $0x8,%esi
  mov    %eax,%edi
  call   <_rotl@plt>
  mov    %eax,%edi
  call   <_unpkhu4@plt>
  mov    %eax,-0x28(%rbp)
  mov    -0x30(%rbp),%eax
  mov    %eax,%edi
  call   <_unpkhu4@plt>
  mov    %eax,-0x24(%rbp)
  mov    -0x30(%rbp),%eax
  mov    %eax,%edx
  mov    -0x20(%rbp),%rax
  mov    %dl,(%rax)
  mov    -0x20(%rbp),%rax
  lea    0x1(%rax),%rbx
  mov    -0x34(%rbp),%edx
  mov    -0x2c(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_dotprsu2@plt>
  mov    %al,(%rbx)
  mov    -0x20(%rbp),%rax
  lea    0x2(%rax),%rbx
  mov    -0x40(%rbp),%edx
  mov    -0x28(%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    -0x28(%rbp),%eax
  mov    %edx,%esi
  mov    %eax,%edi
  call   <_dotprsu2@plt>
  mov    %al,(%rbx)
  mov    -0x20(%rbp),%rax
  add    $0x4,%rax
  mov    -0x24(%rbp),%edx
  mov    %dl,(%rax)
  nop
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

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