user: What is the c source code of the assembly code below:

```asm
<checkRow>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %esi,%eax
  mov    %al,-0x1c(%rbp)
  movb   $0x0,-0x5(%rbp)
  movl   $0x0,-0x4(%rbp)
  jmp    L130
L63:
  mov    -0x4(%rbp),%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    %al,-0x1c(%rbp)
  jne    L99
  mov    -0x4(%rbp),%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  cltq
  lea    0x1(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    %al,-0x1c(%rbp)
  jne    L99
  mov    -0x4(%rbp),%edx
  mov    %edx,%eax
  add    %eax,%eax
  add    %edx,%eax
  cltq
  lea    0x2(%rax),%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    %al,-0x1c(%rbp)
  jne    L99
  movzbl -0x5(%rbp),%eax
  add    $0x1,%eax
  mov    %al,-0x5(%rbp)
L99:
  addl   $0x1,-0x4(%rbp)
L130:
  cmpl   $0x2,-0x4(%rbp)
  jg     L101
  cmpb   $0x0,-0x5(%rbp)
  je     L63
L101:
  movl   $0x0,-0x4(%rbp)
  jmp    L167
L131:
  mov    -0x4(%rbp),%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    %al,-0x1c(%rbp)
  jne    L71
  mov    -0x4(%rbp),%eax
  add    $0x3,%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    %al,-0x1c(%rbp)
  jne    L71
  mov    -0x4(%rbp),%eax
  add    $0x6,%eax
  movslq %eax,%rdx
  mov    -0x18(%rbp),%rax
  add    %rdx,%rax
  movzbl (%rax),%eax
  cmp    %al,-0x1c(%rbp)
  jne    L71
  movzbl -0x5(%rbp),%eax
  add    $0x1,%eax
  mov    %al,-0x5(%rbp)
L71:
  addl   $0x1,-0x4(%rbp)
L167:
  cmpl   $0x2,-0x4(%rbp)
  jg     L137
  cmpb   $0x0,-0x5(%rbp)
  je     L131
L137:
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%eax
  cmp    %al,-0x1c(%rbp)
  jne    L128
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  cmp    %al,-0x1c(%rbp)
  jne    L128
  mov    -0x18(%rbp),%rax
  add    $0x8,%rax
  movzbl (%rax),%eax
  cmp    %al,-0x1c(%rbp)
  jne    L128
  movzbl -0x5(%rbp),%eax
  add    $0x1,%eax
  mov    %al,-0x5(%rbp)
L128:
  mov    -0x18(%rbp),%rax
  add    $0x2,%rax
  movzbl (%rax),%eax
  cmp    %al,-0x1c(%rbp)
  jne    L104
  mov    -0x18(%rbp),%rax
  add    $0x4,%rax
  movzbl (%rax),%eax
  cmp    %al,-0x1c(%rbp)
  jne    L104
  mov    -0x18(%rbp),%rax
  add    $0x6,%rax
  movzbl (%rax),%eax
  cmp    %al,-0x1c(%rbp)
  jne    L104
  movzbl -0x5(%rbp),%eax
  add    $0x1,%eax
  mov    %al,-0x5(%rbp)
L104:
  movsbl -0x5(%rbp),%eax
  pop    %rbp
  ret
```

assistant: ```c
int checkRow(char *playground, char user) {
  int p;
  char won = 0;
  for (p = 0; p < 3 && won == 0; p++) {
    if ((playground[p * 3 + 0] == user) && (playground[p * 3 + 1] == user) && (playground[p * 3 + 2] == user))
      won += 1;
  }
  for (p = 0; p < 3 && won == 0; p++) {
    if ((playground[3 * 0 + p] == user) && (playground[3 * 1 + p] == user) && (playground[3 * 2 + p] == user))
      won += 1;
  }
  if ((playground[3 * 0 + 0] == user) && (playground[3 * 1 + 1] == user) && (playground[3 * 2 + 2] == user))
    won += 1;
  if ((playground[3 * 0 + 2] == user) && (playground[3 * 1 + 1] == user) && (playground[3 * 2 + 0] == user))
    won += 1;
  return won;
}
```