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

```asm
<BASM_XCallSplitSigW64>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    %rcx,-0x40(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  movl   $0x0,-0x14(%rbp)
  movl   $0x0,-0x10(%rbp)
  movl   $0x0,-0xc(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x28,%al
  jne    L469
  addq   $0x1,-0x8(%rbp)
  jmp    L469
L367:
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x43,%eax
  cmp    $0x36,%eax
  ja     L541
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D12(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D12(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  cmpl   $0x3,-0x10(%rbp)
  jg     L157
  addl   $0x1,-0x10(%rbp)
  jmp    L469
L157:
  addl   $0x1,-0xc(%rbp)
  jmp    L469
  cmpl   $0x3,-0x10(%rbp)
  jg     L123
  addl   $0x1,-0x10(%rbp)
  jmp    L469
L123:
  addl   $0x1,-0xc(%rbp)
  jmp    L469
  cmpl   $0x3,-0x10(%rbp)
  jg     L518
  addl   $0x1,-0x10(%rbp)
  jmp    L469
L518:
  addl   $0x1,-0xc(%rbp)
  jmp    L469
  cmpl   $0x3,-0x10(%rbp)
  jg     L306
  addl   $0x1,-0x10(%rbp)
  jmp    L436
L306:
  addl   $0x1,-0xc(%rbp)
  jmp    L436
L42:
  addq   $0x1,-0x8(%rbp)
L436:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x50,%al
  je     L42
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x60,%al
  jle    L105
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x7a,%al
  jg     L105
  addq   $0x1,-0x8(%rbp)
  jmp    L469
L105:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x58,%al
  jne    L469
  jmp    L15
L286:
  addq   $0x1,-0x8(%rbp)
L15:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L393
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x3b,%al
  jne    L286
L393:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x3b,%al
  jne    L469
  addq   $0x1,-0x8(%rbp)
  jmp    L469
  cmpl   $0x3,-0x10(%rbp)
  jg     L347
  addl   $0x1,-0x10(%rbp)
  jmp    L469
L347:
  addl   $0x1,-0xc(%rbp)
  jmp    L469
  cmpl   $0x3,-0x10(%rbp)
  jg     L536
  addl   $0x1,-0x10(%rbp)
  jmp    L469
L536:
  mov    -0xc(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L2
  addl   $0x1,-0xc(%rbp)
L2:
  addl   $0x2,-0xc(%rbp)
  jmp    L469
  cmpl   $0x3,-0x10(%rbp)
  jg     L294
  addl   $0x1,-0x10(%rbp)
  jmp    L469
L294:
  addl   $0x1,-0xc(%rbp)
  jmp    L469
  cmpl   $0x3,-0x10(%rbp)
  jg     L364
  addl   $0x1,-0x10(%rbp)
  jmp    L469
L364:
  mov    -0xc(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L442
  addl   $0x1,-0xc(%rbp)
L442:
  addl   $0x2,-0xc(%rbp)
  jmp    L469
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x64,%eax
  cmp    $0x7,%eax
  ja     L469
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D11(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D11(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  addl   $0x8,-0x14(%rbp)
  jmp    L505
  addl   $0x10,-0x14(%rbp)
  jmp    L505
  addl   $0x20,-0x14(%rbp)
  jmp    L505
  addl   $0x20,-0x14(%rbp)
  jmp    L505
  addl   $0x4,-0x14(%rbp)
  nop
L505:
  jmp    L469
  mov    -0x8(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x8(%rbp)
  movzbl (%rax),%eax
  movsbl %al,%eax
  sub    $0x64,%eax
  cmp    $0x7,%eax
  ja     L469
  mov    %eax,%eax
  lea    0x0(,%rax,4),%rdx
  lea    D9(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D9(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  addl   $0x4,-0x14(%rbp)
  jmp    L118
  addl   $0x8,-0x14(%rbp)
  jmp    L118
  addl   $0xc,-0x14(%rbp)
  jmp    L118
  addl   $0x10,-0x14(%rbp)
  jmp    L118
  addl   $0x4,-0x14(%rbp)
  nop
L118:
  jmp    L469
L541:
  nop
L469:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L186
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x29,%al
  jne    L367
L186:
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  test   %al,%al
  je     L544
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%eax
  cmp    $0x29,%al
  jne    L544
  addq   $0x1,-0x8(%rbp)
L544:
  cmpq   $0x0,-0x30(%rbp)
  je     L184
  mov    -0x30(%rbp),%rax
  mov    -0x8(%rbp),%rdx
  mov    %rdx,(%rax)
L184:
  cmpq   $0x0,-0x38(%rbp)
  je     L138
  mov    -0x38(%rbp),%rax
  mov    -0x10(%rbp),%edx
  mov    %edx,(%rax)
L138:
  cmpq   $0x0,-0x40(%rbp)
  je     L251
  mov    -0x40(%rbp),%rax
  mov    -0xc(%rbp),%edx
  mov    %edx,(%rax)
L251:
  mov    -0x14(%rbp),%eax
  pop    %rbp
  ret
```

assistant: ```c
int BASM_XCallSplitSigW64(char *sig, char **esig, int *rni, int *rns) {
  char *s;
  int i, j, ni, ns;
  s = sig;
  i = 0;
  ni = 0;
  ns = 0;
  if (*s == '(')
    s++;
  while (*s && (*s != ')')) {
    switch (*s++) {
    case 'a':
    case 'b':
    case 'c':
    case 'h':
    case 's':
    case 't':
    case 'w':
    case 'i':
    case 'j':
      if (ni < 4) {
        ni++;
        break;
      }
      ns++;
      break;
    case 'l':
    case 'm':
    case 'x':
    case 'y':
      if (ni < 4) {
        ni++;
        break;
      }
      ns++;
      break;
    case 'r':
      if (ni < 4) {
        ni++;
        break;
      }
      ns++;
      break;
    case 'P':
      if (ni < 4)
        ni++;
      else
        ns++;
      while (*s == 'P')
        s++;
      if ((*s >= 'a') && (*s <= 'z')) {
        s++;
        break;
      }
      if (*s == 'X') {
        while (*s && *s != ';')
          s++;
        if (*s == ';')
          s++;
      }
      break;
    case 'd':
      if (ni < 4) {
        ni++;
        break;
      }
      ns++;
      break;
    case 'e':
      if (ni < 4) {
        ni++;
        break;
      }
      if (ns & 1)
        ns++;
      ns += 2;
      break;
    case 'f':
    case 'k':
      if (ni < 4) {
        ni++;
        break;
      }
      ns++;
      break;
    case 'g':
    case 'n':
    case 'o':
      if (ni < 4) {
        ni++;
        break;
      }
      if (ns & 1)
        ns++;
      ns += 2;
      break;
    case 'C':
      switch (*s++) {
      case 'f':
        i += 8;
        break;
      case 'd':
        i += 16;
        break;
      case 'e':
        i += 32;
        break;
      case 'g':
        i += 32;
        break;
      case 'k':
        i += 4;
        break;
      }
      break;
    case 'G':
      switch (*s++) {
      case 'f':
        i += 4;
        break;
      case 'd':
        i += 8;
        break;
      case 'e':
        i += 12;
        break;
      case 'g':
        i += 16;
        break;
      case 'k':
        i += 4;
        break;
      }
      break;
    default:
      break;
    }
  }
  if (*s && *s == ')')
    s++;
  if (esig)
    *esig = s;
  if (rni)
    *rni = ni;
  if (rns)
    *rns = ns;
  return (i);
}
```