user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<yuv_to_rgb_16>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %edx,%eax
  mov    %rcx,-0x38(%rbp)
  mov    %r8,-0x40(%rbp)
  mov    %edi,%edx
  mov    %dl,-0x24(%rbp)
  mov    %esi,%edx
  mov    %dl,-0x28(%rbp)
  mov    %al,-0x2c(%rbp)
  movzbl -0x24(%rbp),%eax
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  movsd  D175(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  movzbl -0x28(%rbp),%eax
  pxor   %xmm2,%xmm2
  cvtsi2sd %eax,%xmm2
  movsd  D18(%rip),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm0,%xmm1
  movzbl -0x2c(%rbp),%eax
  pxor   %xmm2,%xmm2
  cvtsi2sd %eax,%xmm2
  movsd  D198(%rip),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  D159(%rip),%xmm2
  movapd %xmm0,%xmm1
  subsd  %xmm2,%xmm1
  movsd  D57(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x18(%rbp)
  movzbl -0x24(%rbp),%eax
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  movsd  D175(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movzbl -0x28(%rbp),%eax
  pxor   %xmm2,%xmm2
  cvtsi2sd %eax,%xmm2
  movsd  D89(%rip),%xmm1
  mulsd  %xmm2,%xmm1
  subsd  %xmm1,%xmm0
  movzbl -0x2c(%rbp),%eax
  pxor   %xmm2,%xmm2
  cvtsi2sd %eax,%xmm2
  movsd  D158(%rip),%xmm1
  mulsd  %xmm1,%xmm2
  movapd %xmm0,%xmm1
  subsd  %xmm2,%xmm1
  movsd  D146(%rip),%xmm0
  addsd  %xmm0,%xmm1
  movsd  D121(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movzbl -0x24(%rbp),%eax
  pxor   %xmm1,%xmm1
  cvtsi2sd %eax,%xmm1
  movsd  D175(%rip),%xmm0
  mulsd  %xmm0,%xmm1
  movzbl -0x28(%rbp),%eax
  pxor   %xmm2,%xmm2
  cvtsi2sd %eax,%xmm2
  movsd  D195(%rip),%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  movsd  D164(%rip),%xmm2
  movapd %xmm0,%xmm1
  subsd  %xmm2,%xmm1
  movsd  D57(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x8(%rbp)
  pxor   %xmm0,%xmm0
  comisd -0x18(%rbp),%xmm0
  jbe    L54
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x18(%rbp)
L54:
  pxor   %xmm0,%xmm0
  comisd -0x10(%rbp),%xmm0
  jbe    L3
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x10(%rbp)
L3:
  pxor   %xmm0,%xmm0
  comisd -0x8(%rbp),%xmm0
  jbe    L43
  pxor   %xmm0,%xmm0
  movsd  %xmm0,-0x8(%rbp)
L43:
  movsd  -0x18(%rbp),%xmm0
  comisd D57(%rip),%xmm0
  jbe    L10
  movsd  D57(%rip),%xmm0
  movsd  %xmm0,-0x18(%rbp)
L10:
  movsd  -0x10(%rbp),%xmm0
  comisd D121(%rip),%xmm0
  jbe    L29
  movsd  D121(%rip),%xmm0
  movsd  %xmm0,-0x10(%rbp)
L29:
  movsd  -0x8(%rbp),%xmm0
  comisd D57(%rip),%xmm0
  jbe    L18
  movsd  D57(%rip),%xmm0
  movsd  %xmm0,-0x8(%rbp)
L18:
  cvttsd2si -0x18(%rbp),%eax
  lea    0x0(,%rax,8),%edx
  cvttsd2si -0x10(%rbp),%eax
  shr    $0x3,%al
  add    %eax,%edx
  mov    -0x38(%rbp),%rax
  mov    %dl,(%rax)
  cvttsd2si -0x10(%rbp),%eax
  movzbl %al,%eax
  shl    $0x5,%eax
  and    $0xffffffe0,%eax
  mov    %eax,%edx
  cvttsd2si -0x8(%rbp),%eax
  add    %eax,%edx
  mov    -0x40(%rbp),%rax
  mov    %dl,(%rax)
  nop
  pop    %rbp
  ret
```

tool_calls: name: unpack_data
arguments: data_tag: D175
type_infered: f64
name: unpack_data
arguments: data_tag: D18
type_infered: f64
name: unpack_data
arguments: data_tag: D198
type_infered: f64
name: unpack_data
arguments: data_tag: D159
type_infered: f64
name: unpack_data
arguments: data_tag: D57
type_infered: byte[16]
name: unpack_data
arguments: data_tag: D89
type_infered: f64
name: unpack_data
arguments: data_tag: D158
type_infered: f64
name: unpack_data
arguments: data_tag: D146
type_infered: f64
name: unpack_data
arguments: data_tag: D121
type_infered: byte[16]
name: unpack_data
arguments: data_tag: D195
type_infered: f64
name: unpack_data
arguments: data_tag: D164
type_infered: f64

tool: D175: 0.004565

tool: D18: 1e-06

tool: D198: 0.00625

tool: D159: 0.872

tool: {"D57": [0x00,0x00,0x00,0x00,0x00,0x00,0x3f,0x40,0x38,0xf5,0x81,0xe4,0x9d,0x43,0x59,0x3f]}

tool: D89: 0.001542

tool: D158: 0.003183

tool: D146: 0.531

tool: {"D121": [0x00,0x00,0x00,0x00,0x00,0x80,0x4f,0x40,0x71,0x38,0xf3,0xab,0x39,0x40,0x80,0x3f]}

tool: D195: 0.007935

tool: D164: 1.088

assistant: ```c
void yuv_to_rgb_16(unsigned char y, unsigned char u, unsigned char v, unsigned char *rg, unsigned char *gb) {
  double R, G, B;
  R = 31 * (0.004565 * y + 0.000001 * u + 0.006250 * v - 0.872);
  G = 63 * (0.004565 * y - 0.001542 * u - 0.003183 * v + 0.531);
  B = 31 * (0.004565 * y + 0.007935 * u - 1.088);
  if (R < 0)
    R = 0;
  if (G < 0)
    G = 0;
  if (B < 0)
    B = 0;
  if (R > 31)
    R = 31;
  if (G > 63)
    G = 63;
  if (B > 31)
    B = 31;
  *rg = (((unsigned char)(R)) << 3) + (((unsigned char)(G) >> 3));
  *gb = (((unsigned char)(G)&0x1f) << 5) + (unsigned char)(B);
}
```