user: What would the C source look like for the assembly code provided here?

```asm
<_wordcopy_bwd_aligned>:
  endbr64
  lea    D2(%rip),%rcx
  mov    %rdx,%rax
  and    $0x7,%edx
  movslq (%rcx,%rdx,4),%rdx
  add    %rcx,%rdx
  notrack jmp *%rdx
  nopl   0x0(%rax,%rax,1)
  mov    -0x8(%rsi),%rcx
  lea    -0x38(%rsi),%rdx
  sub    $0x30,%rdi
  add    $0x1,%rax
  jmp    L49
  nopw   0x0(%rax,%rax,1)
L40:
  sub    $0x40,%rdx
L75:
  mov    0x38(%rdx),%rsi
  mov    %rcx,0x38(%rdi)
L24:
  mov    0x30(%rdx),%rcx
  mov    %rsi,0x30(%rdi)
L49:
  mov    0x28(%rdx),%rsi
  mov    %rcx,0x28(%rdi)
L3:
  mov    0x20(%rdx),%rcx
  mov    %rsi,0x20(%rdi)
L39:
  mov    0x18(%rdx),%rsi
  mov    %rcx,0x18(%rdi)
L14:
  mov    0x10(%rdx),%rcx
  mov    %rsi,0x10(%rdi)
L11:
  mov    0x8(%rdx),%rsi
  mov    %rcx,0x8(%rdi)
L52:
  mov    (%rdx),%rcx
  sub    $0x40,%rdi
  mov    %rsi,0x40(%rdi)
  sub    $0x8,%rax
  jne    L40
L51:
  mov    %rcx,0x38(%rdi)
L88:
  ret
  nopw   0x0(%rax,%rax,1)
  mov    -0x8(%rsi),%rcx
  sub    $0x40,%rdi
  sub    $0x1,%rax
  je     L51
  lea    -0x48(%rsi),%rdx
  jmp    L75
  nopl   0x0(%rax)
  lea    -0x10(%rsi),%rdx
  sub    $0x8,%rdi
  mov    -0x8(%rsi),%rsi
  add    $0x6,%rax
  jmp    L52
  nopw   0x0(%rax,%rax,1)
  mov    -0x8(%rsi),%rcx
  lea    -0x18(%rsi),%rdx
  sub    $0x10,%rdi
  add    $0x5,%rax
  jmp    L11
  nopw   0x0(%rax,%rax,1)
  lea    -0x20(%rsi),%rdx
  sub    $0x18,%rdi
  mov    -0x8(%rsi),%rsi
  add    $0x4,%rax
  jmp    L14
  nopl   (%rax)
  mov    -0x8(%rsi),%rcx
  lea    -0x28(%rsi),%rdx
  sub    $0x20,%rdi
  add    $0x3,%rax
  jmp    L39
  nopl   (%rax)
  lea    -0x30(%rsi),%rdx
  sub    $0x28,%rdi
  mov    -0x8(%rsi),%rsi
  add    $0x2,%rax
  jmp    L3
  test   %rax,%rax
  je     L88
  lea    -0x40(%rsi),%rdx
  sub    $0x38,%rdi
  mov    -0x8(%rsi),%rsi
  jmp    L24
```

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;
}
```