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

```asm
<memmove>:
  endbr64
  mov    %rsi,%rcx
  mov    %rdx,%rsi
  mov    %rdi,%rax
  mov    %ecx,%edx
  or     %esi,%edx
  or     %edi,%edx
  and    $0x3,%edx
  jne    L209
  mov    %rsi,%r8
  shr    $0x2,%r8
  lea    -0x1(%r8),%rdi
  cmp    %rcx,%rax
  jae    L293
  test   %r8,%r8
  je     L273
  lea    0x4(%rcx),%r9
  mov    %rax,%rdx
  sub    %r9,%rdx
  cmp    $0x8,%rdx
  jbe    L245
  cmp    $0x2,%rdi
  jbe    L245
  mov    %rsi,%r9
  xor    %edx,%edx
  and    $0xfffffffffffffff0,%rsi
  shr    $0x4,%r9
  nopl   0x0(%rax)
L72:
  movdqu (%rcx,%rdx,1),%xmm0
  movups %xmm0,(%rax,%rdx,1)
  add    $0x10,%rdx
  cmp    %rsi,%rdx
  jne    L72
  lea    0x0(,%r9,4),%r10
  mov    %r9,%rdx
  shl    $0x4,%rdx
  sub    %r10,%rdi
  lea    (%rax,%rdx,1),%rsi
  add    %rdx,%rcx
  mov    %rdi,%rdx
  cmp    %r10,%r8
  je     L273
  mov    (%rcx),%edi
  mov    %edi,(%rsi)
  test   %rdx,%rdx
  je     L273
  mov    0x4(%rcx),%edi
  mov    %edi,0x4(%rsi)
  cmp    $0x1,%rdx
  je     L273
  mov    0x8(%rcx),%edx
  mov    %edx,0x8(%rsi)
  ret
  nopl   0x0(%rax,%rax,1)
L209:
  lea    -0x1(%rsi),%rdx
  cmp    %rcx,%rdi
  jae    L210
  test   %rsi,%rsi
  je     L273
  lea    0x1(%rcx),%r8
  sub    %r8,%rdi
  cmp    $0xe,%rdi
  jbe    L298
  cmp    $0x6,%rdx
  jbe    L298
  cmp    $0xe,%rdx
  jbe    L139
  mov    %rsi,%r8
  xor    %edi,%edi
  and    $0xfffffffffffffff0,%r8
  nopl   0x0(%rax)
L48:
  movdqu (%rcx,%rdi,1),%xmm2
  movups %xmm2,(%rax,%rdi,1)
  add    $0x10,%rdi
  cmp    %r8,%rdi
  jne    L48
  mov    %rsi,%rdi
  and    $0xfffffffffffffff0,%rdi
  lea    (%rax,%rdi,1),%r8
  lea    (%rcx,%rdi,1),%r9
  sub    %rdi,%rdx
  cmp    %rdi,%rsi
  je     L273
  sub    %rdi,%rsi
  lea    -0x1(%rsi),%r10
  cmp    $0x6,%r10
  jbe    L142
L287:
  mov    (%rcx,%rdi,1),%rcx
  mov    %rcx,(%rax,%rdi,1)
  mov    %rsi,%rcx
  and    $0xfffffffffffffff8,%rcx
  add    %rcx,%r8
  add    %rcx,%r9
  sub    %rcx,%rdx
  cmp    %rcx,%rsi
  je     L273
L142:
  movzbl (%r9),%ecx
  mov    %cl,(%r8)
  test   %rdx,%rdx
  je     L273
  movzbl 0x1(%r9),%ecx
  mov    %cl,0x1(%r8)
  cmp    $0x1,%rdx
  je     L273
  movzbl 0x2(%r9),%ecx
  mov    %cl,0x2(%r8)
  cmp    $0x2,%rdx
  je     L273
  movzbl 0x3(%r9),%ecx
  mov    %cl,0x3(%r8)
  cmp    $0x3,%rdx
  je     L273
  movzbl 0x4(%r9),%ecx
  mov    %cl,0x4(%r8)
  cmp    $0x4,%rdx
  je     L273
  movzbl 0x5(%r9),%ecx
  mov    %cl,0x5(%r8)
  cmp    $0x5,%rdx
  je     L273
  movzbl 0x6(%r9),%edx
  mov    %dl,0x6(%r8)
  ret
  nopl   0x0(%rax)
L210:
  test   %rsi,%rsi
  je     L273
  nopl   0x0(%rax)
L193:
  movzbl (%rcx,%rdx,1),%esi
  mov    %sil,(%rax,%rdx,1)
  sub    $0x1,%rdx
  jae    L193
  ret
  nopw   0x0(%rax,%rax,1)
L293:
  push   %rbx
  lea    0x0(,%r8,4),%rbx
  test   %r8,%r8
  je     L195
  mov    %rax,%rdx
  sub    %rcx,%rdx
  add    $0xc,%rdx
  cmp    $0x8,%rdx
  jbe    L124
  cmp    $0x2,%rdi
  jbe    L124
  shr    $0x4,%rsi
  lea    -0x10(%rbx),%r9
  xor    %edx,%edx
  mov    %rsi,%r10
  lea    (%rcx,%r9,1),%r11
  add    %rax,%r9
  neg    %r10
  shl    $0x4,%r10
  nopl   0x0(%rax,%rax,1)
L220:
  movdqu (%r11,%rdx,1),%xmm1
  movups %xmm1,(%r9,%rdx,1)
  sub    $0x10,%rdx
  cmp    %r10,%rdx
  jne    L220
  shl    $0x2,%rsi
  mov    %rsi,%rdx
  sub    %rsi,%rdi
  neg    %rdx
  lea    (%rbx,%rdx,4),%r9
  mov    %rdi,%rdx
  cmp    %rsi,%r8
  je     L195
  lea    -0x4(%r9),%rsi
  add    %rsi,%rcx
  add    %rax,%rsi
  mov    (%rcx),%edi
  mov    %edi,(%rsi)
  test   %rdx,%rdx
  je     L195
  mov    -0x4(%rcx),%edi
  mov    %edi,-0x4(%rsi)
  cmp    $0x1,%rdx
  je     L195
  mov    -0x8(%rcx),%edx
  mov    %edx,-0x8(%rsi)
L195:
  pop    %rbx
  ret
  nopl   0x0(%rax)
L124:
  mov    (%rcx,%rdi,4),%edx
  mov    %edx,(%rax,%rdi,4)
  sub    $0x1,%rdi
  jb     L195
  mov    (%rcx,%rdi,4),%edx
  mov    %edx,(%rax,%rdi,4)
  sub    $0x1,%rdi
  jae    L124
  jmp    L195
  nopw   0x0(%rax,%rax,1)
L273:
  ret
  nopl   0x0(%rax)
L245:
  shl    $0x2,%r8
  xor    %edx,%edx
  xchg   %ax,%ax
L345:
  mov    (%rcx,%rdx,1),%esi
  mov    %esi,(%rax,%rdx,1)
  add    $0x4,%rdx
  cmp    %r8,%rdx
  jne    L345
  ret
L298:
  xor    %edx,%edx
  nopw   0x0(%rax,%rax,1)
L187:
  movzbl (%rcx,%rdx,1),%edi
  mov    %dil,(%rax,%rdx,1)
  add    $0x1,%rdx
  cmp    %rdx,%rsi
  jne    L187
  ret
L139:
  mov    %rcx,%r9
  mov    %rax,%r8
  xor    %edi,%edi
  jmp    L287
```

assistant: ```c
void *memmove(void *a, const void *b, size_t n) {
  if ((((int)a | (int)b | (int)n) & 3) == 0) {
    int *wa, *wb;
    n >>= 2;
    if (a < (void *)b)
      for (wa = (int *)a, wb = (int *)b; n-- > 0;)
        *wa++ = *wb++;
    else
      for (wa = n + (int *)a, wb = n + (int *)b; n-- > 0;)
        *--wa = *--wb;
  } else {
    char *ca, *cb;
    if (a < (void *)b)
      for (ca = (char *)a, cb = (char *)b; n-- > 0;)
        *ca++ = *cb++;
    else
      for (ca = n + (char *)a, cb = n + (char *)b; n-- > 0;)
        *--ca = *--cb;
  }
  return a;
}
```