user: 请从给定的汇编指令推导出C源代码:

```asm
<_wordcopy_fwd_dest_aligned>:
  endbr64
  push   %rbx
  mov    %esi,%r10d
  and    $0x7,%r10d
  shl    $0x3,%r10d
  mov    $0x40,%r11d
  sub    %r10d,%r11d
  and    $0xfffffffffffffff8,%rsi
  mov    %rdx,%rax
  and    $0x3,%eax
  cmp    $0x2,%rax
  je     L86
  ja     L0
  test   %rax,%rax
  je     L67
  cmp    $0x1,%rax
  jne    L57
  mov    (%rsi),%r8
  mov    0x8(%rsi),%r9
  sub    $0x1,%rdx
  je     L106
  add    $0x10,%rsi
  jmp    L57
L86:
  mov    (%rsi),%rax
  mov    0x8(%rsi),%r8
  sub    $0x8,%rsi
  sub    $0x18,%rdi
  add    $0x2,%rdx
  jmp    L33
L0:
  mov    (%rsi),%rbx
  mov    0x8(%rsi),%rax
  sub    $0x10,%rdi
  add    $0x1,%rdx
  jmp    L100
L67:
  test   %rdx,%rdx
  je     L9
  mov    (%rsi),%r9
  mov    0x8(%rsi),%rbx
  lea    0x8(%rsi),%rsi
  sub    $0x8,%rdi
L2:
  mov    0x8(%rsi),%rax
  mov    %r10d,%ecx
  shl    %cl,%r9
  mov    %rbx,%r8
  mov    %r11d,%ecx
  shr    %cl,%r8
  or     %r8,%r9
  mov    %r9,0x8(%rdi)
L100:
  mov    0x10(%rsi),%r8
  mov    %r10d,%ecx
  shl    %cl,%rbx
  mov    %rax,%r9
  mov    %r11d,%ecx
  shr    %cl,%r9
  or     %r9,%rbx
  mov    %rbx,0x10(%rdi)
L33:
  mov    0x18(%rsi),%r9
  mov    %r10d,%ecx
  shl    %cl,%rax
  mov    %r8,%rbx
  mov    %r11d,%ecx
  shr    %cl,%rbx
  or     %rbx,%rax
  mov    %rax,0x18(%rdi)
  add    $0x20,%rdi
  sub    $0x4,%rdx
  je     L106
  add    $0x20,%rsi
L57:
  mov    (%rsi),%rbx
  mov    %r10d,%ecx
  shl    %cl,%r8
  mov    %r9,%rax
  mov    %r11d,%ecx
  shr    %cl,%rax
  or     %rax,%r8
  mov    %r8,(%rdi)
  jmp    L2
L106:
  mov    %r10d,%ecx
  shl    %cl,%r8
  mov    %r11d,%ecx
  shr    %cl,%r9
  or     %r9,%r8
  mov    %r8,(%rdi)
L9:
  pop    %rbx
  ret
```

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