user: 下面的汇编指令对应的C源代码是什么：

```asm
<process_plane>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,-0x8(%rsp)
  mov    %edx,-0xc(%rsp)
  test   %edx,%edx
  jle    L52
  mov    %esi,%r13d
  mov    %edx,%ebx
  lea    0x0(,%rsi,4),%eax
  movslq %eax,%rdx
  mov    %rdx,-0x18(%rsp)
  imul   %esi,%ebx
  mov    %ebx,%eax
  shl    $0x2,%eax
  cltq
  sub    %rdx,%rax
  add    %rcx,%rax
  mov    %rax,-0x20(%rsp)
  mov    %rdi,%rax
  movq   $0x0,-0x28(%rsp)
  movl   $0x0,-0x10(%rsp)
  jmp    L145
L83:
  test   %r13d,%r13d
  jle    L49
  mov    -0x28(%rsp),%rsi
  mov    $0x0,%ecx
  mov    $0x0,%r8d
  jmp    L22
L96:
  test   %ebx,%ebx
  jle    L48
  movzbl %dil,%r9d
  mov    $0x0,%edx
L221:
  movzbl 0x1(%rax,%rdx,1),%ecx
  mov    %cl,(%rsi,%rdx,4)
  add    $0x1,%rdx
  cmp    %r9,%rdx
  jne    L221
  movzbl %dil,%edi
  lea    (%r11,%rdi,1),%rax
  lea    (%rsi,%rdi,4),%rsi
  lea    (%rbx,%r8,1),%r8d
  movzbl %cl,%ecx
  mov    %r10d,%r9d
L38:
  test   %r9d,%r9d
  jle    L80
  mov    %r9d,%edx
  lea    (%rsi,%rdx,4),%rdi
  mov    %rsi,%rdx
L57:
  mov    %cl,(%rdx)
  add    $0x4,%rdx
  cmp    %rdx,%rdi
  jne    L57
  mov    %r9d,%edx
  lea    (%rsi,%rdx,4),%rsi
  lea    (%r9,%r8,1),%r8d
L80:
  cmp    %r8d,%r13d
  jle    L49
L22:
  lea    0x1(%rax),%r11
  movzbl (%rax),%edi
  mov    %edi,%r10d
  and    $0xf,%r10d
  shr    $0x4,%dil
  movzbl %dil,%ebx
  mov    %r10d,%r9d
  shl    $0x4,%r9d
  or     %ebx,%r9d
  lea    -0x10(%r9),%edx
  cmp    $0x1f,%edx
  ja     L96
  mov    %r11,%rax
  jmp    L38
L48:
  mov    %r10d,%r9d
  mov    %r11,%rax
  jmp    L38
L198:
  test   %r11d,%r11d
  jle    L137
  movzbl %dil,%r10d
  movslq %ebx,%rdx
  lea    (%r15,%rdx,4),%r9
  mov    $0x0,%ecx
L18:
  movzbl 0x1(%rax,%rcx,1),%edx
  movzbl %dl,%esi
  mov    %esi,%r14d
  sar    %r14d
  not    %r14d
  sar    %esi
  test   $0x1,%dl
  mov    %r14d,%edx
  cmove  %esi,%edx
  movzbl (%r9,%rcx,4),%esi
  add    %edx,%esi
  mov    %sil,(%r8,%rcx,4)
  add    $0x1,%rcx
  cmp    %r10,%rcx
  jne    L18
  movzbl %dil,%edi
  lea    (%r12,%rdi,1),%rax
  lea    (%r8,%rdi,4),%r8
  lea    (%r11,%rbx,1),%ebx
  mov    %ebp,%r9d
L41:
  test   %r9d,%r9d
  jle    L119
  mov    %r9d,%r10d
  movslq %ebx,%rcx
  lea    (%r15,%rcx,4),%rdi
  mov    $0x0,%ecx
L143:
  movzbl (%rdi,%rcx,4),%esi
  add    %edx,%esi
  mov    %sil,(%r8,%rcx,4)
  add    $0x1,%rcx
  cmp    %r10,%rcx
  jne    L143
  mov    %r9d,%ecx
  lea    (%r8,%rcx,4),%r8
  lea    (%r9,%rbx,1),%ebx
L119:
  cmp    %ebx,%r13d
  jle    L49
L19:
  lea    0x1(%rax),%r12
  movzbl (%rax),%edi
  mov    %edi,%ebp
  and    $0xf,%ebp
  shr    $0x4,%dil
  movzbl %dil,%r11d
  mov    %ebp,%r9d
  shl    $0x4,%r9d
  or     %r11d,%r9d
  lea    -0x10(%r9),%ecx
  cmp    $0x1f,%ecx
  ja     L198
  mov    %r12,%rax
  jmp    L41
L137:
  mov    %ebp,%r9d
  mov    %r12,%rax
  jmp    L41
L49:
  mov    -0x18(%rsp),%rdi
  sub    %rdi,-0x20(%rsp)
  mov    -0xc(%rsp),%edi
  cmp    %edi,-0x10(%rsp)
  je     L107
L145:
  addl   $0x1,-0x10(%rsp)
  mov    -0x28(%rsp),%r15
  mov    -0x20(%rsp),%rbx
  mov    %rbx,-0x28(%rsp)
  test   %r15,%r15
  je     L83
  mov    %rbx,%r8
  mov    $0x0,%edx
  mov    $0x0,%ebx
  test   %r13d,%r13d
  jg     L19
  jmp    L49
L52:
  mov    -0x8(%rsp),%rax
L107:
  sub    -0x8(%rsp),%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
int process_plane(unsigned char *in, int width, int height, unsigned char *out, int size) {
  int indexw;
  int indexh;
  int code;
  int collen;
  int replen;
  int color;
  int x;
  int revcode;
  unsigned char *last_line;
  unsigned char *this_line;
  unsigned char *org_in;
  unsigned char *org_out;
  org_in = in;
  org_out = out;
  last_line = 0;
  indexh = 0;
  while (indexh < height) {
    out = (org_out + width * height * 4) - ((indexh + 1) * width * 4);
    color = 0;
    this_line = out;
    indexw = 0;
    if (last_line == 0) {
      while (indexw < width) {
        code = (*(in++));
        replen = code & 0xf;
        collen = (code >> 4) & 0xf;
        revcode = (replen << 4) | collen;
        if ((revcode <= 47) && (revcode >= 16)) {
          replen = revcode;
          collen = 0;
        }
        while (collen > 0) {
          color = (*(in++));
          *out = color;
          out += 4;
          indexw++;
          collen--;
        }
        while (replen > 0) {
          *out = color;
          out += 4;
          indexw++;
          replen--;
        }
      }
    } else {
      while (indexw < width) {
        code = (*(in++));
        replen = code & 0xf;
        collen = (code >> 4) & 0xf;
        revcode = (replen << 4) | collen;
        if ((revcode <= 47) && (revcode >= 16)) {
          replen = revcode;
          collen = 0;
        }
        while (collen > 0) {
          x = (*(in++));
          if (x & 1) {
            x = x >> 1;
            x = x + 1;
            color = -x;
          } else {
            x = x >> 1;
            color = x;
          }
          x = last_line[indexw * 4] + color;
          *out = x;
          out += 4;
          indexw++;
          collen--;
        }
        while (replen > 0) {
          x = last_line[indexw * 4] + color;
          *out = x;
          out += 4;
          indexw++;
          replen--;
        }
      }
    }
    indexh++;
    last_line = this_line;
  }
  return (int)(in - org_in);
}
```