user: Demonstrate the C code that generates the assembly output below:

```asm
<xdl_recmatch>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  mov    %rdi,0x8(%rsp)
  mov    %rsi,%r15
  mov    %rdx,%r13
  mov    %rcx,%r12
  mov    %r8,%rbx
  cmp    %rcx,%rsi
  je     L179
L79:
  mov    $0x0,%eax
  test   $0x1c,%bl
  je     L194
  test   $0x4,%bl
  jne    L469
  test   $0x8,%bl
  je     L112
  test   %r15,%r15
  jle    L490
  test   %r12,%r12
  jle    L382
  mov    $0x0,%r14d
  movl   $0x0,0x4(%rsp)
  mov    0x8(%rsp),%rax
  add    %r15,%rax
  mov    %rax,0x10(%rsp)
  jmp    L484
L179:
  mov    %rsi,%rdx
  mov    %r13,%rsi
  call   <memcmp@plt>
  mov    %eax,%edx
  mov    $0x1,%eax
  test   %edx,%edx
  jne    L79
  jmp    L194
L469:
  mov    $0x0,%r14d
  mov    $0x0,%ebp
  jmp    L99
L135:
  mov    0x8(%rsp),%rax
  movzbl (%rax,%r14,1),%edi
  call   <isspace@plt>
  test   %rax,%rax
  jne    L42
  jmp    L119
L270:
  cmp    0x10(%rsp),%r15
  jle    L207
  cmp    %rbx,%r12
  jle    L207
  mov    %ebp,%eax
  lea    0x1(%rbp),%ebp
  cltq
  mov    0x8(%rsp),%rcx
  movzbl 0x0(%r13,%rax,1),%eax
  cmp    %al,(%rcx,%r14,1)
  jne    L183
L42:
  add    $0x1,%r14
L99:
  mov    %r14d,0x4(%rsp)
  mov    %r14,0x10(%rsp)
  cmp    %r14,%r15
  jg     L135
L119:
  movslq %ebp,%rbx
  cmp    %rbx,%r12
  jle    L207
L241:
  mov    %ebx,%ebp
  movzbl 0x0(%r13,%rbx,1),%edi
  call   <isspace@plt>
  test   %rax,%rax
  je     L270
  lea    0x1(%rbx),%ebp
  add    $0x1,%rbx
  cmp    %rbx,%r12
  jne    L241
L207:
  movslq 0x4(%rsp),%r14
  cmp    %r15,%r14
  jge    L131
L236:
  movslq 0x4(%rsp),%rbx
L380:
  mov    0x8(%rsp),%rax
  movzbl (%rax,%rbx,1),%edi
  call   <isspace@plt>
  test   %rax,%rax
  je     L175
  add    $0x1,%rbx
  mov    %rbx,%r14
  cmp    %rbx,%r15
  jg     L380
L175:
  mov    $0x0,%eax
  cmp    %r14,%r15
  jne    L194
L131:
  movslq %ebp,%rbp
  mov    $0x1,%eax
  cmp    %r12,%rbp
  jl     L253
L194:
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L196:
  addl   $0x1,0x4(%rsp)
  lea    0x1(%r14),%ebp
  movslq %r14d,%rax
  movzbl 0x0(%r13,%rax,1),%eax
  cmp    %al,(%rbx)
  jne    L269
L470:
  movslq 0x4(%rsp),%rax
  cmp    %r15,%rax
  jge    L131
  movslq %ebp,%rax
  cmp    %r12,%rax
  jge    L268
  mov    %ebp,%r14d
L484:
  movslq 0x4(%rsp),%rax
  mov    0x8(%rsp),%rsi
  lea    (%rsi,%rax,1),%rbx
  movzbl (%rbx),%edi
  call   <isspace@plt>
  test   %rax,%rax
  je     L196
  movslq %r14d,%rax
  lea    0x0(%r13,%rax,1),%rbp
  movzbl 0x0(%rbp),%edi
  call   <isspace@plt>
  test   %rax,%rax
  je     L196
  movslq 0x4(%rsp),%rax
  cmp    %rax,%r15
  jle    L345
L75:
  movzbl (%rbx),%edi
  call   <isspace@plt>
  test   %rax,%rax
  je     L345
  addl   $0x1,0x4(%rsp)
  add    $0x1,%rbx
  cmp    0x10(%rsp),%rbx
  jne    L75
L345:
  movslq %r14d,%rax
  cmp    %rax,%r12
  jle    L296
  mov    %rbp,%rbx
  lea    0x0(%r13,%r12,1),%rax
  mov    %rax,0x18(%rsp)
  mov    %r14d,%ebp
L88:
  movzbl (%rbx),%edi
  call   <isspace@plt>
  test   %rax,%rax
  je     L470
  add    $0x1,%ebp
  add    $0x1,%rbx
  cmp    0x18(%rsp),%rbx
  jne    L88
  jmp    L470
L112:
  test   $0x10,%bl
  je     L259
  mov    $0x0,%eax
  mov    $0x0,%ebp
L246:
  cmp    %rax,%r15
  jle    L131
  cmp    %rax,%r12
  jle    L251
  add    $0x1,%ebp
  mov    0x8(%rsp),%rdx
  movzbl (%rdx,%rax,1),%edx
  add    $0x1,%rax
  cmp    -0x1(%r13,%rax,1),%dl
  je     L246
  mov    %ebp,0x4(%rsp)
  jmp    L207
L259:
  mov    $0x0,%ebp
  movl   $0x0,0x4(%rsp)
  jmp    L207
L253:
  movzbl 0x0(%r13,%rbp,1),%edi
  call   <isspace@plt>
  test   %rax,%rax
  je     L209
  add    $0x1,%rbp
  cmp    %rbp,%r12
  jne    L253
L209:
  cmp    %rbp,%r12
  sete   %al
  movzbl %al,%eax
  jmp    L194
L183:
  mov    $0x0,%eax
  jmp    L194
L269:
  mov    $0x0,%eax
  jmp    L194
L490:
  mov    $0x0,%ebp
  jmp    L131
L382:
  mov    $0x0,%ebp
  movl   $0x0,0x4(%rsp)
  jmp    L268
L251:
  mov    %ebp,0x4(%rsp)
L268:
  movslq 0x4(%rsp),%r14
  jmp    L236
L296:
  movslq 0x4(%rsp),%rax
  mov    %r14d,%ebp
  cmp    %rax,%r15
  jg     L268
  jmp    L131
```

assistant: ```c
int xdl_recmatch(const char *l1, long s1, const char *l2, long s2, long flags) {
  int i1, i2;
  if (s1 == s2 && !memcmp(l1, l2, s1))
    return 1;
  if (!(flags & ((1 << 2) | (1 << 3) | (1 << 4))))
    return 0;
  i1 = 0;
  i2 = 0;
  if (flags & (1 << 2)) {
    goto skip_ws;
    while (i1 < s1 && i2 < s2) {
      if (l1[i1++] != l2[i2++])
        return 0;
    skip_ws:
      while (i1 < s1 && (isspace((unsigned char)(l1[i1]))))
        i1++;
      while (i2 < s2 && (isspace((unsigned char)(l2[i2]))))
        i2++;
    }
  } else if (flags & (1 << 3)) {
    while (i1 < s1 && i2 < s2) {
      if ((isspace((unsigned char)(l1[i1]))) && (isspace((unsigned char)(l2[i2])))) {
        while (i1 < s1 && (isspace((unsigned char)(l1[i1]))))
          i1++;
        while (i2 < s2 && (isspace((unsigned char)(l2[i2]))))
          i2++;
        continue;
      }
      if (l1[i1++] != l2[i2++])
        return 0;
    }
  } else if (flags & (1 << 4)) {
    while (i1 < s1 && i2 < s2 && l1[i1++] == l2[i2++])
      ;
  }
  if (i1 < s1) {
    while (i1 < s1 && (isspace((unsigned char)(l1[i1]))))
      i1++;
    if (s1 != i1)
      return 0;
  }
  if (i2 < s2) {
    while (i2 < s2 && (isspace((unsigned char)(l2[i2]))))
      i2++;
    return (s2 == i2);
  }
  return 1;
}
```