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

```asm
<_wordcopy_fwd_dest_aligned>:
  endbr64
  mov    %rdi,%rax
  mov    %esi,%edi
  mov    %rdx,%r8
  mov    $0x40,%r10d
  and    $0x7,%edi
  and    $0x3,%r8d
  push   %r12
  and    $0xfffffffffffffff8,%rsi
  shl    $0x3,%edi
  push   %rbp
  sub    %edi,%r10d
  push   %rbx
  cmp    $0x2,%r8
  je     L47
  cmp    $0x3,%r8
  je     L48
  cmp    $0x1,%r8
  je     L92
  test   %rdx,%rdx
  jne    L17
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  nopl   0x0(%rax,%rax,1)
L92:
  mov    (%rsi),%r8
  mov    0x8(%rsi),%r9
  sub    $0x1,%rdx
  jne    L6
L56:
  mov    %edi,%ecx
  shl    %cl,%r8
  mov    %r10d,%ecx
  shr    %cl,%r9
  or     %r9,%r8
  mov    %r8,(%rax)
  pop    %rbx
  pop    %rbp
  pop    %r12
  ret
  nopw   0x0(%rax,%rax,1)
L48:
  mov    (%rsi),%r11
  mov    0x8(%rsi),%r12
  mov    %rsi,%rbx
  lea    -0x10(%rax),%rbp
  add    $0x1,%rdx
  jmp    L23
  nopl   0x0(%rax)
L40:
  add    $0x20,%rbx
L22:
  mov    %edi,%ecx
  mov    %r9,%rsi
  mov    (%rbx),%r11
  shl    %cl,%r8
  mov    %r10d,%ecx
  shr    %cl,%rsi
  or     %rsi,%r8
  mov    %r8,(%rax)
  lea    0x8(%rbp),%rax
L45:
  mov    %edi,%ecx
  mov    %r11,%rsi
  mov    0x8(%rbx),%r12
  shl    %cl,%r9
  mov    %r10d,%ecx
  shr    %cl,%rsi
  or     %rsi,%r9
  mov    %r9,(%rax)
  lea    0x10(%rbp),%rax
L23:
  mov    %edi,%ecx
  mov    %r12,%rsi
  mov    0x10(%rbx),%r8
  shl    %cl,%r11
  mov    %r10d,%ecx
  shr    %cl,%rsi
  or     %rsi,%r11
  mov    %r11,(%rax)
  lea    0x18(%rbp),%rax
L98:
  mov    %edi,%ecx
  mov    %r12,%rsi
  mov    %r8,%r11
  add    $0x20,%rbp
  shl    %cl,%rsi
  mov    %r10d,%ecx
  mov    0x18(%rbx),%r9
  shr    %cl,%r11
  or     %r11,%rsi
  mov    %rsi,(%rax)
  mov    %rbp,%rax
  sub    $0x4,%rdx
  je     L56
  jmp    L40
L47:
  mov    (%rsi),%r12
  mov    0x8(%rsi),%r8
  lea    -0x8(%rsi),%rbx
  lea    -0x18(%rax),%rbp
  add    $0x2,%rdx
  jmp    L98
  nopl   (%rax)
L6:
  lea    0x10(%rsi),%rbx
  mov    %rax,%rbp
  jmp    L22
  nopl   0x0(%rax)
L17:
  mov    (%rsi),%r9
  mov    0x8(%rsi),%r11
  lea    0x8(%rsi),%rbx
  lea    -0x8(%rax),%rbp
  jmp    L45
```

assistant: ```c
void _wordcopy_fwd_dest_aligned(long int dstp, long int srcp, size_t len) {
  unsigned long int a0, a1, a2, a3;
  int sh_1, sh_2;
  sh_1 = 8 * (srcp % (sizeof(unsigned long int)));
  sh_2 = 8 * (sizeof(unsigned long int)) - sh_1;
  srcp &= -(sizeof(unsigned long int));
  switch (len % 4) {
  case 2:
    a1 = ((unsigned long int *)srcp)[0];
    a2 = ((unsigned long int *)srcp)[1];
    srcp -= 1 * (sizeof(unsigned long int));
    dstp -= 3 * (sizeof(unsigned long int));
    len += 2;
    goto do1;
  case 3:
    a0 = ((unsigned long int *)srcp)[0];
    a1 = ((unsigned long int *)srcp)[1];
    srcp -= 0 * (sizeof(unsigned long int));
    dstp -= 2 * (sizeof(unsigned long int));
    len += 1;
    goto do2;
  case 0:
    if (16 <= 3 * (sizeof(unsigned long int)) && len == 0)
      return;
    a3 = ((unsigned long int *)srcp)[0];
    a0 = ((unsigned long int *)srcp)[1];
    srcp -= -1 * (sizeof(unsigned long int));
    dstp -= 1 * (sizeof(unsigned long int));
    len += 0;
    goto do3;
  case 1:
    a2 = ((unsigned long int *)srcp)[0];
    a3 = ((unsigned long int *)srcp)[1];
    srcp -= -2 * (sizeof(unsigned long int));
    dstp -= 0 * (sizeof(unsigned long int));
    len -= 1;
    if (16 <= 3 * (sizeof(unsigned long int)) && len == 0)
      goto do0;
    goto do4;
  }
  do {
  do4:
    a0 = ((unsigned long int *)srcp)[0];
    ((unsigned long int *)dstp)[0] = (((a2) << (sh_1)) | ((a3) >> (sh_2)));
  do3:
    a1 = ((unsigned long int *)srcp)[1];
    ((unsigned long int *)dstp)[1] = (((a3) << (sh_1)) | ((a0) >> (sh_2)));
  do2:
    a2 = ((unsigned long int *)srcp)[2];
    ((unsigned long int *)dstp)[2] = (((a0) << (sh_1)) | ((a1) >> (sh_2)));
  do1:
    a3 = ((unsigned long int *)srcp)[3];
    ((unsigned long int *)dstp)[3] = (((a1) << (sh_1)) | ((a2) >> (sh_2)));
    srcp += 4 * (sizeof(unsigned long int));
    dstp += 4 * (sizeof(unsigned long int));
    len -= 4;
  } while (len != 0);
do0:
  ((unsigned long int *)dstp)[0] = (((a2) << (sh_1)) | ((a3) >> (sh_2)));
}
```