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

```asm
<memmove>:
  endbr64
  push   %rbp
  mov    %rdi,%r8
  mov    %rdx,%rax
  push   %rbx
  cmp    %rdi,%rsi
  jb     L210
  mov    %rsi,%rcx
  mov    %rsi,%rdx
  xor    %rdi,%rcx
  and    $0x7,%ecx
  je     L152
L307:
  test   %rax,%rax
  je     L353
L274:
  lea    0x1(%rdx),%r9
  mov    %rdi,%rsi
  lea    -0x1(%rax),%rcx
  sub    %r9,%rsi
  cmp    $0xe,%rsi
  jbe    L249
  cmp    $0x6,%rcx
  jbe    L249
  cmp    $0xe,%rcx
  jbe    L186
  mov    %rax,%rsi
  mov    %rdi,%r9
  mov    %rdx,%rcx
  and    $0xfffffffffffffff0,%rsi
  sub    %rdx,%r9
  add    %rdx,%rsi
  nop
L287:
  movdqu (%rcx),%xmm0
  movups %xmm0,(%r9,%rcx,1)
  add    $0x10,%rcx
  cmp    %rcx,%rsi
  jne    L287
  mov    %rax,%r10
  mov    %rax,%rcx
  and    $0xfffffffffffffff0,%r10
  and    $0xf,%ecx
  lea    (%r10,%rdx,1),%r9
  lea    (%rdi,%r10,1),%rsi
  cmp    %rax,%r10
  je     L353
  lea    -0x1(%rcx),%r11
  mov    %rcx,%rax
  cmp    $0x6,%r11
  jbe    L99
L303:
  mov    (%rdx,%r10,1),%rdx
  mov    %rdx,(%rdi,%r10,1)
  mov    %rax,%rdx
  and    $0xfffffffffffffff8,%rdx
  sub    %rdx,%rcx
  add    %rdx,%r9
  add    %rdx,%rsi
  cmp    %rdx,%rax
  je     L353
  lea    -0x1(%rcx),%r11
L99:
  movzbl (%r9),%eax
  mov    %al,(%rsi)
  test   %r11,%r11
  je     L353
  movzbl 0x1(%r9),%eax
  mov    %al,0x1(%rsi)
  cmp    $0x2,%rcx
  je     L353
  movzbl 0x2(%r9),%eax
  mov    %al,0x2(%rsi)
  cmp    $0x3,%rcx
  je     L353
  movzbl 0x3(%r9),%eax
  mov    %al,0x3(%rsi)
  cmp    $0x4,%rcx
  je     L353
  movzbl 0x4(%r9),%eax
  mov    %al,0x4(%rsi)
  cmp    $0x5,%rcx
  je     L353
  movzbl 0x5(%r9),%eax
  mov    %al,0x5(%rsi)
  cmp    $0x6,%rcx
  je     L353
  movzbl 0x6(%r9),%eax
  mov    %al,0x6(%rsi)
L353:
  mov    %r8,%rax
  pop    %rbx
  pop    %rbp
  ret
  nopl   (%rax)
L152:
  test   %rax,%rax
  jne    L448
  jmp    L353
  nopw   0x0(%rax,%rax,1)
L270:
  movzbl (%rdx),%ecx
  add    $0x1,%rdi
  add    $0x1,%rdx
  mov    %cl,-0x1(%rdi)
  sub    $0x1,%rax
  je     L353
L448:
  test   $0x7,%dl
  jne    L270
  cmp    $0x7,%rax
  jbe    L274
  lea    -0x8(%rax),%r10
  lea    0x8(%rdx),%r11
  cmp    $0x17,%r10
  jbe    L188
  cmp    %rdi,%r11
  je     L188
  mov    %r10,%rbx
  mov    %rdi,%r9
  mov    %rdx,%rcx
  shr    $0x3,%rbx
  sub    %rdx,%r9
  add    $0x1,%rbx
  mov    %rbx,%rsi
  shr    %rsi
  shl    $0x4,%rsi
  add    %rdx,%rsi
  nop
L194:
  movdqu (%rcx),%xmm1
  movups %xmm1,(%r9,%rcx,1)
  add    $0x10,%rcx
  cmp    %rsi,%rcx
  jne    L194
  mov    %rbx,%r9
  mov    %rdi,%rcx
  and    $0xfffffffffffffffe,%r9
  mov    %r9,%rsi
  neg    %rsi
  shl    $0x3,%rsi
  sub    %rsi,%rdx
  sub    %rsi,%rcx
  cmp    %r9,%rbx
  je     L24
  mov    (%rdx),%rdx
  mov    %rdx,(%rcx)
L24:
  and    $0xfffffffffffffff8,%r10
  and    $0x7,%eax
  lea    (%r10,%r11,1),%rdx
  lea    0x8(%rdi,%r10,1),%rdi
  jmp    L307
  nopl   0x0(%rax)
L210:
  lea    (%rsi,%rdx,1),%r9
  lea    (%rdi,%rdx,1),%rcx
  mov    %r9,%rdx
  xor    %rcx,%rdx
  and    $0x7,%edx
  jne    L262
  test   %rax,%rax
  jne    L39
  jmp    L353
  nopl   0x0(%rax)
L320:
  movzbl -0x1(%r9),%edx
  sub    $0x1,%r9
  sub    $0x1,%rcx
  mov    %dl,(%rcx)
  sub    $0x1,%rax
  je     L353
L39:
  test   $0x7,%r9b
  jne    L320
  cmp    $0x7,%rax
  jbe    L79
  lea    -0x8(%rax),%r10
  lea    -0x8(%rcx),%rdi
  lea    -0x10(%r9),%rdx
  cmp    $0x17,%r10
  jbe    L340
  cmp    %rdx,%rdi
  je     L340
  mov    %r10,%r11
  mov    %rdx,%rsi
  sub    %r9,%rcx
  shr    $0x3,%r11
  add    $0x1,%r11
  mov    %r11,%rbx
  shr    %rbx
  shl    $0x4,%rbx
  sub    %rbx,%rsi
  xchg   %ax,%ax
L49:
  movdqu (%rdx),%xmm2
  movups %xmm2,(%rcx,%rdx,1)
  sub    $0x10,%rdx
  cmp    %rsi,%rdx
  jne    L49
  mov    %r11,%rcx
  lea    -0x8(%r9),%rbp
  and    $0xfffffffffffffffe,%rcx
  mov    %rcx,%rdx
  neg    %rdx
  shl    $0x3,%rdx
  cmp    %rcx,%r11
  je     L21
  mov    -0x8(%r9,%rdx,1),%rcx
  mov    %rcx,(%rdi,%rdx,1)
L21:
  and    $0xfffffffffffffff8,%r10
  mov    %rbp,%r9
  and    $0x7,%eax
  sub    %r10,%rdi
  sub    %r10,%r9
  mov    %rdi,%rcx
L262:
  test   %rax,%rax
  je     L353
L79:
  mov    %r9,%rdi
  sub    %rax,%rdi
  mov    %r9,%rax
  nopl   0x0(%rax)
L278:
  sub    $0x1,%rax
  movzbl (%rax),%esi
  lea    (%rax,%rcx,1),%rdx
  sub    %r9,%rdx
  mov    %sil,(%rdx)
  cmp    %rax,%rdi
  jne    L278
  mov    %r8,%rax
  pop    %rbx
  pop    %rbp
  ret
  nopl   0x0(%rax)
L249:
  add    %rdx,%rax
  sub    %rdx,%rdi
  cs nopw 0x0(%rax,%rax,1)
L239:
  movzbl (%rdx),%ecx
  mov    %cl,(%rdi,%rdx,1)
  add    $0x1,%rdx
  cmp    %rax,%rdx
  jne    L239
  jmp    L353
L186:
  mov    %rax,%rcx
  mov    %rdx,%r9
  mov    %rdi,%rsi
  xor    %r10d,%r10d
  jmp    L303
L188:
  mov    %r10,%rsi
  mov    %rdi,%r9
  and    $0xfffffffffffffff8,%rsi
  sub    %rdx,%r9
  add    %r11,%rsi
  nopl   (%rax)
L227:
  mov    (%rdx),%rcx
  mov    %rcx,(%r9,%rdx,1)
  add    $0x8,%rdx
  cmp    %rsi,%rdx
  jne    L227
  jmp    L24
L340:
  lea    -0x8(%r9),%rbp
  mov    %r10,%rdx
  and    $0xfffffffffffffff8,%rdx
  mov    %rbp,%rbx
  sub    %rdx,%rbx
  mov    %r9,%rdx
  nopl   0x0(%rax)
L317:
  sub    $0x8,%rdx
  mov    (%rdx),%r11
  lea    (%rcx,%rdx,1),%rsi
  sub    %r9,%rsi
  mov    %r11,(%rsi)
  cmp    %rbx,%rdx
  jne    L317
  jmp    L21
```

assistant: ```c
void *memmove(void *s1, const void *s2, size_t n) {
  uintptr_t from = (uintptr_t)s2;
  uintptr_t to = (uintptr_t)s1;
  if (to <= from) {
    if (((from ^ to) & (sizeof(uintptr_t) - 1)) == 0) {
      while (n != 0 && ((from & (sizeof(uintptr_t) - 1)) != 0)) {
        *(char *)to = *(const char *)from;
        from++;
        to++;
        n--;
      }
      while (n >= sizeof(uintptr_t)) {
        *(uintptr_t *)to = *(const uintptr_t *)from;
        from += sizeof(uintptr_t);
        to += sizeof(uintptr_t);
        n -= sizeof(uintptr_t);
      }
    }
    while (n != 0) {
      *(char *)to = *(const char *)from;
      from++;
      to++;
      n--;
    }
  } else {
    from += n;
    to += n;
    if (((from ^ to) & (sizeof(uintptr_t) - 1)) == 0) {
      while (n != 0 && ((from & (sizeof(uintptr_t) - 1)) != 0)) {
        from--;
        to--;
        *(char *)to = *(const char *)from;
        n--;
      }
      while (n >= sizeof(uintptr_t)) {
        from -= sizeof(uintptr_t);
        to -= sizeof(uintptr_t);
        *(uintptr_t *)to = *(const uintptr_t *)from;
        n -= sizeof(uintptr_t);
      }
    }
    while (n != 0) {
      from--;
      to--;
      *(char *)to = *(const char *)from;
      n--;
    }
  }
  return s1;
}
```