user: Converte this assembly snippet into its equivalent C code:

```asm
<yuv2rgb>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x38,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %edx,-0x34(%rbp)
  mov    %ecx,-0x38(%rbp)
  movl   $0x0,-0x14(%rbp)
  jmp    L17
L11:
  mov    -0x14(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  pxor   %xmm1,%xmm1
  cvtsi2ss %eax,%xmm1
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x2(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    $0xffffff80,%eax
  pxor   %xmm2,%xmm2
  cvtsi2ss %eax,%xmm2
  movss  D30(%rip),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  cvttss2si %xmm0,%eax
  movzbl %al,%eax
  mov    -0x14(%rbp),%edx
  movslq %edx,%rdx
  lea    0x2(%rdx),%rcx
  mov    -0x30(%rbp),%rdx
  lea    (%rcx,%rdx,1),%rbx
  mov    %eax,%edi
  call   <saturateValue@plt>
  mov    %al,(%rbx)
  mov    -0x14(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    $0xffffff80,%eax
  pxor   %xmm2,%xmm2
  cvtsi2ss %eax,%xmm2
  movss  D14(%rip),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x2(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    $0xffffff80,%eax
  pxor   %xmm2,%xmm2
  cvtsi2ss %eax,%xmm2
  movss  D22(%rip),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  cvttss2si %xmm0,%eax
  movzbl %al,%eax
  mov    -0x14(%rbp),%edx
  movslq %edx,%rdx
  lea    0x1(%rdx),%rcx
  mov    -0x30(%rbp),%rdx
  lea    (%rcx,%rdx,1),%rbx
  mov    %eax,%edi
  call   <saturateValue@plt>
  mov    %al,(%rbx)
  mov    -0x14(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  pxor   %xmm1,%xmm1
  cvtsi2ss %eax,%xmm1
  mov    -0x14(%rbp),%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x28(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    $0xffffff80,%eax
  pxor   %xmm2,%xmm2
  cvtsi2ss %eax,%xmm2
  movss  D11(%rip),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  cvttss2si %xmm0,%eax
  movzbl %al,%eax
  mov    -0x14(%rbp),%edx
  movslq %edx,%rcx
  mov    -0x30(%rbp),%rdx
  lea    (%rcx,%rdx,1),%rbx
  mov    %eax,%edi
  call   <saturateValue@plt>
  mov    %al,(%rbx)
  addl   $0x3,-0x14(%rbp)
L17:
  mov    -0x34(%rbp),%eax
  imul   -0x38(%rbp),%eax
  mov    %eax,%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  cmp    %eax,-0x14(%rbp)
  jl     L11
  nop
  nop
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_label: D30
type_guessed: byte[4]
name: disassemble_data
arguments: data_label: D14
type_guessed: byte[4]
name: disassemble_data
arguments: data_label: D22
type_guessed: byte[4]
name: disassemble_data
arguments: data_label: D11
type_guessed: byte[4]

tool: {"D30": [0xbc,0x74,0xb3,0x3f]}

tool: {"D14": [0x1e,0x33,0xb0,0x3e]}

tool: {"D22": [0xe1,0xd1,0x36,0x3f]}

tool: {"D11": [0xe5,0xd0,0xe2,0x3f]}

assistant: ```c
void yuv2rgb(unsigned char yuvimg[], unsigned char rgbbuffer[], int W, int H) {
  for (int i = 0; i < (W * H * 3); i += 3) {
    rgbbuffer[i + 2] = saturateValue(yuvimg[i] + 1.402f * (yuvimg[i + 2] - 128));
    rgbbuffer[i + 1] = saturateValue(yuvimg[i] - 0.34414f * (yuvimg[i + 1] - 128) - 0.71414f * (yuvimg[i + 2] - 128));
    rgbbuffer[i] = saturateValue(yuvimg[i] + 1.772f * (yuvimg[i + 1] - 128));
  }
}
```