user: 请从给定的汇编指令推导出C源代码：

```asm
<match_pattern>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  lea    D22(%rip),%rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x68,%rsp
  mov    %rsi,(%rsp)
L511:
  movzbl (%rbx),%edx
  lea    0x1(%rbx),%r12
  lea    -0x80(%rdx),%eax
  cmp    $0x5,%al
  ja     L989
  movzbl %al,%eax
  movslq 0x0(%rbp,%rax,4),%rax
  add    %rbp,%rax
  notrack jmp *%rax
  mov    (%rsp),%rsi
  lea    0x2(%rbx),%rdi
  call   <match_pattern>
  test   %eax,%eax
  jne    L231
  movzbl 0x1(%rbx),%ebx
  add    %r12,%rbx
  jmp    L511
  xchg   %ax,%ax
  mov    %r12,0x40(%rsp)
L360:
  mov    (%rsp),%r15
  mov    0x40(%rsp),%rbx
  lea    D76(%rip),%rbp
L917:
  movzbl (%rbx),%edx
  lea    0x1(%rbx),%r12
  lea    -0x80(%rdx),%eax
  cmp    $0x5,%al
  ja     L374
  movzbl %al,%eax
  movslq 0x0(%rbp,%rax,4),%rax
  add    %rbp,%rax
  notrack jmp *%rax
  nopl   (%rax)
  lea    0x2(%rbx),%rdi
  mov    %r15,%rsi
  call   <match_pattern>
  test   %eax,%eax
  jne    L231
  movzbl 0x1(%rbx),%ebx
  add    %r12,%rbx
  jmp    L917
  nopl   (%rax)
  mov    %r15,0x10(%rsp)
  mov    %r12,0x38(%rsp)
L734:
  mov    0x10(%rsp),%r15
  mov    0x38(%rsp),%rbx
  lea    D77(%rip),%rbp
L27:
  movzbl (%rbx),%edx
  lea    0x1(%rbx),%r12
  lea    -0x80(%rdx),%eax
  cmp    $0x5,%al
  ja     L681
  movzbl %al,%eax
  movslq 0x0(%rbp,%rax,4),%rax
  add    %rbp,%rax
  notrack jmp *%rax
  nopl   0x0(%rax,%rax,1)
  cmpb   $0x0,(%r15)
  je     L231
L973:
  addq   $0x1,0x10(%rsp)
  mov    0x10(%rsp),%rax
  cmpb   $0x0,-0x1(%rax)
  jne    L734
  addq   $0x1,(%rsp)
  mov    (%rsp),%rax
  cmpb   $0x0,-0x1(%rax)
  jne    L360
  cs nopw 0x0(%rax,%rax,1)
L392:
  xor    %eax,%eax
L661:
  add    $0x68,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
  lea    0x2(%rbx),%rdi
  mov    %r15,%rsi
  call   <match_pattern>
  test   %eax,%eax
  jne    L231
  movzbl 0x1(%rbx),%ebx
  add    %r12,%rbx
  jmp    L27
  nopl   0x0(%rax,%rax,1)
  mov    %r15,0x8(%rsp)
  mov    %r12,0x30(%rsp)
L644:
  mov    0x8(%rsp),%r15
  mov    0x30(%rsp),%rbx
  lea    D65(%rip),%rbp
L806:
  movzbl (%rbx),%edx
  lea    0x1(%rbx),%r12
  lea    -0x80(%rdx),%eax
  cmp    $0x5,%al
  ja     L858
  movzbl %al,%eax
  movslq 0x0(%rbp,%rax,4),%rax
  add    %rbp,%rax
  notrack jmp *%rax
  nopl   0x0(%rax,%rax,1)
  cmpb   $0x0,(%r15)
  je     L231
L184:
  addq   $0x1,0x8(%rsp)
  mov    0x8(%rsp),%rax
  cmpb   $0x0,-0x1(%rax)
  jne    L644
  jmp    L973
  lea    0x2(%rbx),%rdi
  mov    %r15,%rsi
  call   <match_pattern>
  test   %eax,%eax
  jne    L231
  movzbl 0x1(%rbx),%ebx
  add    %r12,%rbx
  jmp    L806
  nopl   (%rax)
  mov    %r12,0x28(%rsp)
L762:
  mov    0x28(%rsp),%rbx
  mov    %r15,%r13
  lea    D24(%rip),%rbp
L138:
  movzbl (%rbx),%edx
  lea    0x1(%rbx),%r14
  lea    -0x80(%rdx),%eax
  cmp    $0x5,%al
  ja     L226
  movzbl %al,%eax
  movslq 0x0(%rbp,%rax,4),%rax
  add    %rbp,%rax
  notrack jmp *%rax
  nopl   0x0(%rax)
  cmpb   $0x0,0x0(%r13)
  je     L231
L402:
  add    $0x1,%r15
  cmpb   $0x0,-0x1(%r15)
  jne    L762
  jmp    L184
  nopl   0x0(%rax,%rax,1)
  lea    0x2(%rbx),%rdi
  mov    %r13,%rsi
  call   <match_pattern>
  test   %eax,%eax
  jne    L231
  movzbl 0x1(%rbx),%ebx
  add    %r14,%rbx
  jmp    L138
  nopl   (%rax)
  mov    %r14,0x20(%rsp)
  lea    D7(%rip),%r9
  mov    %r15,0x58(%rsp)
  mov    %r13,%r15
L515:
  mov    0x20(%rsp),%rbx
  mov    %r15,%r12
L282:
  movzbl (%rbx),%edx
  lea    0x1(%rbx),%r14
  lea    -0x80(%rdx),%eax
  cmp    $0x5,%al
  ja     L750
  movzbl %al,%eax
  movslq (%r9,%rax,4),%rax
  add    %r9,%rax
  notrack jmp *%rax
  nopl   0x0(%rax,%rax,1)
  cmpb   $0x0,(%r12)
  je     L231
L439:
  add    $0x1,%r15
  cmpb   $0x0,-0x1(%r15)
  jne    L515
  mov    0x58(%rsp),%r15
  jmp    L402
  nopl   0x0(%rax,%rax,1)
  mov    %r15,0x50(%rsp)
  lea    D25(%rip),%r13
  mov    %r14,0x18(%rsp)
L532:
  mov    0x18(%rsp),%r15
  mov    %r12,%rbx
L381:
  movzbl (%r15),%edx
  lea    0x1(%r15),%rbp
  lea    -0x80(%rdx),%eax
  cmp    $0x5,%al
  ja     L70
  lea    D106(%rip),%rcx
  movzbl %al,%eax
  movslq (%rcx,%rax,4),%rax
  add    %rcx,%rax
  notrack jmp *%rax
  cmpb   $0x0,(%rbx)
  je     L231
L702:
  add    $0x1,%r12
  cmpb   $0x0,-0x1(%r12)
  jne    L532
  mov    0x50(%rsp),%r15
  jmp    L439
  nopl   0x0(%rax)
  mov    %r12,0x48(%rsp)
L593:
  mov    %rbx,%r14
  mov    %rbp,%r15
L400:
  movzbl (%r15),%edx
  lea    0x1(%r15),%r12
  lea    -0x80(%rdx),%eax
  cmp    $0x5,%al
  ja     L4
  movzbl %al,%eax
  movslq 0x0(%r13,%rax,4),%rax
  add    %r13,%rax
  notrack jmp *%rax
  nopl   0x0(%rax)
L91:
  mov    %r14,%rsi
  mov    %r12,%rdi
  call   <match_pattern>
  test   %eax,%eax
  jne    L231
  add    $0x1,%r14
  lea    D7(%rip),%r9
  cmpb   $0x0,-0x1(%r14)
  jne    L91
  add    $0x1,%rbx
  cmpb   $0x0,-0x1(%rbx)
  jne    L593
  mov    0x48(%rsp),%r12
  jmp    L702
  cs nopw 0x0(%rax,%rax,1)
  cmpb   $0x0,(%r14)
  je     L231
L311:
  add    $0x1,%rbx
  cmpb   $0x0,-0x1(%rbx)
  jne    L593
  mov    0x48(%rsp),%r12
  jmp    L702
  xchg   %ax,%ax
  movzbl 0x1(%r15),%r15d
  add    %r12,%r15
  jmp    L400
  nopl   (%rax)
  lea    0x2(%r15),%rdi
  mov    %r14,%rsi
  call   <match_pattern>
  test   %eax,%eax
  jne    L231
  movzbl 0x1(%r15),%r15d
  lea    D7(%rip),%r9
  add    %r12,%r15
  jmp    L400
  nopl   0x0(%rax,%rax,1)
  movzbl (%r14),%eax
  test   %al,%al
  lea    0x7(%rax),%edx
  cmovns %eax,%edx
  sar    $0x3,%dl
  movsbq %dl,%rdx
  movzbl (%r12,%rdx,1),%ecx
  mov    %eax,%edx
  sar    $0x7,%dl
  shr    $0x5,%dl
  add    %edx,%eax
  and    $0x7,%eax
  sub    %edx,%eax
  bt     %eax,%ecx
  jae    L311
  add    $0x11,%r15
  add    $0x1,%r14
  jmp    L400
  nopl   (%rax)
  cmpb   $0x0,(%r14)
  je     L311
L779:
  add    $0x1,%r14
  mov    %r12,%r15
  jmp    L400
  cs nopw 0x0(%rax,%rax,1)
  movzbl (%rbx),%eax
  test   %al,%al
  lea    0x7(%rax),%edx
  cmovns %eax,%edx
  sar    $0x3,%dl
  movsbq %dl,%rdx
  movzbl 0x0(%rbp,%rdx,1),%ecx
  mov    %eax,%edx
  sar    $0x7,%dl
  shr    $0x5,%dl
  add    %edx,%eax
  and    $0x7,%eax
  sub    %edx,%eax
  bt     %eax,%ecx
  jae    L702
  add    $0x11,%r15
  add    $0x1,%rbx
  jmp    L381
  nopl   0x0(%rax)
  cmpb   $0x0,(%rbx)
  je     L702
L667:
  add    $0x1,%rbx
  mov    %rbp,%r15
  jmp    L381
  nopl   (%rax)
  movzbl 0x1(%r15),%r15d
  add    %rbp,%r15
  jmp    L381
  nopl   (%rax)
  lea    0x2(%r15),%rdi
  mov    %rbx,%rsi
  call   <match_pattern>
  test   %eax,%eax
  jne    L231
  movzbl 0x1(%r15),%r15d
  lea    D7(%rip),%r9
  add    %rbp,%r15
  jmp    L381
  cmpb   $0x0,(%r12)
  je     L439
  add    $0x1,%r12
  mov    %r14,%rbx
  jmp    L282
  nopw   0x0(%rax,%rax,1)
  movzbl (%r12),%eax
  test   %al,%al
  lea    0x7(%rax),%edx
  cmovns %eax,%edx
  sar    $0x3,%dl
  movsbq %dl,%rdx
  movzbl (%r14,%rdx,1),%ecx
  mov    %eax,%edx
  sar    $0x7,%dl
  shr    $0x5,%dl
  add    %edx,%eax
  and    $0x7,%eax
  sub    %edx,%eax
  bt     %eax,%ecx
  jae    L439
  add    $0x11,%rbx
  add    $0x1,%r12
  jmp    L282
  xchg   %ax,%ax
  movzbl 0x1(%rbx),%ebx
  add    %r14,%rbx
  jmp    L282
  nopl   0x0(%rax)
  lea    0x2(%rbx),%rdi
  mov    %r12,%rsi
  call   <match_pattern>
  test   %eax,%eax
  je     L87
L231:
  add    $0x68,%rsp
  mov    $0x1,%eax
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax,%rax,1)
  movzbl 0x0(%r13),%eax
  test   %al,%al
  lea    0x7(%rax),%edx
  cmovns %eax,%edx
  sar    $0x3,%dl
  movsbq %dl,%rdx
  movzbl (%r14,%rdx,1),%ecx
  mov    %eax,%edx
  sar    $0x7,%dl
  shr    $0x5,%dl
  add    %edx,%eax
  and    $0x7,%eax
  sub    %edx,%eax
  bt     %eax,%ecx
  jae    L402
  add    $0x11,%rbx
  add    $0x1,%r13
  jmp    L138
  xchg   %ax,%ax
  cmpb   $0x0,0x0(%r13)
  je     L402
  add    $0x1,%r13
  mov    %r14,%rbx
  jmp    L138
  nopw   0x0(%rax,%rax,1)
  movzbl (%r15),%eax
  test   %al,%al
  lea    0x7(%rax),%edx
  cmovns %eax,%edx
  sar    $0x3,%dl
  movsbq %dl,%rdx
  movzbl (%r12,%rdx,1),%ecx
  mov    %eax,%edx
  sar    $0x7,%dl
  shr    $0x5,%dl
  add    %edx,%eax
  and    $0x7,%eax
  sub    %edx,%eax
  bt     %eax,%ecx
  jae    L184
  add    $0x11,%rbx
  add    $0x1,%r15
  jmp    L806
  nopl   (%rax)
  cmpb   $0x0,(%r15)
  je     L184
  add    $0x1,%r15
  mov    %r12,%rbx
  jmp    L806
  cs nopw 0x0(%rax,%rax,1)
  cmpb   $0x0,(%r15)
  je     L973
L534:
  add    $0x1,%r15
  mov    %r12,%rbx
  jmp    L27
  cs nopw 0x0(%rax,%rax,1)
  movzbl (%r15),%eax
  test   %al,%al
  lea    0x7(%rax),%edx
  cmovns %eax,%edx
  sar    $0x3,%dl
  movsbq %dl,%rdx
  movzbl (%r12,%rdx,1),%ecx
  mov    %eax,%edx
  sar    $0x7,%dl
  shr    $0x5,%dl
  add    %edx,%eax
  and    $0x7,%eax
  sub    %edx,%eax
  bt     %eax,%ecx
  jae    L973
  add    $0x11,%rbx
  add    $0x1,%r15
  jmp    L27
  nopl   (%rax)
  cmpb   $0x0,(%r15)
  je     L751
L610:
  add    $0x1,%r15
  mov    %r12,%rbx
  jmp    L917
  nopw   0x0(%rax,%rax,1)
  cmpb   $0x0,(%r15)
  je     L231
L751:
  addq   $0x1,(%rsp)
  mov    (%rsp),%rax
  cmpb   $0x0,-0x1(%rax)
  jne    L360
  xor    %eax,%eax
  jmp    L661
  nopl   0x0(%rax)
  movzbl (%r15),%eax
  test   %al,%al
  lea    0x7(%rax),%edx
  cmovns %eax,%edx
  sar    $0x3,%dl
  movsbq %dl,%rdx
  movzbl (%r12,%rdx,1),%ecx
  mov    %eax,%edx
  sar    $0x7,%dl
  shr    $0x5,%dl
  add    %edx,%eax
  and    $0x7,%eax
  sub    %edx,%eax
  bt     %eax,%ecx
  jae    L751
  add    $0x11,%rbx
  add    $0x1,%r15
  jmp    L917
  nopl   0x0(%rax)
  mov    (%rsp),%rax
  cmpb   $0x0,(%rax)
  je     L392
  add    $0x1,%rax
  mov    %r12,%rbx
  mov    %rax,(%rsp)
  jmp    L511
  nopl   (%rax)
  mov    (%rsp),%rax
  cmpb   $0x0,(%rax)
  sete   %al
  movzbl %al,%eax
L94:
  add    $0x68,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  nopl   0x0(%rax)
  mov    (%rsp),%rax
  movzbl (%rax),%edx
  test   %dl,%dl
  lea    0x7(%rdx),%eax
  mov    %edx,%esi
  cmovns %edx,%eax
  sar    $0x7,%sil
  shr    $0x5,%sil
  sar    $0x3,%al
  lea    (%rdx,%rsi,1),%ecx
  movsbq %al,%rax
  and    $0x7,%ecx
  movzbl (%r12,%rax,1),%eax
  sub    %esi,%ecx
  sar    %cl,%eax
  and    $0x1,%eax
  je     L94
  addq   $0x1,(%rsp)
  add    $0x11,%rbx
  jmp    L511
L4:
  cmp    (%r14),%dl
  jne    L311
  jmp    L779
L70:
  cmp    (%rbx),%dl
  jne    L702
  jmp    L667
L750:
  cmp    (%r12),%dl
  jne    L439
  add    $0x1,%r12
  mov    %r14,%rbx
  jmp    L282
L226:
  cmp    0x0(%r13),%dl
  jne    L402
  add    $0x1,%r13
  mov    %r14,%rbx
  jmp    L138
L858:
  cmp    (%r15),%dl
  jne    L184
  add    $0x1,%r15
  mov    %r12,%rbx
  jmp    L806
L681:
  cmp    (%r15),%dl
  jne    L973
  jmp    L534
L374:
  cmp    (%r15),%dl
  jne    L751
  jmp    L610
L989:
  mov    (%rsp),%rax
  cmp    %dl,(%rax)
  jne    L392
  addq   $0x1,(%rsp)
  mov    %r12,%rbx
  jmp    L511
  nopl   0x0(%rax,%rax,1)
L87:
  movzbl 0x1(%rbx),%ebx
  lea    D7(%rip),%r9
  add    %r14,%rbx
  jmp    L282
```

assistant: ```c
int match_pattern(unsigned char *p, const char *s) {
  unsigned char c;
  for (;;) {
    switch (c = *p++) {
    case 133:
      return (*s == '\0' ? 1 : 0);
    case 128:
      if (*s == '\0')
        return (0);
      ;
      s++;
      continue;
    case 132:
      if (p[*s / 8] & (1 << (*s % 8))) {
        p += 16;
        s++;
        continue;
      }
      return (0);
      ;
    case 129:
      do {
        if (match_pattern(p, s))
          return (1);
        ;
      } while (*s++);
      return (0);
      ;
    case 131:
      p += *p;
      continue;
    case 130:
      if (match_pattern(p + 1, s))
        return (1);
      ;
      p += *p;
      continue;
    default:
      if (c != (unsigned char)*s)
        return (0);
      ;
      s++;
      continue;
    }
  }
}
```