user: What would the C source look like for the assembly code provided here:

```asm
<mstrcmp>:
  endbr64
  mov    %rdi,%r10
  mov    %rsi,%r9
  test   %edx,%edx
  je     L439
  cmp    $0x1,%edx
  je     L20
  xor    %eax,%eax
  cmp    $0xffffffff,%edx
  je     L33
  ret
  nop
L439:
  jmp    1050 <strcmp@plt>
  nopl   (%rax)
L33:
  push   %r12
  push   %rbp
  push   %rbx
  movzbl (%rdi),%esi
  test   %sil,%sil
  je     L350
  lea    0x1(%rdi),%rax
  xor    %ecx,%ecx
  xchg   %ax,%ax
L80:
  lea    -0x9(%rsi),%edx
  cmp    $0x4,%dl
  jbe    L129
  cmp    $0x20,%sil
  jne    L104
L129:
  movzbl (%rax),%esi
  add    $0x1,%rax
  add    $0x1,%ecx
  test   %sil,%sil
  jne    L80
  xor    %r11d,%r11d
  xor    %ebx,%ebx
  movslq %ecx,%rcx
L289:
  movsbl (%r9),%edi
  test   %dil,%dil
  je     L451
  lea    0x1(%r9),%rax
  xor    %edx,%edx
  nopl   0x0(%rax)
L331:
  lea    -0x9(%rdi),%r8d
  cmp    $0x4,%r8b
  jbe    L412
  cmp    $0x20,%dil
  jne    L413
L412:
  movsbl (%rax),%edi
  add    $0x1,%rax
  add    $0x1,%edx
  test   %dil,%dil
  jne    L331
  xor    %ebp,%ebp
  xor    %eax,%eax
  movslq %edx,%rdx
  jmp    L56
  nopl   0x0(%rax)
L421:
  movzbl (%r10,%rcx,1),%esi
L56:
  lea    -0x9(%rsi),%r8d
  mov    %ecx,%r12d
  add    $0x1,%rcx
  cmp    $0x4,%r8b
  jbe    L421
  mov    %esi,%r8d
  and    $0xffffffef,%r8d
  cmp    $0x20,%r8b
  je     L421
  jmp    L125
  nopl   (%rax)
L329:
  movsbl (%r9,%rdx,1),%edi
L125:
  mov    %edi,%ecx
  mov    %edx,%r8d
  add    $0x1,%rdx
  and    $0xffffffef,%ecx
  cmp    $0x20,%cl
  je     L329
  lea    -0x9(%rdi),%ecx
  cmp    $0x4,%cl
  jbe    L329
  lea    -0x30(%rsi),%edx
  lea    -0x30(%rdi),%ecx
  cmp    $0x9,%dl
  ja     L5
  cmp    $0x9,%cl
  ja     L5
  cmp    %eax,%ebx
  je     L356
  sub    %ebx,%eax
L36:
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
L20:
  movsbl (%rdi),%eax
  xor    %ecx,%ecx
  test   %al,%al
  je     L275
  nopw   0x0(%rax,%rax,1)
L151:
  movsbl (%r9,%rcx,1),%edx
  test   %dl,%dl
  je     L224
  cmp    %al,%dl
  je     L64
  lea    -0x41(%rax),%esi
  cmp    $0x19,%sil
  ja     L254
  lea    -0x61(%rdx),%esi
  cmp    $0x19,%sil
  jbe    L469
L224:
  sub    %edx,%eax
  ret
  nopw   0x0(%rax,%rax,1)
L254:
  lea    -0x61(%rax),%esi
  cmp    $0x19,%sil
  ja     L224
  lea    -0x41(%rdx),%esi
  cmp    $0x19,%sil
  ja     L224
  lea    -0x20(%rax),%esi
  cmp    %sil,%dl
  jne    L224
L64:
  add    $0x1,%rcx
  movsbl (%r10,%rcx,1),%eax
  test   %al,%al
  jne    L151
  movsbl (%r9,%rcx,1),%edx
  xor    %eax,%eax
  jmp    L224
  nopl   0x0(%rax,%rax,1)
L469:
  lea    -0x20(%rdx),%esi
  cmp    %sil,%al
  je     L64
  sub    %edx,%eax
  ret
L5:
  xor    %eax,%eax
  cmp    $0x9,%dl
  setbe  %al
  mov    %eax,%edx
  neg    %edx
  cmp    $0x2d,%r11b
  cmove  %edx,%eax
  xor    %edx,%edx
  cmp    $0x9,%cl
  setbe  %dl
  mov    %edx,%ecx
  neg    %ecx
  cmp    $0x2d,%bpl
  cmove  %ecx,%edx
  sub    %edx,%eax
  jmp    L36
L356:
  xor    %edx,%edx
  jmp    L386
  nopl   0x0(%rax)
L523:
  add    $0x1,%r12d
L209:
  movslq %r12d,%rax
  movzbl (%r10,%rax,1),%esi
  movslq %r8d,%rax
  movsbl (%r9,%rax,1),%edi
  test   %sil,%sil
  je     L82
  test   %dil,%dil
  je     L504
L386:
  lea    -0x9(%rsi),%eax
  cmp    $0x4,%al
  jbe    L523
  cmp    $0x20,%sil
  je     L523
  lea    -0x9(%rdi),%eax
  cmp    $0x4,%al
  jbe    L390
  cmp    $0x20,%dil
  jne    L109
L390:
  add    $0x1,%r8d
  jmp    L209
L109:
  lea    -0x30(%rsi),%ecx
  lea    -0x30(%rdi),%eax
  cmp    $0x9,%cl
  ja     L474
  cmp    $0x9,%al
  ja     L63
  test   %edx,%edx
  jne    L116
  movsbl %sil,%edx
  sub    %edi,%edx
L116:
  add    $0x1,%r12d
  jmp    L390
L504:
  sub    $0x30,%esi
  xor    %eax,%eax
  cmp    $0x9,%sil
  setbe  %al
L94:
  sub    $0x30,%edi
  xor    %ecx,%ecx
  cmp    $0x9,%dil
  setbe  %cl
  sub    %ecx,%eax
  cmove  %edx,%eax
L344:
  mov    %eax,%edx
  neg    %edx
  cmp    $0x2d,%r11b
  cmove  %edx,%eax
  jmp    L36
L82:
  xor    %eax,%eax
  jmp    L94
L413:
  xor    %eax,%eax
  cmp    $0x2d,%dil
  mov    %edi,%ebp
  sete   %al
  add    %eax,%edx
  movslq %edx,%rdx
  movsbl (%r9,%rdx,1),%edi
  jmp    L56
L104:
  xor    %ebx,%ebx
  cmp    $0x2d,%sil
  mov    %esi,%r11d
  sete   %bl
  add    %ebx,%ecx
  movslq %ecx,%rcx
  movzbl (%r10,%rcx,1),%esi
  jmp    L289
L350:
  xor    %r11d,%r11d
  xor    %ebx,%ebx
  xor    %ecx,%ecx
  jmp    L289
L451:
  xor    %ebp,%ebp
  xor    %eax,%eax
  xor    %edx,%edx
  jmp    L56
L275:
  movsbl (%rsi),%edx
  xor    %eax,%eax
  jmp    L224
L63:
  mov    $0x1,%eax
  jmp    L344
L474:
  cmp    $0xa,%al
  mov    $0xffffffff,%eax
  cmovae %edx,%eax
  jmp    L344
```

assistant: ```c
int mstrcmp(const char *str1, const char *str2, int f) {
  int i, j, f1, f2, n1, n2;
  if (f == 0)
    return strcmp(str1, str2);
  if (f == 1) {
    i = 0;
    while (str1[i] != 0 && str2[i] != 0 && (str1[i] == str2[i] || (((str1[i]) >= ('A') && (str1[i]) <= ('Z')) && ((str2[i]) >= ('a') && (str2[i]) <= ('z')) && (str1[i] - 'A' == str2[i] - 'a')) || (((str1[i]) >= ('a') && (str1[i]) <= ('z')) && ((str2[i]) >= ('A') && (str2[i]) <= ('Z')) && (str1[i] - 'a' == str2[i] - 'A'))))
      ++i;
    return str1[i] - ((int)str2[i]);
  }
  if (f == -1) {
    i = 0;
    j = 0;
    f = 0;
    while (str1[i] != 0 && ((str1[i]) == ' ' || (str1[i]) == '\r' || (str1[i]) == '\t' || (str1[i]) == '\n' || (str1[i]) == '\f' || (str1[i]) == '\v'))
      ++i;
    while (str2[j] != 0 && ((str2[j]) == ' ' || (str2[j]) == '\r' || (str2[j]) == '\t' || (str2[j]) == '\n' || (str2[j]) == '\f' || (str2[j]) == '\v'))
      ++j;
    i += n1 = str1[i] == '-';
    j += n2 = str2[j] == '-';
    while (str1[i] == '0' || ((str1[i]) == ' ' || (str1[i]) == '\r' || (str1[i]) == '\t' || (str1[i]) == '\n' || (str1[i]) == '\f' || (str1[i]) == '\v'))
      ++i;
    while (str2[j] == '0' || ((str2[j]) == ' ' || (str2[j]) == '\r' || (str2[j]) == '\t' || (str2[j]) == '\n' || (str2[j]) == '\f' || (str2[j]) == '\v'))
      ++j;
    f1 = ((str1[i]) >= ('0') && (str1[i]) <= ('9'));
    f2 = ((str2[j]) >= ('0') && (str2[j]) <= ('9'));
    if (!(f1 && f2))
      return (n1 ? -f1 : f1) - (n2 ? -f2 : f2);
    if (n1 ^ n2)
      return n2 - n1;
    f1 = 0;
    f2 = 0;
    while (str1[i] != 0 && str2[j] != 0) {
      if (((str1[i]) == ' ' || (str1[i]) == '\r' || (str1[i]) == '\t' || (str1[i]) == '\n' || (str1[i]) == '\f' || (str1[i]) == '\v')) {
        ++i;
        continue;
      }
      if (((str2[j]) == ' ' || (str2[j]) == '\r' || (str2[j]) == '\t' || (str2[j]) == '\n' || (str2[j]) == '\f' || (str2[j]) == '\v')) {
        ++j;
        continue;
      }
      if (((str1[i]) >= ('0') && (str1[i]) <= ('9')) && ((str2[j]) >= ('0') && (str2[j]) <= ('9')))
        (f) ? 0 : (f = (str1[i] - str2[j])), ++f1, ++f2, ++i, ++j;
      else
        return f1 += ((str1[i]) >= ('0') && (str1[i]) <= ('9')), f2 += ((str2[j]) >= ('0') && (str2[j]) <= ('9')), (((n2 = f1 - f2)) ? 0 : (n2 = f)), (n1 ? -n2 : n2);
    }
    return f1 += ((str1[i]) >= ('0') && (str1[i]) <= ('9')), f2 += ((str2[j]) >= ('0') && (str2[j]) <= ('9')), (((n2 = f1 - f2)) ? 0 : (n2 = f)), (n1 ? -n2 : n2);
  }
  return 0;
}
```