user: What is the c source code of the assembly code below?

```asm
<SplitFN>:
  endbr64
  push   %r12
  mov    %rsi,%r12
  push   %rbp
  mov    %rdx,%rbp
  push   %rbx
  mov    %rdi,%rbx
  mov    %rdx,%rdi
  call   <strlen@plt>
  test   %eax,%eax
  je     L114
  mov    %rax,%rsi
  mov    %eax,%edi
  test   %rbx,%rbx
  je     L334
  movb   $0x0,(%rbx)
L334:
  test   %r12,%r12
  je     L337
  movb   $0x0,(%r12)
L337:
  test   %esi,%esi
  jle    L346
  movabs $0xffffdffffffff7fe,%r10
  xor    %eax,%eax
  xor    %r8d,%r8d
  test   %rbx,%rbx
  je     L306
  nopl   0x0(%rax,%rax,1)
L302:
  movzbl 0x0(%rbp,%rax,1),%edx
  lea    -0x2f(%rdx),%ecx
  cmp    $0x2d,%cl
  ja     L245
  mov    %r10,%r11
  lea    0x1(%rax),%r9d
  sar    %cl,%r11
  mov    %r11,%rcx
  and    $0x1,%ecx
  cmove  %r9d,%r8d
L245:
  mov    %dl,(%rbx,%rax,1)
  add    $0x1,%rax
  cmp    %eax,%edi
  jg     L302
  movslq %esi,%rax
  movb   $0x0,(%rbx,%rax,1)
  test   %r8d,%r8d
  je     L5
L184:
  cmp    %r8d,%esi
  jle    L219
  test   %r12,%r12
  je     L211
  movslq %r8d,%rax
  mov    %esi,%ecx
  mov    %r12,%r9
  lea    0x1(%rbp,%rax,1),%r10
  sub    %r8d,%ecx
  sub    %r10,%r9
  lea    -0x1(%rcx),%edx
  cmp    $0xe,%r9
  jbe    L77
  cmp    $0x6,%edx
  jbe    L77
  cmp    $0xe,%edx
  jbe    L101
  mov    %ecx,%edi
  lea    0x0(%rbp,%rax,1),%rdx
  xor    %eax,%eax
  shr    $0x4,%edi
  shl    $0x4,%rdi
L67:
  movdqu (%rdx,%rax,1),%xmm0
  movups %xmm0,(%r12,%rax,1)
  add    $0x10,%rax
  cmp    %rdi,%rax
  jne    L67
  mov    %ecx,%edi
  and    $0xfffffff0,%edi
  mov    %edi,%r10d
  lea    (%r8,%rdi,1),%r9d
  cmp    %edi,%ecx
  je     L105
  mov    %ecx,%r11d
  sub    %edi,%r11d
  lea    -0x1(%r11),%eax
  cmp    $0x6,%eax
  jbe    L139
L146:
  mov    (%rdx,%rdi,1),%rax
  mov    %rax,(%r12,%rdi,1)
  mov    %r11d,%eax
  and    $0xfffffff8,%eax
  add    %eax,%r10d
  add    %eax,%r9d
  cmp    %eax,%r11d
  je     L105
L139:
  movslq %r9d,%rax
  movzbl 0x0(%rbp,%rax,1),%edx
  movslq %r10d,%rax
  mov    %dl,(%r12,%rax,1)
  lea    0x1(%r9),%eax
  lea    0x1(%r10),%edx
  cmp    %esi,%eax
  jge    L105
  cltq
  movslq %edx,%rdx
  movzbl 0x0(%rbp,%rax,1),%eax
  mov    %al,(%r12,%rdx,1)
  lea    0x2(%r9),%eax
  lea    0x2(%r10),%edx
  cmp    %eax,%esi
  jle    L105
  cltq
  movslq %edx,%rdx
  movzbl 0x0(%rbp,%rax,1),%eax
  mov    %al,(%r12,%rdx,1)
  lea    0x3(%r9),%eax
  lea    0x3(%r10),%edx
  cmp    %esi,%eax
  jge    L105
  cltq
  movslq %edx,%rdx
  movzbl 0x0(%rbp,%rax,1),%eax
  mov    %al,(%r12,%rdx,1)
  lea    0x4(%r9),%eax
  lea    0x4(%r10),%edx
  cmp    %eax,%esi
  jle    L105
  cltq
  movslq %edx,%rdx
  movzbl 0x0(%rbp,%rax,1),%eax
  mov    %al,(%r12,%rdx,1)
  lea    0x5(%r9),%eax
  lea    0x5(%r10),%edx
  cmp    %eax,%esi
  jle    L105
  cltq
  movslq %edx,%rdx
  add    $0x6,%r9d
  add    $0x6,%r10d
  movzbl 0x0(%rbp,%rax,1),%eax
  mov    %al,(%r12,%rdx,1)
  cmp    %r9d,%esi
  jle    L105
  movslq %r9d,%r9
  movslq %r10d,%r10
  movzbl 0x0(%rbp,%r9,1),%eax
  mov    %al,(%r12,%r10,1)
L105:
  movslq %ecx,%rcx
  movb   $0x0,(%r12,%rcx,1)
L211:
  test   %rbx,%rbx
  je     L18
  movslq %r8d,%rax
  movb   $0x0,(%rbx,%rax,1)
  pop    %rbx
  mov    %r8d,%eax
  pop    %rbp
  pop    %r12
  ret
  nopl   0x0(%rax)
L306:
  mov    %rbp,%rdx
  mov    %r10,%r9
  xchg   %ax,%ax
L179:
  movzbl (%rdx),%ecx
  add    $0x1,%eax
  sub    $0x2f,%ecx
  cmp    $0x2d,%cl
  ja     L117
  mov    %r9,%r10
  sar    %cl,%r10
  mov    %r10,%rcx
  and    $0x1,%ecx
  cmove  %eax,%r8d
L117:
  add    $0x1,%rdx
  cmp    %eax,%edi
  jg     L179
  test   %r8d,%r8d
  jne    L184
  nop
L114:
  xor    %r8d,%r8d
L18:
  pop    %rbx
  mov    %r8d,%eax
  pop    %rbp
  pop    %r12
  ret
  nopl   0x0(%rax,%rax,1)
L346:
  test   %rbx,%rbx
  je     L114
  movb   $0x0,(%rbx)
L5:
  test   %r12,%r12
  je     L125
  test   %rbx,%rbx
  je     L125
  mov    %rbx,%rsi
  mov    %r12,%rdi
  call   <strcpy@plt>
L125:
  xor    %r8d,%r8d
  movb   $0x0,(%rbx)
  pop    %rbx
  mov    %r8d,%eax
  pop    %rbp
  pop    %r12
  ret
L77:
  mov    %r12,%rsi
  sub    %rax,%rsi
  nopl   0x0(%rax)
L103:
  movzbl 0x0(%rbp,%rax,1),%edx
  mov    %dl,(%rsi,%rax,1)
  add    $0x1,%rax
  cmp    %eax,%edi
  jg     L103
  jmp    L105
L219:
  test   %r12,%r12
  je     L211
  xor    %ecx,%ecx
  jmp    L105
L101:
  mov    %ecx,%r11d
  mov    %r8d,%r9d
  xor    %edi,%edi
  xor    %r10d,%r10d
  lea    0x0(%rbp,%rax,1),%rdx
  jmp    L146
```

assistant: ```c
int SplitFN(char *lpdir, char *lpfil, char *lpext) {
  int i, j, k, l;
  char c;
  k = 0;
  i = (int)strlen(lpext);
  if (i) {
    if (lpdir)
      *lpdir = 0;
    if (lpfil)
      *lpfil = 0;
    for (j = 0; j < i; j++) {
      c = lpext[j];
      if ((c == ':') || (c == '\\') || (c == '/')) {
        k = j + 1;
      }
      if (lpdir)
        lpdir[j] = c;
    }
    if (lpdir)
      lpdir[j] = 0;
    if (k) {
      j = 0;
      for (l = k; l < i; l++) {
        c = lpext[l];
        if (lpfil)
          lpfil[j] = c;
        j++;
      }
      if (lpfil)
        lpfil[j] = 0;
      if (lpdir)
        lpdir[k] = 0;
    } else {
      if (lpfil && lpdir)
        strcpy(lpfil, lpdir);
      if (lpdir)
        *lpdir = 0;
    }
  }
  return k;
}
```