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

```asm
<memcpy>:
  endbr64
  mov    %rdi,%r9
  mov    %rsi,%rax
  mov    %rdx,%r8
  cmp    $0x1f,%rdx
  jbe    L61
  mov    %rdi,%rcx
  or     %rsi,%rcx
  and    $0x7,%ecx
  jne    L158
  lea    0x1f(%rdi),%rdx
  lea    -0x20(%r8),%rdi
  sub    %rsi,%rdx
  cmp    $0x3e,%rdx
  jbe    L84
  mov    %rdi,%rsi
  xor    %edx,%edx
  shr    $0x5,%rsi
  add    $0x1,%rsi
  nopl   0x0(%rax,%rax,1)
L154:
  movdqu 0x10(%rax,%rdx,1),%xmm0
  movdqu (%rax,%rdx,1),%xmm2
  add    $0x1,%rcx
  movups %xmm2,(%r9,%rdx,1)
  movups %xmm0,0x10(%r9,%rdx,1)
  add    $0x20,%rdx
  cmp    %rsi,%rcx
  jb     L154
L39:
  and    $0xffffffffffffffe0,%rdi
  mov    %r8,%rcx
  lea    0x20(%rdi),%r10
  and    $0x1f,%ecx
  add    %r10,%rax
  add    %r9,%r10
  test   $0x18,%r8b
  je     L58
  mov    (%rax),%rdx
  mov    %rdx,(%r10)
  lea    -0x8(%rcx),%rdx
  cmp    $0x7,%rdx
  jbe    L140
  mov    0x8(%rax),%rsi
  sub    $0x10,%rcx
  mov    %rsi,0x8(%r10)
  cmp    $0x7,%rcx
  jbe    L140
  mov    0x10(%rax),%rcx
  mov    %rcx,0x10(%r10)
L140:
  shr    $0x3,%rdx
  and    $0x7,%r8d
  lea    0x8(,%rdx,8),%rdx
  lea    -0x1(%r8),%rdi
  add    %rdx,%r10
  add    %rdx,%rax
  test   %r8,%r8
  jne    L155
L231:
  mov    %r9,%rax
  ret
  xchg   %ax,%ax
L61:
  mov    %rdi,%r10
L278:
  lea    -0x1(%r8),%rdi
  test   %r8,%r8
  je     L231
L155:
  lea    0x1(%rax),%rcx
  mov    %r10,%rdx
  sub    %rcx,%rdx
  cmp    $0xe,%rdx
  jbe    L6
  cmp    $0x6,%rdi
  jbe    L6
  cmp    $0xe,%rdi
  jbe    L217
L111:
  lea    -0x10(%r8),%rdx
  xor    %esi,%esi
  shr    $0x4,%rdx
  lea    0x1(%rdx),%rcx
  xor    %edx,%edx
  nopl   0x0(%rax)
L236:
  movdqu (%rax,%rdx,1),%xmm1
  add    $0x1,%rsi
  movups %xmm1,(%r10,%rdx,1)
  add    $0x10,%rdx
  cmp    %rsi,%rcx
  ja     L236
  shl    $0x4,%rcx
  mov    %rcx,%rdx
  lea    (%r10,%rcx,1),%rsi
  lea    (%rax,%rcx,1),%r11
  sub    %rcx,%rdi
  mov    %rdi,%rcx
  cmp    %rdx,%r8
  je     L231
  lea    0x1(%rdi),%r8
  cmp    $0x6,%rdi
  jbe    L14
L264:
  mov    (%rax,%rdx,1),%rax
  mov    %rax,(%r10,%rdx,1)
  mov    %r8,%rax
  and    $0xfffffffffffffff8,%rax
  add    %rax,%rsi
  add    %rax,%r11
  sub    %rax,%rcx
  cmp    %r8,%rax
  je     L231
L14:
  movzbl (%r11),%eax
  mov    %al,(%rsi)
  test   %rcx,%rcx
  je     L231
  movzbl 0x1(%r11),%eax
  mov    %al,0x1(%rsi)
  cmp    $0x1,%rcx
  je     L231
  movzbl 0x2(%r11),%eax
  mov    %al,0x2(%rsi)
  cmp    $0x2,%rcx
  je     L231
  movzbl 0x3(%r11),%eax
  mov    %al,0x3(%rsi)
  cmp    $0x3,%rcx
  je     L231
  movzbl 0x4(%r11),%eax
  mov    %al,0x4(%rsi)
  cmp    $0x4,%rcx
  je     L231
  movzbl 0x5(%r11),%eax
  mov    %al,0x5(%rsi)
  cmp    $0x5,%rcx
  je     L231
  movzbl 0x6(%r11),%eax
  mov    %al,0x6(%rsi)
  mov    %r9,%rax
  ret
  nopl   0x0(%rax)
L158:
  lea    -0x1(%rdx),%rdi
  lea    0x1(%rsi),%rcx
  mov    %r9,%rdx
  mov    %r9,%r10
  sub    %rcx,%rdx
  cmp    $0xe,%rdx
  ja     L111
L6:
  xor    %edx,%edx
  nopl   (%rax)
L139:
  movzbl (%rax,%rdx,1),%ecx
  mov    %cl,(%r10,%rdx,1)
  mov    %rdx,%rcx
  add    $0x1,%rdx
  cmp    %rcx,%rdi
  jne    L139
  mov    %r9,%rax
  ret
L217:
  mov    %rdi,%rcx
  mov    %rax,%r11
  mov    %r10,%rsi
  xor    %edx,%edx
  jmp    L264
L58:
  mov    %rcx,%r8
  jmp    L278
L84:
  mov    %rdi,%rdx
  mov    %rsi,%rcx
  and    $0xffffffffffffffe0,%rdx
  lea    0x20(%r9,%rdx,1),%r10
  mov    %r9,%rdx
  nopw   0x0(%rax,%rax,1)
L132:
  mov    (%rcx),%rsi
  add    $0x20,%rcx
  add    $0x20,%rdx
  mov    %rsi,-0x20(%rdx)
  mov    -0x18(%rcx),%rsi
  mov    %rsi,-0x18(%rdx)
  mov    -0x10(%rcx),%rsi
  mov    %rsi,-0x10(%rdx)
  mov    -0x8(%rcx),%rsi
  mov    %rsi,-0x8(%rdx)
  cmp    %r10,%rdx
  jne    L132
  jmp    L39
```

assistant: ```c
void *memcpy(void *dst0, const void *src0, size_t len0) {
  char *dst = dst0;
  const char *src = src0;
  long *aligned_dst;
  const long *aligned_src;
  if (!((len0) < (sizeof(long) << 2)) && !(((long)src & (sizeof(long) - 1)) | ((long)dst & (sizeof(long) - 1)))) {
    aligned_dst = (long *)dst;
    aligned_src = (long *)src;
    while (len0 >= (sizeof(long) << 2)) {
      *aligned_dst++ = *aligned_src++;
      *aligned_dst++ = *aligned_src++;
      *aligned_dst++ = *aligned_src++;
      *aligned_dst++ = *aligned_src++;
      len0 -= (sizeof(long) << 2);
    }
    while (len0 >= (sizeof(long))) {
      *aligned_dst++ = *aligned_src++;
      len0 -= (sizeof(long));
    }
    dst = (char *)aligned_dst;
    src = (char *)aligned_src;
  }
  while (len0--)
    *dst++ = *src++;
  return dst0;
}
```