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

```asm
<compress_row>:
  endbr64
  push   %r15
  xor    %eax,%eax
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdx,-0x8(%rsp)
  cmp    %rsi,%rdi
  jae    L152
  mov    %rdi,%r8
  lea    -0x4(%rsi),%r15
  mov    %rsi,%r14
  mov    %rdx,%rcx
  lea    -0x3(%rsi),%rbp
  mov    $0x1,%r13d
  mov    $0x1,%r12d
  cmp    %r8,%r15
  jb     L157
  nopl   0x0(%rax)
L175:
  movzbl (%r8),%eax
  mov    %r8,%rsi
  jmp    L38
  nopl   0x0(%rax)
L96:
  add    $0x1,%rsi
  cmp    %rbp,%rsi
  je     L157
L38:
  mov    %eax,%r9d
  movzbl 0x1(%rsi),%eax
  cmp    %r9b,%al
  jne    L96
  cmp    %r9b,0x2(%rsi)
  jne    L96
  cmp    %r9b,0x3(%rsi)
  jne    L96
  cmp    %rsi,%r15
  jb     L157
  lea    0x4(%rsi),%r11
  cmp    %r11,%r14
  ja     L171
  jmp    L213
  nopl   0x0(%rax)
L47:
  add    $0x1,%r11
  cmp    %r11,%r14
  je     L213
L171:
  cmp    %r9b,(%r11)
  je     L47
L213:
  cmp    %rsi,%r8
  jae    L165
  nop
L6:
  mov    %rsi,%r10
  mov    $0x7f,%edi
  lea    0x1(%rcx),%rbx
  sub    %r8,%r10
  cmp    %edi,%r10d
  cmovle %r10d,%edi
  lea    -0x1(%rdi),%eax
  mov    %al,(%rcx)
  test   %r10d,%r10d
  jle    L219
  xor    %eax,%eax
  cs nopw 0x0(%rax,%rax,1)
L111:
  movzbl (%r8,%rax,1),%edx
  mov    %dl,0x1(%rcx,%rax,1)
  add    $0x1,%rax
  mov    %edi,%edx
  sub    %eax,%edx
  test   %edx,%edx
  jg     L111
  lea    -0x1(%rdi),%eax
  add    $0x1,%rax
  test   %r10d,%r10d
  cmovle %r13,%rax
  lea    (%rbx,%rax,1),%rcx
  add    %rax,%r8
L149:
  cmp    %r8,%rsi
  ja     L6
  jmp    L165
  nopl   0x0(%rax)
L73:
  mov    %r11,%rax
  mov    $0x7f,%edx
  sub    %rsi,%rax
  cmp    %edx,%eax
  cmovg  %edx,%eax
  mov    %r12d,%edx
  add    $0x2,%rcx
  sub    %eax,%edx
  cltq
  mov    %dl,-0x2(%rcx)
  add    %rax,%rsi
  mov    %r9b,-0x1(%rcx)
L165:
  cmp    %r11,%rsi
  jb     L73
  cmp    %rsi,%r14
  jbe    L49
  mov    %rsi,%r8
  cmp    %r8,%r15
  jae    L175
  nopl   0x0(%rax,%rax,1)
L157:
  cmp    %r8,%r14
  jbe    L49
  mov    %r14,%r11
  mov    %r14,%rsi
  jmp    L6
  nopl   0x0(%rax,%rax,1)
L219:
  mov    %rbx,%rcx
  jmp    L149
L49:
  mov    %ecx,%eax
  sub    -0x8(%rsp),%eax
L152:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
```

assistant: ```c
int compress_row(char *row, char *end_row, char *compressed) {
  register char *i_exam = row;
  char *stop_exam = end_row - 4;
  register char *cptr = compressed;
  while (i_exam < end_row) {
    char *i_compr = i_exam;
    char *i_next;
    char byte_value;
    while (i_exam <= stop_exam && ((byte_value = *i_exam) != i_exam[1] || byte_value != i_exam[2] || byte_value != i_exam[3]))
      i_exam++;
    if (i_exam > stop_exam)
      i_next = i_exam = end_row;
    else {
      i_next = i_exam + 4;
      while (i_next < end_row && *i_next == byte_value)
        i_next++;
    }
    while (i_compr < i_exam) {
      int count = i_exam - i_compr;
      if (count > 127)
        count = 127;
      *cptr++ = count - 1;
      while (count > 0) {
        *cptr++ = *i_compr++;
        count--;
      }
    }
    while (i_exam < i_next) {
      int count = i_next - i_exam;
      if (count > 127)
        count = 127;
      *cptr++ = 1 - count;
      *cptr++ = byte_value;
      i_exam += count;
    }
  }
  return (cptr - compressed);
}
```