user: Please show me the C implementation that matches the assembly code listed below:

```asm
<memcpy>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  mov    %rdi,-0x98(%rbp)
  mov    %rsi,-0xa0(%rbp)
  mov    %edx,-0xa4(%rbp)
  mov    -0x98(%rbp),%rax
  mov    %rax,-0x58(%rbp)
  cmpl   $0x0,-0xa4(%rbp)
  jne    L98
  mov    -0x58(%rbp),%rax
  jmp    L72
L98:
  mov    -0x98(%rbp),%rax
  and    $0x1,%eax
  test   %rax,%rax
  je     L183
  mov    -0x98(%rbp),%rax
  mov    %rax,-0x50(%rbp)
  mov    -0xa0(%rbp),%rax
  mov    %rax,-0x48(%rbp)
  mov    -0x48(%rbp),%rdx
  lea    0x1(%rdx),%rax
  mov    %rax,-0x48(%rbp)
  mov    -0x50(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    %rcx,-0x50(%rbp)
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
  mov    -0x50(%rbp),%rax
  mov    %rax,-0x98(%rbp)
  mov    -0x48(%rbp),%rax
  mov    %rax,-0xa0(%rbp)
  subl   $0x1,-0xa4(%rbp)
L183:
  mov    -0xa0(%rbp),%rax
  and    $0x1,%eax
  test   %rax,%rax
  je     L91
  mov    -0x98(%rbp),%rax
  mov    %rax,-0x88(%rbp)
  mov    -0xa0(%rbp),%rax
  mov    %rax,-0x80(%rbp)
  jmp    L12
L13:
  mov    -0x80(%rbp),%rdx
  lea    0x1(%rdx),%rax
  mov    %rax,-0x80(%rbp)
  mov    -0x88(%rbp),%rax
  lea    0x1(%rax),%rcx
  mov    %rcx,-0x88(%rbp)
  movzbl (%rdx),%edx
  mov    %dl,(%rax)
  subl   $0x1,-0xa4(%rbp)
L12:
  cmpl   $0x0,-0xa4(%rbp)
  jne    L13
  mov    -0x58(%rbp),%rax
  jmp    L72
L91:
  cmpl   $0x2,-0xa4(%rbp)
  jbe    L107
  mov    -0x98(%rbp),%rax
  and    $0x2,%eax
  test   %rax,%rax
  je     L107
  mov    -0x98(%rbp),%rax
  mov    %rax,-0x40(%rbp)
  mov    -0xa0(%rbp),%rax
  mov    %rax,-0x38(%rbp)
  mov    -0x38(%rbp),%rdx
  lea    0x2(%rdx),%rax
  mov    %rax,-0x38(%rbp)
  mov    -0x40(%rbp),%rax
  lea    0x2(%rax),%rcx
  mov    %rcx,-0x40(%rbp)
  movzwl (%rdx),%edx
  mov    %dx,(%rax)
  mov    -0x40(%rbp),%rax
  mov    %rax,-0x98(%rbp)
  mov    -0x38(%rbp),%rax
  mov    %rax,-0xa0(%rbp)
  subl   $0x2,-0xa4(%rbp)
L107:
  mov    -0xa0(%rbp),%rax
  and    $0x2,%eax
  test   %rax,%rax
  je     L11
  mov    -0x98(%rbp),%rax
  mov    %rax,-0x78(%rbp)
  mov    -0xa0(%rbp),%rax
  mov    %rax,-0x70(%rbp)
  mov    -0xa4(%rbp),%eax
  shr    %eax
  mov    %eax,-0x8c(%rbp)
  jmp    L103
L86:
  mov    -0x70(%rbp),%rdx
  lea    0x2(%rdx),%rax
  mov    %rax,-0x70(%rbp)
  mov    -0x78(%rbp),%rax
  lea    0x2(%rax),%rcx
  mov    %rcx,-0x78(%rbp)
  movzwl (%rdx),%edx
  mov    %dx,(%rax)
  subl   $0x1,-0x8c(%rbp)
L103:
  cmpl   $0x0,-0x8c(%rbp)
  jne    L86
  mov    -0x78(%rbp),%rax
  mov    %rax,-0x98(%rbp)
  mov    -0x70(%rbp),%rax
  mov    %rax,-0xa0(%rbp)
  mov    -0xa4(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L51
  mov    -0x98(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0xa0(%rbp),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x8(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x10(%rbp),%rax
  mov    %dl,(%rax)
L51:
  mov    -0x58(%rbp),%rax
  jmp    L72
L11:
  mov    -0xa4(%rbp),%eax
  shr    $0x2,%eax
  mov    %eax,-0x8c(%rbp)
  cmpl   $0x0,-0x8c(%rbp)
  je     L163
  mov    -0x98(%rbp),%rax
  mov    %rax,-0x68(%rbp)
  mov    -0xa0(%rbp),%rax
  mov    %rax,-0x60(%rbp)
  jmp    L131
L52:
  mov    -0x60(%rbp),%rdx
  lea    0x8(%rdx),%rax
  mov    %rax,-0x60(%rbp)
  mov    -0x68(%rbp),%rax
  lea    0x8(%rax),%rcx
  mov    %rcx,-0x68(%rbp)
  mov    (%rdx),%rdx
  mov    %rdx,(%rax)
  subl   $0x1,-0x8c(%rbp)
L131:
  cmpl   $0x0,-0x8c(%rbp)
  jne    L52
  mov    -0x68(%rbp),%rax
  mov    %rax,-0x98(%rbp)
  mov    -0x60(%rbp),%rax
  mov    %rax,-0xa0(%rbp)
L163:
  mov    -0xa4(%rbp),%eax
  and    $0x2,%eax
  test   %eax,%eax
  je     L164
  mov    -0x98(%rbp),%rax
  mov    %rax,-0x30(%rbp)
  mov    -0xa0(%rbp),%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x28(%rbp),%rdx
  lea    0x2(%rdx),%rax
  mov    %rax,-0x28(%rbp)
  mov    -0x30(%rbp),%rax
  lea    0x2(%rax),%rcx
  mov    %rcx,-0x30(%rbp)
  movzwl (%rdx),%edx
  mov    %dx,(%rax)
  mov    -0x30(%rbp),%rax
  mov    %rax,-0x98(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,-0xa0(%rbp)
L164:
  mov    -0xa4(%rbp),%eax
  and    $0x1,%eax
  test   %eax,%eax
  je     L40
  mov    -0x98(%rbp),%rax
  mov    %rax,-0x20(%rbp)
  mov    -0xa0(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  movzbl (%rax),%edx
  mov    -0x20(%rbp),%rax
  mov    %dl,(%rax)
L40:
  mov    -0x58(%rbp),%rax
L72:
  leave
  ret
```

assistant: ```c
void *memcpy(void *to, const void *from, unsigned int n) {
  void *xto = to;
  unsigned int temp;
  if (!n)
    return xto;
  if ((long)to & 1) {
    char *cto = to;
    const char *cfrom = from;
    *cto++ = *cfrom++;
    to = cto;
    from = cfrom;
    n--;
  }
  if ((long)from & 1) {
    char *cto = to;
    const char *cfrom = from;
    for (; n; n--)
      *cto++ = *cfrom++;
    return xto;
  }
  if (n > 2 && (long)to & 2) {
    short *sto = to;
    const short *sfrom = from;
    *sto++ = *sfrom++;
    to = sto;
    from = sfrom;
    n -= 2;
  }
  if ((long)from & 2) {
    short *sto = to;
    const short *sfrom = from;
    temp = n >> 1;
    for (; temp; temp--)
      *sto++ = *sfrom++;
    to = sto;
    from = sfrom;
    if (n & 1) {
      char *cto = to;
      const char *cfrom = from;
      *cto = *cfrom;
    }
    return xto;
  }
  temp = n >> 2;
  if (temp) {
    long *lto = to;
    const long *lfrom = from;
    for (; temp; temp--)
      *lto++ = *lfrom++;
    to = lto;
    from = lfrom;
  }
  if (n & 2) {
    short *sto = to;
    const short *sfrom = from;
    *sto++ = *sfrom++;
    to = sto;
    from = sfrom;
  }
  if (n & 1) {
    char *cto = to;
    const char *cfrom = from;
    *cto = *cfrom;
  }
  return xto;
}
```