user: What is the c source code of the assembly code below?

```asm
<VIM_JPEG_Toolyuv422_Rgb565>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %ecx,%eax
  mov    %dx,-0x34(%rbp)
  mov    %ax,-0x38(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movw   $0x4,-0x1e(%rbp)
  movzwl -0x34(%rbp),%eax
  add    %eax,%eax
  mov    %eax,%edx
  movzwl -0x38(%rbp),%eax
  imul   %edx,%eax
  mov    %ax,-0x38(%rbp)
  movw   $0x0,-0x34(%rbp)
  movw   $0x0,-0x20(%rbp)
  jmp    L4
L16:
  movzwl -0x20(%rbp),%eax
  lea    0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %ax,-0x14(%rbp)
  movzwl -0x20(%rbp),%edx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %ax,-0x12(%rbp)
  movzwl -0x20(%rbp),%eax
  lea    0x2(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %ax,-0x10(%rbp)
  movzwl -0x20(%rbp),%eax
  lea    0x3(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  mov    %ax,-0xe(%rbp)
  movzwl -0x12(%rbp),%eax
  mov    %ax,-0xc(%rbp)
  movzwl -0x10(%rbp),%eax
  mov    %ax,-0xa(%rbp)
  lea    -0x1a(%rbp),%rdx
  lea    -0x14(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <VIM_JPEG_ToolYuv2Rgb@plt>
  movzwl -0x16(%rbp),%eax
  shr    $0x3,%ax
  movzwl %ax,%eax
  shl    $0xb,%eax
  mov    %eax,%edx
  movzwl -0x18(%rbp),%eax
  shr    $0x2,%ax
  movzwl %ax,%eax
  shl    $0x5,%eax
  and    $0x7e0,%ax
  or     %eax,%edx
  movzwl -0x1a(%rbp),%eax
  shr    $0x3,%ax
  and    $0x1f,%eax
  or     %edx,%eax
  mov    %ax,-0x1c(%rbp)
  mov    -0x30(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x30(%rbp)
  movzwl -0x1c(%rbp),%edx
  mov    %dl,(%rax)
  movzwl -0x1c(%rbp),%eax
  shr    $0x8,%ax
  mov    %eax,%ecx
  mov    -0x30(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x30(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
  lea    -0x14(%rbp),%rax
  add    $0x6,%rax
  lea    -0x1a(%rbp),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <VIM_JPEG_ToolYuv2Rgb@plt>
  movzwl -0x16(%rbp),%eax
  shr    $0x3,%ax
  movzwl %ax,%eax
  shl    $0xb,%eax
  mov    %eax,%edx
  movzwl -0x18(%rbp),%eax
  shr    $0x2,%ax
  movzwl %ax,%eax
  shl    $0x5,%eax
  and    $0x7e0,%ax
  or     %eax,%edx
  movzwl -0x1a(%rbp),%eax
  shr    $0x3,%ax
  and    $0x1f,%eax
  or     %edx,%eax
  mov    %ax,-0x1c(%rbp)
  mov    -0x30(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x30(%rbp)
  movzwl -0x1c(%rbp),%edx
  mov    %dl,(%rax)
  movzwl -0x1c(%rbp),%eax
  shr    $0x8,%ax
  mov    %eax,%ecx
  mov    -0x30(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x30(%rbp)
  mov    %ecx,%edx
  mov    %dl,(%rax)
  movzwl -0x1e(%rbp),%eax
  add    %ax,-0x20(%rbp)
L4:
  movzwl -0x20(%rbp),%eax
  cmp    -0x38(%rbp),%ax
  jb     L16
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L24
  call   <__stack_chk_fail@plt>
L24:
  leave
  ret
```

assistant: ```c
void VIM_JPEG_Toolyuv422_Rgb565(unsigned char *src, unsigned char *dest, unsigned short width, unsigned short height) {
  unsigned short i, size;
  unsigned short temp;
  unsigned short yuv[6], bgr[3];
  size = 4;
  height *= width << 1;
  width = 0;
  for (i = 0; i < height; i += size) {
    yuv[0] = *(src + i + 1);
    yuv[1] = *(src + i + 0);
    yuv[2] = *(src + i + 2);
    yuv[3] = *(src + i + 3);
    yuv[4] = yuv[1];
    yuv[5] = yuv[2];
    VIM_JPEG_ToolYuv2Rgb(yuv, bgr);
    temp = (((bgr[2] >> 3) & 0x1f) << 11) | (((bgr[1] >> 2) & 0x3f) << 5) | ((bgr[0] >> 3) & 0x1f);
    *dest++ = (char)temp;
    *dest++ = (char)(temp >> 8);
    VIM_JPEG_ToolYuv2Rgb(yuv + 3, bgr);
    temp = (((bgr[2] >> 3) & 0x1f) << 11) | (((bgr[1] >> 2) & 0x3f) << 5) | ((bgr[0] >> 3) & 0x1f);
    *dest++ = (char)temp;
    *dest++ = (char)(temp >> 8);
  }
}
```