user: What is the c source code of the assembly code below?

```asm
<_wordcopy_bwd_aligned>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x18(%rbp)
  mov    %rsi,-0x20(%rbp)
  mov    %rdx,-0x28(%rbp)
  movq   $0x0,-0x10(%rbp)
  movq   $0x0,-0x8(%rbp)
  mov    -0x28(%rbp),%rax
  and    $0x7,%eax
  cmp    $0x7,%rax
  ja     L76
  lea    0x0(,%rax,4),%rdx
  lea    D16(%rip),%rax
  mov    (%rdx,%rax,1),%eax
  cltq
  lea    D16(%rip),%rdx
  add    %rdx,%rax
  notrack jmp *%rax
  mov    -0x20(%rbp),%rax
  sub    $0x10,%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x18(%rbp),%rax
  sub    $0x8,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  mov    %rax,-0x10(%rbp)
  addq   $0x6,-0x28(%rbp)
  jmp    L139
  mov    -0x20(%rbp),%rax
  sub    $0x18,%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x18(%rbp),%rax
  sub    $0x10,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x20(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rax
  mov    %rax,-0x8(%rbp)
  addq   $0x5,-0x28(%rbp)
  jmp    L70
  mov    -0x20(%rbp),%rax
  sub    $0x20,%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x18(%rbp),%rax
  sub    $0x18,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x20(%rbp),%rax
  add    $0x18,%rax
  mov    (%rax),%rax
  mov    %rax,-0x10(%rbp)
  addq   $0x4,-0x28(%rbp)
  jmp    L126
  mov    -0x20(%rbp),%rax
  sub    $0x28,%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x18(%rbp),%rax
  sub    $0x20,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x20(%rbp),%rax
  add    $0x20,%rax
  mov    (%rax),%rax
  mov    %rax,-0x8(%rbp)
  addq   $0x3,-0x28(%rbp)
  jmp    L65
  mov    -0x20(%rbp),%rax
  sub    $0x30,%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x18(%rbp),%rax
  sub    $0x28,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x20(%rbp),%rax
  add    $0x28,%rax
  mov    (%rax),%rax
  mov    %rax,-0x10(%rbp)
  addq   $0x2,-0x28(%rbp)
  jmp    L120
  mov    -0x20(%rbp),%rax
  sub    $0x38,%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x18(%rbp),%rax
  sub    $0x30,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x20(%rbp),%rax
  add    $0x30,%rax
  mov    (%rax),%rax
  mov    %rax,-0x8(%rbp)
  addq   $0x1,-0x28(%rbp)
  jmp    L56
  cmpq   $0x0,-0x28(%rbp)
  je     L60
  mov    -0x20(%rbp),%rax
  sub    $0x40,%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x18(%rbp),%rax
  sub    $0x38,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x20(%rbp),%rax
  add    $0x38,%rax
  mov    (%rax),%rax
  mov    %rax,-0x10(%rbp)
  jmp    L50
  mov    -0x20(%rbp),%rax
  sub    $0x48,%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x18(%rbp),%rax
  sub    $0x40,%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x20(%rbp),%rax
  add    $0x40,%rax
  mov    (%rax),%rax
  mov    %rax,-0x8(%rbp)
  subq   $0x1,-0x28(%rbp)
  cmpq   $0x0,-0x28(%rbp)
  je     L38
  nop
  jmp    L76
L128:
  nop
L76:
  mov    -0x20(%rbp),%rax
  add    $0x38,%rax
  mov    (%rax),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x38,%rax
  mov    %rax,%rdx
  mov    -0x8(%rbp),%rax
  mov    %rax,(%rdx)
L50:
  mov    -0x20(%rbp),%rax
  add    $0x30,%rax
  mov    (%rax),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x30,%rax
  mov    %rax,%rdx
  mov    -0x10(%rbp),%rax
  mov    %rax,(%rdx)
L56:
  mov    -0x20(%rbp),%rax
  add    $0x28,%rax
  mov    (%rax),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x28,%rax
  mov    %rax,%rdx
  mov    -0x8(%rbp),%rax
  mov    %rax,(%rdx)
L120:
  mov    -0x20(%rbp),%rax
  add    $0x20,%rax
  mov    (%rax),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x20,%rax
  mov    %rax,%rdx
  mov    -0x10(%rbp),%rax
  mov    %rax,(%rdx)
L65:
  mov    -0x20(%rbp),%rax
  add    $0x18,%rax
  mov    (%rax),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x18,%rax
  mov    %rax,%rdx
  mov    -0x8(%rbp),%rax
  mov    %rax,(%rdx)
L126:
  mov    -0x20(%rbp),%rax
  add    $0x10,%rax
  mov    (%rax),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x10,%rax
  mov    %rax,%rdx
  mov    -0x10(%rbp),%rax
  mov    %rax,(%rdx)
L70:
  mov    -0x20(%rbp),%rax
  add    $0x8,%rax
  mov    (%rax),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x18(%rbp),%rax
  add    $0x8,%rax
  mov    %rax,%rdx
  mov    -0x8(%rbp),%rax
  mov    %rax,(%rdx)
L139:
  mov    -0x20(%rbp),%rax
  mov    (%rax),%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  mov    -0x10(%rbp),%rdx
  mov    %rdx,(%rax)
  mov    -0x20(%rbp),%rax
  sub    $0x40,%rax
  mov    %rax,-0x20(%rbp)
  mov    -0x18(%rbp),%rax
  sub    $0x40,%rax
  mov    %rax,-0x18(%rbp)
  subq   $0x8,-0x28(%rbp)
  cmpq   $0x0,-0x28(%rbp)
  jne    L128
  jmp    L23
L38:
  nop
L23:
  mov    -0x18(%rbp),%rax
  add    $0x38,%rax
  mov    %rax,%rdx
  mov    -0x8(%rbp),%rax
  mov    %rax,(%rdx)
  jmp    L135
L60:
  nop
L135:
  pop    %rbp
  ret
```

assistant: ```c
void _wordcopy_bwd_aligned(long int dstp, long int srcp, size_t len) {
  unsigned long int a0 = 0;
  unsigned long int a1 = 0;
  switch (len % 8) {
  case 2:
    srcp -= 2 * (sizeof(unsigned long int));
    dstp -= 1 * (sizeof(unsigned long int));
    a0 = ((unsigned long int *)srcp)[1];
    len += 6;
    goto do1;
  case 3:
    srcp -= 3 * (sizeof(unsigned long int));
    dstp -= 2 * (sizeof(unsigned long int));
    a1 = ((unsigned long int *)srcp)[2];
    len += 5;
    goto do2;
  case 4:
    srcp -= 4 * (sizeof(unsigned long int));
    dstp -= 3 * (sizeof(unsigned long int));
    a0 = ((unsigned long int *)srcp)[3];
    len += 4;
    goto do3;
  case 5:
    srcp -= 5 * (sizeof(unsigned long int));
    dstp -= 4 * (sizeof(unsigned long int));
    a1 = ((unsigned long int *)srcp)[4];
    len += 3;
    goto do4;
  case 6:
    srcp -= 6 * (sizeof(unsigned long int));
    dstp -= 5 * (sizeof(unsigned long int));
    a0 = ((unsigned long int *)srcp)[5];
    len += 2;
    goto do5;
  case 7:
    srcp -= 7 * (sizeof(unsigned long int));
    dstp -= 6 * (sizeof(unsigned long int));
    a1 = ((unsigned long int *)srcp)[6];
    len += 1;
    goto do6;
  case 0:
    if (16 <= 3 * (sizeof(unsigned long int)) && len == 0)
      return;
    srcp -= 8 * (sizeof(unsigned long int));
    dstp -= 7 * (sizeof(unsigned long int));
    a0 = ((unsigned long int *)srcp)[7];
    goto do7;
  case 1:
    srcp -= 9 * (sizeof(unsigned long int));
    dstp -= 8 * (sizeof(unsigned long int));
    a1 = ((unsigned long int *)srcp)[8];
    len -= 1;
    if (16 <= 3 * (sizeof(unsigned long int)) && len == 0)
      goto do0;
    goto do8;
  }
  do {
  do8:
    a0 = ((unsigned long int *)srcp)[7];
    ((unsigned long int *)dstp)[7] = a1;
  do7:
    a1 = ((unsigned long int *)srcp)[6];
    ((unsigned long int *)dstp)[6] = a0;
  do6:
    a0 = ((unsigned long int *)srcp)[5];
    ((unsigned long int *)dstp)[5] = a1;
  do5:
    a1 = ((unsigned long int *)srcp)[4];
    ((unsigned long int *)dstp)[4] = a0;
  do4:
    a0 = ((unsigned long int *)srcp)[3];
    ((unsigned long int *)dstp)[3] = a1;
  do3:
    a1 = ((unsigned long int *)srcp)[2];
    ((unsigned long int *)dstp)[2] = a0;
  do2:
    a0 = ((unsigned long int *)srcp)[1];
    ((unsigned long int *)dstp)[1] = a1;
  do1:
    a1 = ((unsigned long int *)srcp)[0];
    ((unsigned long int *)dstp)[0] = a0;
    srcp -= 8 * (sizeof(unsigned long int));
    dstp -= 8 * (sizeof(unsigned long int));
    len -= 8;
  } while (len != 0);
do0:
  ((unsigned long int *)dstp)[7] = a1;
}
```