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

```asm
<memcpy>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    -0x30(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  jmp    L108
L117:
  mov    -0x38(%rbp),%rax
  lea    -0x1(%rax),%rdx
  mov    %rdx,-0x38(%rbp)
  test   %rax,%rax
  je     L50
  mov    -0x20(%rbp),%rdx
  lea    0x1(%rdx),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    %rcx,-0x10(%rbp)
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
  jmp    L108
L50:
  mov    -0x28(%rbp),%rax
  jmp    L85
L108:
  mov    -0x10(%rbp),%rax
  and    $0x7,%eax
  test   %rax,%rax
  jne    L117
  cmpq   $0x7,-0x38(%rbp)
  jbe    L11
  mov    -0x10(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x20(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  jmp    L37
L44:
  mov    -0x18(%rbp),%rdx
  lea    0x8(%rdx),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x8(%rbp),%rax
  lea    0x8(%rax),%rcx
  mov    %rcx,-0x8(%rbp)
  mov    (%rdx),%rdx
  mov    %rdx,(%rax)
  mov    -0x18(%rbp),%rdx
  lea    0x8(%rdx),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x8(%rbp),%rax
  lea    0x8(%rax),%rcx
  mov    %rcx,-0x8(%rbp)
  mov    (%rdx),%rdx
  mov    %rdx,(%rax)
  mov    -0x18(%rbp),%rdx
  lea    0x8(%rdx),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x8(%rbp),%rax
  lea    0x8(%rax),%rcx
  mov    %rcx,-0x8(%rbp)
  mov    (%rdx),%rdx
  mov    %rdx,(%rax)
  mov    -0x18(%rbp),%rdx
  lea    0x8(%rdx),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x8(%rbp),%rax
  lea    0x8(%rax),%rcx
  mov    %rcx,-0x8(%rbp)
  mov    (%rdx),%rdx
  mov    %rdx,(%rax)
  subq   $0x20,-0x38(%rbp)
L37:
  cmpq   $0x1f,-0x38(%rbp)
  ja     L44
  jmp    L113
L56:
  mov    -0x18(%rbp),%rdx
  lea    0x8(%rdx),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x8(%rbp),%rax
  lea    0x8(%rax),%rcx
  mov    %rcx,-0x8(%rbp)
  mov    (%rdx),%rdx
  mov    %rdx,(%rax)
  subq   $0x8,-0x38(%rbp)
L113:
  cmpq   $0x7,-0x38(%rbp)
  ja     L56
  mov    -0x8(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  jmp    L11
L14:
  mov    -0x20(%rbp),%rdx
  lea    0x1(%rdx),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x10(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    %rcx,-0x10(%rbp)
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
L11:
  mov    -0x38(%rbp),%rax
  lea    -0x1(%rax),%rdx
  mov    %rdx,-0x38(%rbp)
  test   %rax,%rax
  jne    L14
  mov    -0x28(%rbp),%rax
L85:
  pop    %rbp
  ret
```

assistant: ```c
void *memcpy(void *restrict dest, const void *restrict src, size_t count) {
  const char *s = (const char *)src;
  const unsigned long *ns;
  char *d = (char *)dest;
  unsigned long *nd;
  while ((uintptr_t)d & (sizeof(unsigned long) - 1)) {
    if (count--) {
      *d++ = *s++;
    } else {
      return dest;
    }
  }
  if (count >= sizeof(unsigned long)) {
    nd = (unsigned long *)d;
    ns = (const unsigned long *)s;
    while (count >= (sizeof(unsigned long) * 4)) {
      *nd++ = *ns++;
      *nd++ = *ns++;
      *nd++ = *ns++;
      *nd++ = *ns++;
      count -= sizeof(unsigned long) * 4;
    }
    while (count >= sizeof(unsigned long)) {
      *nd++ = *ns++;
      count -= sizeof(unsigned long);
    }
    d = (char *)nd;
    s = (const char *)ns;
  }
  while (count--)
    *d++ = *s++;
  return dest;
}
```