user: 下面的汇编指令对应的C源代码是什么：

```asm
<metaphone>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  mov    %rdi,%r12
  push   %rbp
  push   %rbx
  sub    $0x28,%rsp
  call   <strlen@plt>
  mov    $0x1,%esi
  lea    0x1(%rax,%rax,1),%edi
  call   <calloc@plt>
  mov    %rax,0x8(%rsp)
  test   %rax,%rax
  je     L574
  movsbl (%r12),%edi
  call   <tolower@plt>
  mov    %eax,%ebx
  test   %al,%al
  jne    L19
L1097:
  movsbl (%r12),%edi
  mov    %r12,%r14
  lea    D5(%rip),%r13
  call   <tolower@plt>
  mov    0x8(%rsp),%rbp
  mov    %eax,%r15d
  test   %al,%al
  jne    L35
  jmp    L574
  nopl   0x0(%rax)
L643:
  cmp    $0x63,%r15b
  je     L1249
L347:
  add    $0x1,%r14
L1229:
  mov    %ebx,%r15d
L35:
  movsbl 0x1(%r14),%edi
  call   <tolower@plt>
  movsbl 0x2(%r14),%edi
  mov    %eax,%ebx
  call   <tolower@plt>
  mov    %eax,%esi
  cmp    %r15b,%bl
  je     L643
L1249:
  lea    -0x20(%r15),%eax
  cmp    $0x5a,%al
  ja     L533
  movzbl %al,%eax
  movslq 0x0(%r13,%rax,4),%rax
  add    %r13,%rax
  notrack jmp *%rax
  movb   $0x46,0x0(%rbp)
  add    $0x1,%rbp
  nopl   0x0(%rax,%rax,1)
L533:
  add    $0x1,%r14
  test   %bl,%bl
  jne    L1229
L574:
  mov    0x8(%rsp),%rax
  add    $0x28,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  cmp    %r14,%r12
  je     L84
  movsbl -0x1(%r14),%edi
  call   <tolower@plt>
  cmp    $0x63,%al
  je     L533
L84:
  movb   $0x4b,0x0(%rbp)
  add    $0x1,%r14
  add    $0x1,%rbp
  test   %bl,%bl
  jne    L1229
  jmp    L574
  nopl   (%rax)
L1083:
  movb   $0x4a,0x0(%rbp)
  add    $0x1,%r14
  add    $0x1,%rbp
  test   %bl,%bl
  jne    L1229
  jmp    L574
  xchg   %ax,%ax
L1317:
  movb   $0x53,0x0(%rbp)
  add    $0x1,%r14
  add    $0x1,%rbp
  test   %bl,%bl
  jne    L1229
  jmp    L574
  cs nopw 0x0(%rax,%rax,1)
L19:
  movsbl 0x1(%r12),%edi
  call   <tolower@plt>
  lea    -0x67(%rbx),%edx
  and    $0xfb,%edx
  je     L402
  cmp    $0x70,%bl
  je     L402
L845:
  cmp    $0x61,%bl
  sete   %dl
  cmp    $0x63,%al
  jne    L187
  test   %dl,%dl
  je     L187
L385:
  add    $0x1,%r12
  jmp    L1097
L133:
  movsbl 0x3(%r14),%edi
  lea    0x2(%r14),%rbx
  call   <tolower@plt>
  movsbl 0x4(%r14),%edi
  mov    %eax,%r15d
  call   <tolower@plt>
  cmp    $0x69,%r15b
  je     L1132
  mov    0x10(%rsp),%rbp
  mov    %rbx,%r14
  mov    %r15d,%ebx
  mov    $0x69,%r15d
  nopl   0x0(%rax,%rax,1)
L1301:
  movsbl %r15b,%edi
L161:
  cmp    %r14,%r12
  je     L932
  cmpb   $0x20,-0x1(%r14)
  jne    L533
L932:
  call   <toupper@plt>
  add    $0x1,%rbp
  mov    %al,-0x1(%rbp)
  jmp    L533
  nopl   (%rax)
L402:
  cmp    $0x6e,%al
  je     L385
  jmp    L845
  movb   $0x4c,0x0(%rbp)
  add    $0x1,%r14
  add    $0x1,%rbp
  test   %bl,%bl
  jne    L1229
  jmp    L574
  movb   $0x4d,0x0(%rbp)
  add    $0x1,%r14
  add    $0x1,%rbp
  test   %bl,%bl
  jne    L1229
  jmp    L574
  lea    0x1(%rbp),%r15
  cmp    $0x68,%bl
  je     L663
  movb   $0x50,0x0(%rbp)
  add    $0x1,%r14
  mov    %r15,%rbp
  test   %bl,%bl
  jne    L1229
  jmp    L574
  lea    0x1(%rbp),%r15
  cmp    $0x68,%bl
  je     L809
  cmp    $0x69,%bl
  je     L865
L324:
  movb   $0x53,0x0(%rbp)
  add    $0x1,%r14
  mov    %r15,%rbp
  test   %bl,%bl
  jne    L1229
  jmp    L574
  lea    0x1(%rbp),%rax
  lea    0x1(%r14),%r15
  mov    %rax,0x10(%rsp)
  cmp    $0x69,%bl
  je     L207
  cmp    $0x68,%bl
  je     L376
  cmp    $0x63,%bl
  jne    L1008
  cmp    $0x68,%sil
  jne    L1008
  movsbl 0x2(%r14),%edi
  call   <tolower@plt>
  movsbl 0x3(%r14),%edi
  mov    %eax,%ebx
  call   <tolower@plt>
  mov    %eax,%esi
L824:
  cmp    $0x69,%bl
  lea    0x1(%r15),%r14
  sete   %dil
  cmp    $0x61,%sil
  sete   %al
  test   %al,%dil
  jne    L995
  cmp    $0x68,%bl
  je     L995
  mov    %ebx,%eax
  and    $0xffffffef,%eax
  cmp    $0x69,%al
  je     L182
  cmp    $0x65,%bl
  je     L182
  movb   $0x4b,0x0(%rbp)
  mov    %r15,%r14
  mov    0x10(%rsp),%rbp
  jmp    L533
  movb   $0x52,0x0(%rbp)
  add    $0x1,%r14
  add    $0x1,%rbp
  test   %bl,%bl
  jne    L1229
  jmp    L574
  cmp    %r14,%r12
  je     L1357
  mov    $0x534b,%eax
  add    $0x2,%rbp
  add    $0x1,%r14
  mov    %ax,-0x2(%rbp)
  test   %bl,%bl
  jne    L1229
  jmp    L574
  cmpb   $0x20,0x0(%rbp)
  je     L533
  movb   $0x20,0x0(%rbp)
  add    $0x1,%r14
  add    $0x1,%rbp
  test   %bl,%bl
  jne    L1229
  jmp    L574
  cmp    %r14,%r12
  jb     L1017
L415:
  movb   $0x42,0x0(%rbp)
  add    $0x1,%r14
  add    $0x1,%rbp
  test   %bl,%bl
  jne    L1229
  jmp    L574
  lea    0x1(%rbp),%r15
  cmp    $0x67,%bl
  je     L299
L76:
  movb   $0x54,0x0(%rbp)
  add    $0x1,%r14
  mov    %r15,%rbp
  test   %bl,%bl
  jne    L1229
  jmp    L574
  cmp    %r14,%r12
  jne    L1209
  cmp    $0x68,%bl
  jne    L1209
  movsbl 0x2(%r14),%edi
  lea    0x1(%r14),%r15
  mov    %r15,%r14
  call   <tolower@plt>
  mov    %eax,%ebx
L1209:
  mov    %ebx,%eax
  and    $0xfffffffb,%eax
  cmp    $0x61,%al
  je     L968
  lea    -0x69(%rbx),%eax
  cmp    $0xc,%al
  ja     L533
  mov    $0x1041,%ecx
  mov    %rbp,%r15
  bt     %rax,%rcx
  jb     L968
L1163:
  mov    %r15,%rbp
  add    $0x1,%r14
  mov    %ebx,%r15d
  jmp    L35
  lea    -0x65(%rbx),%eax
  test   $0xfb,%al
  je     L1083
  cmp    $0x79,%bl
  je     L1206
  cmp    $0x68,%bl
  je     L981
  cmp    $0x6e,%bl
  jne    L84
L981:
  movsbl 0x2(%r14),%edi
  lea    0x1(%r14),%r15
  cmp    $0x68,%bl
  je     L359
  call   <tolower@plt>
  movsbl 0x3(%r14),%edi
  mov    %eax,%ebx
  call   <tolower@plt>
  cmp    $0x6e,%bl
  je     L740
L227:
  mov    %r15,%r14
  movb   $0x4e,0x0(%rbp)
  add    $0x1,%r14
  add    $0x1,%rbp
  test   %bl,%bl
  jne    L1229
  jmp    L574
  lea    0x1(%rbp),%rax
  mov    %r14,%r15
  mov    %rax,0x10(%rsp)
  jmp    L824
L862:
  call   <tolower@plt>
  movsbl 0x3(%r14),%edi
  mov    %eax,%ebx
  call   <tolower@plt>
  cmp    $0x68,%bl
  je     L1026
L265:
  mov    %r15,%r14
  cmp    %r14,%r12
  je     L91
  lea    -0x61(%rbx),%eax
  cmp    $0x14,%al
  ja     L87
  mov    $0x104111,%ecx
  bt     %rax,%rcx
  jb     L91
L87:
  movsbl -0x1(%r14),%edi
  call   <tolower@plt>
  jmp    L533
  nopl   0x0(%rax)
L91:
  movb   $0x48,0x0(%rbp)
  add    $0x1,%r14
  add    $0x1,%rbp
  test   %bl,%bl
  jne    L1229
  jmp    L574
  nopl   0x0(%rax)
L968:
  movb   $0x57,0x0(%rbp)
  add    $0x1,%r14
  add    $0x1,%rbp
  test   %bl,%bl
  jne    L1229
  jmp    L574
  nopl   0x0(%rax)
L995:
  movb   $0x58,0x0(%rbp)
  movsbl 0x2(%r15),%edi
  add    $0x1,%r14
  call   <tolower@plt>
  mov    0x10(%rsp),%rbp
  mov    %eax,%ebx
  test   %bl,%bl
  jne    L1229
  jmp    L574
L187:
  cmp    $0x77,%bl
  jne    L1399
  cmp    $0x72,%al
  je     L385
L1399:
  cmp    $0x65,%al
  jne    L1097
  test   %dl,%dl
  jne    L385
  jmp    L1097
L207:
  cmp    $0x61,%sil
  je     L16
  cmp    $0x6f,%sil
  jne    L1008
L16:
  movb   $0x58,0x0(%rbp)
  movsbl 0x2(%r14),%edi
  call   <tolower@plt>
  movsbl 0x3(%r14),%edi
  mov    %eax,%ebx
  call   <tolower@plt>
  cmp    $0x69,%bl
  je     L133
  mov    0x10(%rsp),%rbp
  mov    %r15,%r14
  mov    $0x69,%edi
  jmp    L161
L299:
  lea    -0x65(%rsi),%eax
  cmp    $0x14,%al
  ja     L76
  mov    $0x100011,%esi
  bt     %rax,%rsi
  jae    L76
  movb   $0x4a,0x0(%rbp)
  jmp    L288
L1008:
  movb   $0x54,0x0(%rbp)
  mov    0x10(%rsp),%rbp
  jmp    L533
L1017:
  movsbl -0x1(%r14),%edi
  call   <tolower@plt>
  test   %bl,%bl
  jne    L415
  cmp    $0x6d,%al
  jne    L415
  jmp    L574
L1357:
  cmp    $0x68,%bl
  je     L66
  cmp    $0x69,%bl
  jne    L1317
  cmp    $0x6f,%sil
  je     L66
  cmp    $0x61,%sil
  jne    L1317
L66:
  movb   $0x58,0x0(%rbp)
  add    $0x1,%rbp
  jmp    L533
L865:
  cmp    $0x6f,%sil
  je     L742
  cmp    $0x61,%sil
  jne    L324
L742:
  movb   $0x58,0x0(%rbp)
L288:
  movsbl 0x3(%r14),%edi
  lea    0x2(%r14),%rax
  mov    %r15,%rbp
  mov    %rax,0x10(%rsp)
  call   <tolower@plt>
  mov    0x10(%rsp),%r14
  mov    %eax,%ebx
  jmp    L533
L182:
  movb   $0x53,0x0(%rbp)
  movsbl 0x2(%r15),%edi
  call   <tolower@plt>
  mov    0x10(%rsp),%rbp
  mov    %eax,%ebx
  jmp    L533
  mov    %rbp,%r15
L528:
  mov    %ebx,%eax
  and    $0xfffffffb,%eax
  cmp    $0x61,%al
  je     L1337
  lea    -0x69(%rbx),%eax
  cmp    $0xc,%al
  ja     L71
  mov    $0x1041,%ecx
  bt     %rax,%rcx
  jae    L1163
  nopw   0x0(%rax,%rax,1)
L1337:
  movb   $0x59,(%r15)
  lea    0x1(%r15),%rbp
  add    $0x1,%r14
  test   %bl,%bl
  jne    L1229
  jmp    L574
L809:
  lea    0x1(%r14),%rax
  movb   $0x58,0x0(%rbp)
  mov    %rax,0x10(%rsp)
L728:
  movsbl 0x2(%r14),%edi
  mov    %r15,%rbp
  call   <tolower@plt>
  mov    0x10(%rsp),%r14
  mov    %eax,%ebx
  jmp    L533
L663:
  lea    0x1(%r14),%rax
  movb   $0x46,0x0(%rbp)
  mov    %rax,0x10(%rsp)
  jmp    L728
L376:
  movb   $0x30,0x0(%rbp)
  movsbl 0x2(%r14),%edi
  mov    %r15,%r14
  call   <tolower@plt>
  mov    0x10(%rsp),%rbp
  mov    %eax,%ebx
  jmp    L533
L1206:
  movb   $0x4a,0x0(%rbp)
  movsbl 0x2(%r14),%edi
  lea    0x1(%rbp),%r15
  lea    0x1(%r14),%rbp
  call   <tolower@plt>
  movsbl 0x3(%r14),%edi
  mov    %eax,%ebx
  call   <tolower@plt>
  cmp    $0x79,%bl
  je     L557
  mov    %rbp,%r14
  jmp    L528
L71:
  mov    %r15,%rbp
  jmp    L533
L359:
  mov    %esi,%eax
  and    $0xfffffffb,%eax
  cmp    $0x61,%al
  je     L862
  cmp    $0x69,%sil
  je     L862
  cmp    $0x6f,%sil
  je     L862
  cmp    $0x75,%sil
  je     L862
  call   <tolower@plt>
  mov    %r15,%r14
  mov    %eax,%ebx
  jmp    L533
L557:
  movsbl 0x3(%r14),%edi
  lea    0x2(%r14),%rcx
  mov    %rcx,0x10(%rsp)
  call   <tolower@plt>
  movsbl 0x4(%r14),%edi
  mov    %eax,%ebx
  call   <tolower@plt>
  cmp    $0x79,%bl
  mov    0x10(%rsp),%rcx
  je     L1025
  mov    %rcx,%r14
  jmp    L528
L740:
  movsbl 0x3(%r14),%edi
  lea    0x2(%r14),%r15
  call   <tolower@plt>
  movsbl 0x4(%r14),%edi
  mov    %eax,%ebx
  call   <tolower@plt>
  cmp    $0x6e,%bl
  jne    L227
  movsbl 0x4(%r14),%edi
  lea    0x3(%r14),%r15
  call   <tolower@plt>
  movsbl 0x5(%r14),%edi
  mov    %eax,%ebx
  call   <tolower@plt>
  cmp    $0x6e,%bl
  jne    L227
L848:
  mov    %r15,%r14
  jmp    L347
L1132:
  movsbl 0x4(%r14),%edi
  lea    0x3(%r14),%rsi
  mov    %rsi,0x18(%rsp)
  call   <tolower@plt>
  movsbl 0x5(%r14),%edi
  mov    %eax,%ebx
  call   <tolower@plt>
  cmp    $0x69,%bl
  mov    0x18(%rsp),%rsi
  je     L756
  mov    0x10(%rsp),%rbp
  mov    %rsi,%r14
  jmp    L1301
L1025:
  mov    %r15,%rbp
  mov    %rcx,%r14
  jmp    L347
L1026:
  movsbl 0x3(%r14),%edi
  lea    0x2(%r14),%r15
  call   <tolower@plt>
  movsbl 0x4(%r14),%edi
  mov    %eax,%ebx
  call   <tolower@plt>
  cmp    $0x68,%bl
  jne    L265
  movsbl 0x4(%r14),%edi
  lea    0x3(%r14),%r15
  call   <tolower@plt>
  movsbl 0x5(%r14),%edi
  mov    %eax,%ebx
  call   <tolower@plt>
  cmp    $0x68,%bl
  jne    L265
  jmp    L848
L756:
  mov    0x10(%rsp),%rbp
  mov    %rsi,%r14
  jmp    L347
```

assistant: ```c
char *metaphone(const char *str) {
  const char *s;
  char c, next, nextnext, temp = '\0';
  char *result = calloc(strlen(str) * 2 + 1, sizeof(char));
  char *r;
  if (!result) {
    return NULL;
  }
  c = tolower(*str);
  if (c) {
    next = tolower(*(str + 1));
    if ((c == 'k' && next == 'n') || (c == 'g' && next == 'n') || (c == 'p' && next == 'n') || (c == 'a' && next == 'c') || (c == 'w' && next == 'r') || (c == 'a' && next == 'e')) {
      str++;
    }
  }
  next = tolower(*str);
  for (s = str, r = result; next; s++) {
    c = next;
    next = tolower(*(s + 1));
    nextnext = tolower(*(s + 2));
    if (c == next && c != 'c') {
      continue;
    }
    switch (c) {
    case 'a':
    case 'e':
    case 'i':
    case 'o':
    case 'u':
      if (s == str || *(s - 1) == ' ') {
        *r++ = toupper(c);
      }
      break;
    case 'b':
      if (!(s > str && tolower(*(s - 1)) == 'm') || next) {
        *r++ = 'B';
      }
      break;
    case 'c':
      if ((next == 'i' && nextnext == 'a') || next == 'h') {
        *r++ = 'X';
        next = tolower(*(++s + 1));
      } else if (next == 'i' || next == 'e' || next == 'y') {
        *r++ = 'S';
        next = tolower(*(++s + 1));
      } else {
        *r++ = 'K';
      }
      break;
    case 'd':
      if (next == 'g' && (nextnext == 'e' || nextnext == 'y' || nextnext == 'i')) {
        *r++ = 'J';
        s += 2;
        next = tolower(*(s + 1));
      } else {
        *r++ = 'T';
      }
      break;
    case 'f':
      *r++ = 'F';
      break;
    case 'g':
      if (next == 'i' || next == 'e' || next == 'y') {
        *r++ = 'J';
      } else if (next != 'h' && next != 'n') {
        *r++ = 'K';
      } else if (next == 'h' && !(((nextnext) == 'a' || (nextnext) == 'e' || (nextnext) == 'i' || (nextnext) == 'o' || (nextnext) == 'u'))) {
        s++;
        next = tolower(*(s + 1));
      }
      break;
    case 'h':
      if (s == str || ((next) == 'a' || (next) == 'e' || (next) == 'i' || (next) == 'o' || (next) == 'u') || (temp = tolower(*(s - 1)) && ((temp) == 'a' || (temp) == 'e' || (temp) == 'i' || (temp) == 'o' || (temp) == 'u'))) {
        *r++ = 'H';
      }
      break;
    case 'j':
      *r++ = 'J';
      break;
    case 'k':
      if (s == str || tolower(*(s - 1)) != 'c') {
        *r++ = 'K';
      }
      break;
    case 'l':
      *r++ = 'L';
      break;
    case 'm':
      *r++ = 'M';
      break;
    case 'n':
      *r++ = 'N';
      break;
    case 'p':
      if (next == 'h') {
        *r++ = 'F';
        next = tolower(*(++s + 1));
      } else {
        *r++ = 'P';
      }
      break;
    case 'q':
      *r++ = 'K';
      break;
    case 'r':
      *r++ = 'R';
      break;
    case 's':
      if (next == 'h') {
        *r++ = 'X';
        next = tolower(*(++s + 1));
      } else if (next == 'i' && (nextnext == 'o' || nextnext == 'a')) {
        *r++ = 'X';
        s += 2;
        next = tolower(*(s + 1));
      } else {
        *r++ = 'S';
      }
      break;
    case 't':
      if (next == 'i' && (nextnext == 'a' || nextnext == 'o')) {
        *r++ = 'X';
      } else if (next == 'h') {
        *r++ = '0';
        next = tolower(*(++s + 1));
      } else if (next != 'c' || nextnext != 'h') {
        *r++ = 'T';
      }
      break;
    case 'v':
      *r++ = 'F';
      break;
    case 'w':
      if (s == str && next == 'h') {
        next = tolower(*(++s + 1));
      }
      if (((next) == 'a' || (next) == 'e' || (next) == 'i' || (next) == 'o' || (next) == 'u')) {
        *r++ = 'W';
      }
      break;
    case 'x':
      if (s == str) {
        if (next == 'h' || (next == 'i' && (nextnext == 'o' || nextnext == 'a'))) {
          *r++ = 'X';
        } else {
          *r++ = 'S';
        }
      } else {
        *r++ = 'K';
        *r++ = 'S';
      }
      break;
    case 'y':
      if (((next) == 'a' || (next) == 'e' || (next) == 'i' || (next) == 'o' || (next) == 'u')) {
        *r++ = 'Y';
      }
      break;
    case 'z':
      *r++ = 'S';
      break;
    case ' ':
      if (*r != ' ') {
        *r++ = ' ';
      }
      break;
    }
  }
  return result;
}
```