user: 下面的汇编指令对应的C源代码是什么：

```asm
<memcpy>:
  endbr64
  mov    %rdi,%rax
  mov    %rdi,%r8
  mov    %rsi,%rcx
  or     %rsi,%rax
  or     %rdx,%rax
  and    $0x7,%eax
  jne    L191
  mov    %rdx,%rdi
  shr    $0x3,%rdi
  je     L132
  lea    -0x1(%rdi),%rsi
  cmp    $0x2,%rsi
  jbe    L149
  lea    0x8(%rcx),%rsi
  cmp    %rsi,%r8
  je     L149
  mov    %rdx,%rsi
  and    $0xfffffffffffffff0,%rdx
  shr    $0x4,%rsi
  nopw   0x0(%rax,%rax,1)
L108:
  movdqu (%rcx,%rax,1),%xmm1
  movups %xmm1,(%r8,%rax,1)
  add    $0x10,%rax
  cmp    %rdx,%rax
  jne    L108
  mov    %rsi,%rax
  lea    (%rsi,%rsi,1),%rdx
  shl    $0x4,%rax
  add    %rax,%rcx
  add    %r8,%rax
  cmp    %rdx,%rdi
  je     L132
  mov    (%rcx),%rdx
  mov    %rdx,(%rax)
L132:
  mov    %r8,%rax
  ret
  nopl   0x0(%rax,%rax,1)
L191:
  test   %rdx,%rdx
  je     L132
  lea    0x1(%rsi),%rdi
  mov    %r8,%rsi
  lea    -0x1(%rdx),%rax
  sub    %rdi,%rsi
  cmp    $0xe,%rsi
  jbe    L10
  cmp    $0x6,%rax
  jbe    L10
  cmp    $0xe,%rax
  jbe    L69
  mov    %rdx,%rsi
  xor    %eax,%eax
  and    $0xfffffffffffffff0,%rsi
  nopw   0x0(%rax,%rax,1)
L179:
  movdqu (%rcx,%rax,1),%xmm0
  movups %xmm0,(%r8,%rax,1)
  add    $0x10,%rax
  cmp    %rsi,%rax
  jne    L179
  mov    %rdx,%rax
  and    $0xfffffffffffffff0,%rax
  lea    (%rcx,%rax,1),%rdi
  lea    (%r8,%rax,1),%rsi
  cmp    %rax,%rdx
  je     L132
  mov    %rdx,%r9
  sub    %rax,%r9
  lea    -0x1(%r9),%r10
  cmp    $0x6,%r10
  jbe    L176
L162:
  mov    (%rcx,%rax,1),%rcx
  mov    %rcx,(%r8,%rax,1)
  mov    %r9,%rcx
  and    $0xfffffffffffffff8,%rcx
  add    %rcx,%rax
  add    %rcx,%rdi
  add    %rcx,%rsi
  cmp    %r9,%rcx
  je     L132
L176:
  movzbl (%rdi),%ecx
  mov    %cl,(%rsi)
  lea    0x1(%rax),%rcx
  cmp    %rcx,%rdx
  jbe    L132
  movzbl 0x1(%rdi),%ecx
  mov    %cl,0x1(%rsi)
  lea    0x2(%rax),%rcx
  cmp    %rdx,%rcx
  jae    L132
  movzbl 0x2(%rdi),%ecx
  mov    %cl,0x2(%rsi)
  lea    0x3(%rax),%rcx
  cmp    %rcx,%rdx
  jbe    L132
  movzbl 0x3(%rdi),%ecx
  mov    %cl,0x3(%rsi)
  lea    0x4(%rax),%rcx
  cmp    %rcx,%rdx
  jbe    L132
  movzbl 0x4(%rdi),%ecx
  mov    %cl,0x4(%rsi)
  lea    0x5(%rax),%rcx
  cmp    %rcx,%rdx
  jbe    L132
  movzbl 0x5(%rdi),%ecx
  add    $0x6,%rax
  mov    %cl,0x5(%rsi)
  cmp    %rax,%rdx
  jbe    L132
  movzbl 0x6(%rdi),%eax
  mov    %al,0x6(%rsi)
  mov    %r8,%rax
  ret
  nopl   0x0(%rax)
L149:
  mov    (%rcx,%rax,8),%rdx
  mov    %rdx,(%r8,%rax,8)
  add    $0x1,%rax
  cmp    %rax,%rdi
  jne    L149
  jmp    L132
  xchg   %ax,%ax
L10:
  xor    %eax,%eax
  nopw   0x0(%rax,%rax,1)
L187:
  movzbl (%rcx,%rax,1),%esi
  mov    %sil,(%r8,%rax,1)
  add    $0x1,%rax
  cmp    %rax,%rdx
  jne    L187
  mov    %r8,%rax
  ret
L69:
  mov    %rdx,%r9
  mov    %r8,%rsi
  mov    %rcx,%rdi
  xor    %eax,%eax
  jmp    L162
```

assistant: ```c
void *memcpy(void *d, const void *s, size_t n) {
  size_t i;
  uintptr_t align = sizeof(uintptr_t) - 1;
  if (((uintptr_t)d & align) || ((uintptr_t)s & align) || (n & align)) {
    char *bs = (char *)s;
    char *bd = (char *)d;
    for (i = 0; i < n; i++)
      *bd++ = *bs++;
  } else {
    uintptr_t *ws = (uintptr_t *)s;
    uintptr_t *wd = (uintptr_t *)d;
    n /= sizeof(uintptr_t);
    for (i = 0; i < n; i++)
      *wd++ = *ws++;
  }
  return d;
}
```