user: Converte this assembly snippet into its equivalent C code:

```asm
<dcopy>:
  endbr64
  mov    %edx,%eax
  mov    %rsi,%rcx
  movslq %edi,%r8
  movslq %esi,%rsi
  sar    $0x2,%eax
  mov    %eax,%r10d
  and    $0x3,%eax
  and    $0xfffffffc,%r10d
  movslq %r10d,%r9
  shl    $0x3,%r9
  add    %r9,%rsi
  add    %r9,%r8
  cmp    $0x2,%eax
  je     L10
  jg     L20
  test   %eax,%eax
  je     L103
  cmp    $0x1,%eax
  jne    L88
  mov    (%rsi),%eax
  mov    %eax,(%r8)
  sub    $0x4,%r10d
  js     L88
L211:
  sub    $0x10,%r8
  sub    $0x10,%rsi
L103:
  mov    0xc(%rsi),%eax
  mov    %eax,0xc(%r8)
  mov    0x8(%rsi),%eax
  mov    %eax,0x8(%r8)
L10:
  mov    0x4(%rsi),%eax
  mov    %eax,0x4(%r8)
L84:
  mov    (%rsi),%eax
  mov    %eax,(%r8)
  sub    $0x4,%r10d
  jns    L211
L88:
  mov    %edx,%esi
  and    $0xfffffffc,%esi
  cmp    %esi,%edx
  jle    L65
  movslq %esi,%r8
  push   %rbp
  mov    %edx,%r9d
  lea    (%rdi,%r8,1),%r11
  lea    0x1(%r8),%rax
  push   %rbx
  sub    %esi,%r9d
  lea    (%rcx,%rax,1),%rbp
  mov    %r11,%rbx
  lea    -0x1(%r9),%r10d
  sub    %rbp,%rbx
  cmp    $0xe,%rbx
  jbe    L87
  cmp    $0x6,%r10d
  jbe    L87
  cmp    $0xe,%r10d
  jbe    L220
  mov    %r9d,%r10d
  lea    (%rcx,%r8,1),%rbx
  xor    %eax,%eax
  shr    $0x4,%r10d
  shl    $0x4,%r10
  nopl   (%rax)
L226:
  movdqu (%rbx,%rax,1),%xmm0
  movups %xmm0,(%r11,%rax,1)
  add    $0x10,%rax
  cmp    %r10,%rax
  jne    L226
  mov    %r9d,%eax
  and    $0xfffffff0,%eax
  add    %eax,%esi
  cmp    %eax,%r9d
  je     L240
  sub    %eax,%r9d
  lea    -0x1(%r9),%r10d
  cmp    $0x6,%r10d
  jbe    L22
L32:
  add    %r8,%rax
  mov    (%rcx,%rax,1),%r8
  mov    %r8,(%rdi,%rax,1)
  mov    %r9d,%eax
  and    $0xfffffff8,%eax
  add    %eax,%esi
  cmp    %eax,%r9d
  je     L240
L22:
  movslq %esi,%rax
  movzbl (%rcx,%rax,1),%r8d
  mov    %r8b,(%rdi,%rax,1)
  lea    0x1(%rsi),%eax
  cmp    %eax,%edx
  jle    L240
  cltq
  movzbl (%rcx,%rax,1),%r8d
  mov    %r8b,(%rdi,%rax,1)
  lea    0x2(%rsi),%eax
  cmp    %eax,%edx
  jle    L240
  cltq
  movzbl (%rcx,%rax,1),%r8d
  mov    %r8b,(%rdi,%rax,1)
  lea    0x3(%rsi),%eax
  cmp    %eax,%edx
  jle    L240
  cltq
  movzbl (%rcx,%rax,1),%r8d
  mov    %r8b,(%rdi,%rax,1)
  lea    0x4(%rsi),%eax
  cmp    %eax,%edx
  jle    L240
  cltq
  movzbl (%rcx,%rax,1),%r8d
  mov    %r8b,(%rdi,%rax,1)
  lea    0x5(%rsi),%eax
  cmp    %eax,%edx
  jle    L240
  cltq
  add    $0x6,%esi
  movzbl (%rcx,%rax,1),%r8d
  mov    %r8b,(%rdi,%rax,1)
  cmp    %esi,%edx
  jle    L240
  movslq %esi,%rsi
  movzbl (%rcx,%rsi,1),%eax
  mov    %al,(%rdi,%rsi,1)
L240:
  pop    %rbx
  pop    %rbp
  ret
  nopl   0x0(%rax,%rax,1)
L20:
  cmp    $0x3,%eax
  jne    L88
  mov    0x8(%rsi),%eax
  mov    %eax,0x8(%r8)
  mov    0x4(%rsi),%eax
  mov    %eax,0x4(%r8)
  jmp    L84
  nopl   0x0(%rax)
L37:
  add    $0x1,%rax
L87:
  movzbl (%rcx,%r8,1),%esi
  mov    %sil,(%rdi,%r8,1)
  mov    %rax,%r8
  cmp    %eax,%edx
  jg     L37
  jmp    L240
  xchg   %ax,%ax
L65:
  ret
L220:
  xor    %eax,%eax
  jmp    L32
```

assistant: ```c
void dcopy(char *chardest, char *charsrc, int size) {
  register int *src, *dest, intcount;
  int startcharcpy, intoffset, numints2cpy, i;
  numints2cpy = size >> 2;
  startcharcpy = numints2cpy << 2;
  intcount = numints2cpy & ~(4 - 1);
  intoffset = numints2cpy - intcount;
  src = (int *)(((int)charsrc) + intcount * sizeof(int *));
  dest = (int *)(((int)chardest) + intcount * sizeof(int *));
  switch (intoffset)
    do {
    case 0:
      dest[3] = src[3];
    case 3:
      dest[2] = src[2];
    case 2:
      dest[1] = src[1];
    case 1:
      dest[0] = src[0];
      intcount -= 4;
      dest -= 4;
      src -= 4;
    } while (intcount >= 0);
  for (i = startcharcpy; i < size; i++)
    chardest[i] = charsrc[i];
}
```