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

```asm
<do_row>:
  endbr64
  push   %r15
  mov    %rdx,%r10
  push   %r14
  mov    %r9d,%r14d
  push   %r13
  mov    %rdi,%r13
  push   %r12
  mov    %rcx,%r12
  push   %rbp
  mov    %rsi,%rbp
  push   %rbx
  movslq %r8d,%rbx
  lea    0x1(%rbx),%r9d
  sub    $0x8,%rsp
  mov    0x40(%rsp),%rcx
  mov    (%rcx),%eax
  test   %eax,%eax
  je     L94
  lea    0x4(%rcx),%rdx
  nopw   0x0(%rax,%rax,1)
L222:
  add    $0x1,%eax
  add    $0x4,%rdx
  sub    %eax,%r9d
  mov    -0x4(%rdx),%eax
  test   %eax,%eax
  jne    L222
L94:
  test   %ebx,%ebx
  jle    L244
  cmp    $0x1,%r14d
  jne    L290
  lea    0x1(%r12),%rdx
  mov    %r13,%rax
  mov    %rbp,%r8
  mov    %ebx,%esi
  sub    %rdx,%rax
  lea    -0x1(%rbx),%edi
  cmp    $0xe,%rax
  seta   %al
  sub    %rdx,%r8
  cmp    $0xe,%r8
  lea    0x1(%r13),%r8
  seta   %dl
  and    %edx,%eax
  mov    %rbp,%rdx
  sub    %r8,%rdx
  cmp    $0xe,%rdx
  seta   %dl
  test   %dl,%al
  je     L20
  cmp    $0x6,%edi
  jbe    L20
  cmp    $0xe,%edi
  jbe    L117
  mov    %ebx,%edx
  xor    %eax,%eax
  pxor   %xmm0,%xmm0
  shr    $0x4,%edx
  shl    $0x4,%rdx
  nopl   0x0(%rax,%rax,1)
L79:
  movdqu (%r12,%rax,1),%xmm1
  movups %xmm1,0x0(%r13,%rax,1)
  movups %xmm0,0x0(%rbp,%rax,1)
  add    $0x10,%rax
  cmp    %rax,%rdx
  jne    L79
  mov    %ebx,%eax
  and    $0xfffffff0,%eax
  mov    %eax,%edx
  cmp    %eax,%ebx
  je     L135
  mov    %ebx,%esi
  sub    %eax,%esi
  lea    -0x1(%rsi),%edi
  cmp    $0x6,%edi
  jbe    L92
L160:
  mov    (%r12,%rax,1),%rdi
  mov    %rdi,0x0(%r13,%rax,1)
  movq   $0x0,0x0(%rbp,%rax,1)
  mov    %esi,%eax
  and    $0xfffffff8,%eax
  add    %eax,%edx
  cmp    %eax,%esi
  je     L135
L92:
  movslq %edx,%rax
  movzbl (%r12,%rax,1),%esi
  mov    %sil,0x0(%r13,%rax,1)
  movb   $0x0,0x0(%rbp,%rax,1)
  lea    0x1(%rdx),%eax
  cmp    %eax,%ebx
  jle    L135
  cltq
  movzbl (%r12,%rax,1),%esi
  mov    %sil,0x0(%r13,%rax,1)
  movb   $0x0,0x0(%rbp,%rax,1)
  lea    0x2(%rdx),%eax
  cmp    %eax,%ebx
  jle    L135
  cltq
  movzbl (%r12,%rax,1),%esi
  mov    %sil,0x0(%r13,%rax,1)
  movb   $0x0,0x0(%rbp,%rax,1)
  lea    0x3(%rdx),%eax
  cmp    %eax,%ebx
  jle    L135
  cltq
  movzbl (%r12,%rax,1),%esi
  mov    %sil,0x0(%r13,%rax,1)
  movb   $0x0,0x0(%rbp,%rax,1)
  lea    0x4(%rdx),%eax
  cmp    %eax,%ebx
  jle    L135
  cltq
  movzbl (%r12,%rax,1),%esi
  mov    %sil,0x0(%r13,%rax,1)
  movb   $0x0,0x0(%rbp,%rax,1)
  lea    0x5(%rdx),%eax
  cmp    %eax,%ebx
  jle    L135
  cltq
  add    $0x6,%edx
  movzbl (%r12,%rax,1),%esi
  mov    %sil,0x0(%r13,%rax,1)
  movb   $0x0,0x0(%rbp,%rax,1)
  cmp    %edx,%ebx
  jle    L135
  movslq %edx,%rdx
  movzbl (%r12,%rdx,1),%eax
  mov    %al,0x0(%r13,%rdx,1)
  movb   $0x0,0x0(%rbp,%rdx,1)
L135:
  push   $0x0
  mov    %ebx,%r8d
  mov    %r13,%rdi
  mov    %r10,%rdx
  push   $0x0
  mov    %rbp,%rsi
  call   <do_recurse@plt>
  pop    %rdi
  xor    %eax,%eax
  pop    %r8
  xor    %r8d,%r8d
  nopw   0x0(%rax,%rax,1)
L51:
  movzbl 0x0(%rbp,%rax,1),%edx
  cmp    $0x3,%dl
  je     L93
  test   %dl,%dl
  je     L93
  cmpb   $0x0,0x0(%r13,%rax,1)
  jne    L93
  mov    %dl,(%r12,%rax,1)
  mov    $0x1,%r8d
L93:
  add    $0x1,%rax
  cmp    %rbx,%rax
  jne    L51
L12:
  add    $0x8,%rsp
  mov    %r8d,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
L290:
  movslq %r14d,%rdi
  mov    %r12,%rdx
  movslq %ebx,%r15
  xor    %eax,%eax
  nopl   0x0(%rax,%rax,1)
L204:
  movzbl (%rdx),%esi
  add    %rdi,%rdx
  mov    %sil,0x0(%r13,%rax,1)
  movb   $0x0,0x0(%rbp,%rax,1)
  add    $0x1,%rax
  cmp    %r15,%rax
  jne    L204
  push   $0x0
  mov    %ebx,%r8d
  mov    %r10,%rdx
  mov    %rbp,%rsi
  push   $0x0
  mov    %r13,%rdi
  call   <do_recurse@plt>
  pop    %rax
  xor    %ecx,%ecx
  pop    %rdx
  xor    %eax,%eax
  xor    %r8d,%r8d
  nop
L85:
  movzbl 0x0(%rbp,%rax,1),%edx
  test   %dl,%dl
  je     L120
  cmp    $0x3,%dl
  je     L120
  cmpb   $0x0,0x0(%r13,%rax,1)
  jne    L120
  movslq %ecx,%rsi
  mov    $0x1,%r8d
  mov    %dl,(%r12,%rsi,1)
L120:
  add    $0x1,%rax
  add    %r14d,%ecx
  cmp    %rax,%r15
  jne    L85
  jmp    L12
  nopl   0x0(%rax)
L20:
  mov    %ebx,%esi
  xor    %eax,%eax
  nopl   0x0(%rax)
L11:
  movzbl (%r12,%rax,1),%edx
  mov    %dl,0x0(%r13,%rax,1)
  movb   $0x0,0x0(%rbp,%rax,1)
  add    $0x1,%rax
  cmp    %rsi,%rax
  jne    L11
  jmp    L135
  nopl   (%rax)
L244:
  push   $0x0
  mov    %ebx,%r8d
  mov    %rbp,%rsi
  mov    %r10,%rdx
  push   $0x0
  mov    %r13,%rdi
  call   <do_recurse@plt>
  pop    %rcx
  xor    %r8d,%r8d
  pop    %rsi
  jmp    L12
L117:
  xor    %eax,%eax
  xor    %edx,%edx
  jmp    L160
```

assistant: ```c
int do_row(unsigned char *known, unsigned char *deduced, unsigned char *row, unsigned char *start, int len, int step, int *data) {
  int rowlen, i, freespace, done_any;
  freespace = len + 1;
  for (rowlen = 0; data[rowlen]; rowlen++)
    freespace -= data[rowlen] + 1;
  for (i = 0; i < len; i++) {
    known[i] = start[i * step];
    deduced[i] = 0;
  }
  do_recurse(known, deduced, row, data, len, freespace, 0, 0);
  done_any = 0;
  for (i = 0; i < len; i++)
    if (deduced[i] && deduced[i] != 3 && !known[i]) {
      start[i * step] = deduced[i];
      done_any = 1;
    }
  return done_any;
}
```