user: What would the C source look like for the assembly code provided here:

```asm
<imReduceHalfBox4Plant>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %edx,-0x24(%rbp)
  mov    %ecx,-0x28(%rbp)
  mov    %r8,-0x30(%rbp)
  mov    -0x20(%rbp),%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x24(%rbp),%eax
  movslq %eax,%rcx
  mov    -0x20(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  lea    (%rdx,%rax,1),%ecx
  mov    -0x28(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %eax,%ecx
  mov    -0x24(%rbp),%edx
  mov    -0x28(%rbp),%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %ecx,%eax
  add    $0x2,%eax
  sar    $0x2,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  mov    %dl,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x1,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x1(%rax),%rcx
  mov    -0x20(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %eax,%edx
  mov    -0x28(%rbp),%eax
  cltq
  lea    0x1(%rax),%rcx
  mov    -0x20(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  lea    (%rdx,%rax,1),%ecx
  mov    -0x24(%rbp),%edx
  mov    -0x28(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %ecx,%eax
  add    $0x2,%eax
  sar    $0x2,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x1,%rax
  mov    %dl,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x2(%rax),%rcx
  mov    -0x20(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %eax,%edx
  mov    -0x28(%rbp),%eax
  cltq
  lea    0x2(%rax),%rcx
  mov    -0x20(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  lea    (%rdx,%rax,1),%ecx
  mov    -0x24(%rbp),%edx
  mov    -0x28(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x2(%rax),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %ecx,%eax
  add    $0x2,%eax
  sar    $0x2,%eax
  mov    %eax,%edx
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  mov    %dl,(%rax)
  mov    -0x20(%rbp),%rax
  add    $0x3,%rax
  movzbl (%rax),%eax
  movzbl %al,%edx
  mov    -0x24(%rbp),%eax
  cltq
  lea    0x3(%rax),%rcx
  mov    -0x20(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %eax,%edx
  mov    -0x28(%rbp),%eax
  cltq
  lea    0x3(%rax),%rcx
  mov    -0x20(%rbp),%rax
  add    %rcx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  lea    (%rdx,%rax,1),%ecx
  mov    -0x24(%rbp),%edx
  mov    -0x28(%rbp),%eax
  add    %edx,%eax
  cltq
  lea    0x3(%rax),%rdx
  mov    -0x20(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  movzbl %al,%eax
  add    %ecx,%eax
  mov    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  sar    $0x2,%eax
  add    %eax,-0x4(%rbp)
  mov    -0x4(%rbp),%eax
  add    $0x2,%eax
  sar    $0x2,%eax
  mov    %eax,-0x4(%rbp)
  cmpl   $0xff,-0x4(%rbp)
  jle    L3
  movl   $0xff,-0x4(%rbp)
L3:
  mov    -0x18(%rbp),%rax
  add    $0x3,%rax
  mov    -0x4(%rbp),%edx
  mov    %dl,(%rax)
  nop
  pop    %rbp
  ret
```

assistant: ```c
__attribute__((always_)) void imReduceHalfBox4Plant(unsigned char *dst, unsigned char *src, int bytesperpixel, int bytesperline, float *dithersum) {
  int alpha;
  dst[0] = (unsigned char)(((int)src[0] + (int)src[bytesperpixel + 0] + (int)src[bytesperline + 0] + (int)src[bytesperpixel + bytesperline + 0] + 2) >> 2);
  dst[1] = (unsigned char)(((int)src[1] + (int)src[bytesperpixel + 1] + (int)src[bytesperline + 1] + (int)src[bytesperpixel + bytesperline + 1] + 2) >> 2);
  dst[2] = (unsigned char)(((int)src[2] + (int)src[bytesperpixel + 2] + (int)src[bytesperline + 2] + (int)src[bytesperpixel + bytesperline + 2] + 2) >> 2);
  alpha = ((int)src[3] + (int)src[bytesperpixel + 3] + (int)src[bytesperline + 3] + (int)src[bytesperpixel + bytesperline + 3]);
  alpha += alpha >> 2;
  alpha = (alpha + 2) >> 2;
  if (alpha > 255)
    alpha = 255;
  dst[3] = (unsigned char)alpha;
  return;
}
```