user: Please show me the C implementation that matches the assembly code listed below:

```asm
<yuv420raw_to_yuv420p>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  mov    %rdi,-0x38(%rbp)
  mov    %rsi,-0x40(%rbp)
  mov    %edx,-0x44(%rbp)
  mov    %ecx,-0x48(%rbp)
  mov    -0x44(%rbp),%eax
  imul   -0x48(%rbp),%eax
  mov    %eax,-0x20(%rbp)
  mov    -0x44(%rbp),%eax
  mov    %eax,%edx
  shr    $0x1f,%edx
  add    %edx,%eax
  sar    %eax
  mov    %eax,-0x1c(%rbp)
  mov    -0x38(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x20(%rbp),%edx
  mov    -0x40(%rbp),%rax
  add    %rdx,%rax
  mov    %rax,-0x8(%rbp)
  movl   $0x0,-0x24(%rbp)
  jmp    L15
L50:
  mov    -0x8(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  movl   $0x0,-0x28(%rbp)
  jmp    L74
L63:
  mov    -0x1c(%rbp),%edx
  mov    -0x10(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <make_8x8@plt>
  mov    -0x20(%rbp),%eax
  shr    $0x2,%eax
  mov    %eax,%edx
  mov    -0x10(%rbp),%rax
  lea    (%rdx,%rax,1),%rsi
  mov    -0x18(%rbp),%rax
  lea    0x40(%rax),%rcx
  mov    -0x1c(%rbp),%eax
  mov    %eax,%edx
  mov    %rcx,%rdi
  call   <make_8x8@plt>
  addq   $0x180,-0x18(%rbp)
  addq   $0x8,-0x10(%rbp)
  addl   $0x10,-0x28(%rbp)
L74:
  mov    -0x44(%rbp),%eax
  sub    $0x1,%eax
  cmp    %eax,-0x28(%rbp)
  jl     L63
  mov    -0x1c(%rbp),%eax
  shl    $0x3,%eax
  mov    %eax,%eax
  add    %rax,-0x8(%rbp)
  addl   $0x10,-0x24(%rbp)
L15:
  mov    -0x48(%rbp),%eax
  sub    $0x1,%eax
  cmp    %eax,-0x24(%rbp)
  jl     L50
  mov    -0x38(%rbp),%rax
  sub    $0xffffffffffffff80,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x40(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  movl   $0x0,-0x2c(%rbp)
  movl   $0x0,-0x24(%rbp)
  jmp    L66
L45:
  mov    -0x8(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  movl   $0x0,-0x28(%rbp)
  jmp    L61
L75:
  mov    -0x44(%rbp),%edx
  mov    -0x10(%rbp),%rcx
  mov    -0x18(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <make_8x8@plt>
  addq   $0x40,-0x18(%rbp)
  addq   $0x8,-0x10(%rbp)
  addl   $0x1,-0x2c(%rbp)
  cmpl   $0x3,-0x2c(%rbp)
  jle    L39
  movl   $0x0,-0x2c(%rbp)
  subq   $0xffffffffffffff80,-0x18(%rbp)
L39:
  addl   $0x8,-0x28(%rbp)
L61:
  mov    -0x44(%rbp),%eax
  sub    $0x1,%eax
  cmp    %eax,-0x28(%rbp)
  jl     L75
  mov    -0x44(%rbp),%eax
  shl    $0x3,%eax
  cltq
  add    %rax,-0x8(%rbp)
  addl   $0x8,-0x24(%rbp)
L66:
  mov    -0x48(%rbp),%eax
  sub    $0x1,%eax
  cmp    %eax,-0x24(%rbp)
  jl     L45
  nop
  nop
  leave
  ret
```

assistant: ```c
void yuv420raw_to_yuv420p(unsigned char *pIn0, unsigned char *pOut0, int width, int height) {
  int k, x, y;
  unsigned char *pIn, *pOut, *pOutLine;
  const unsigned int a = width * height;
  const unsigned int w = width / 2;
  pIn = pIn0;
  pOutLine = pOut0 + a;
  for (y = 0; y < height - 1; y += 16) {
    pOut = pOutLine;
    for (x = 0; x < width - 1; x += 16) {
      make_8x8(pIn, pOut, w);
      make_8x8(pIn + 64, pOut + a / 4, w);
      pIn += 384;
      pOut += 8;
    }
    pOutLine += 8 * w;
  }
  pIn = pIn0 + 128;
  pOutLine = pOut0;
  k = 0;
  for (y = 0; y < height - 1; y += 8) {
    pOut = pOutLine;
    for (x = 0; x < width - 1; x += 8) {
      make_8x8(pIn, pOut, width);
      pIn += 64;
      pOut += 8;
      if ((++k) > 3) {
        k = 0;
        pIn += 128;
      }
    }
    pOutLine += 8 * width;
  }
}
```