user: Translate the below assembly code into C programming language:

```asm
<aes_addRoundKey_cpy>:
  endbr64
  mov    %rdi,%rcx
  push   %rbp
  lea    0x100(%rsi),%rdi
  mov    %rsi,%rax
  lea    0x100(%rdx),%r11
  push   %rbx
  lea    0x70(%rsi),%rbx
  add    $0xf0,%rsi
  lea    0x70(%rdx),%r9
  cmp    %rsi,%r11
  lea    0x70(%rcx),%r10
  setbe  %sil
  cmp    %rdi,%r9
  lea    0x80(%rcx),%r8
  setae  %bpl
  or     %ebp,%esi
  cmp    %r10,%rdi
  setbe  %dil
  cmp    %r8,%rbx
  setae  %bpl
  or     %ebp,%edi
  and    %edi,%esi
  cmp    %r10,%r11
  setbe  %dil
  cmp    %r8,%r9
  setae  %r8b
  or     %r8d,%edi
  test   %dil,%sil
  je     L17
  mov    %rdx,%rsi
  sub    %rbx,%rsi
  add    $0xf8,%rsi
  cmp    $0x80,%rsi
  jbe    L17
  movdqu 0x70(%rax),%xmm0
  movups %xmm0,0x70(%rdx)
  movdqu 0x70(%rcx),%xmm1
  shufpd $0x1,%xmm0,%xmm0
  shufpd $0x1,%xmm1,%xmm1
  pxor   %xmm1,%xmm0
  shufpd $0x1,%xmm0,%xmm0
  movups %xmm0,0x70(%rcx)
  movdqu 0xf0(%rax),%xmm3
  movups %xmm3,0xf0(%rdx)
  movdqu 0x60(%rax),%xmm0
  movups %xmm0,0x60(%rdx)
  movdqu 0x60(%rcx),%xmm1
  shufpd $0x1,%xmm0,%xmm0
  shufpd $0x1,%xmm1,%xmm1
  pxor   %xmm1,%xmm0
  shufpd $0x1,%xmm0,%xmm0
  movups %xmm0,0x60(%rcx)
  movdqu 0xe0(%rax),%xmm5
  movups %xmm5,0xe0(%rdx)
  movdqu 0x50(%rax),%xmm0
  movups %xmm0,0x50(%rdx)
  movdqu 0x50(%rcx),%xmm1
  shufpd $0x1,%xmm0,%xmm0
  shufpd $0x1,%xmm1,%xmm1
  pxor   %xmm1,%xmm0
  shufpd $0x1,%xmm0,%xmm0
  movups %xmm0,0x50(%rcx)
  movdqu 0xd0(%rax),%xmm7
  movups %xmm7,0xd0(%rdx)
  movdqu 0x40(%rax),%xmm0
  movups %xmm0,0x40(%rdx)
  movdqu 0x40(%rcx),%xmm1
  shufpd $0x1,%xmm0,%xmm0
  shufpd $0x1,%xmm1,%xmm1
  pxor   %xmm1,%xmm0
  shufpd $0x1,%xmm0,%xmm0
  movups %xmm0,0x40(%rcx)
  movdqu 0xc0(%rax),%xmm3
  movups %xmm3,0xc0(%rdx)
  movdqu 0x30(%rax),%xmm0
  movups %xmm0,0x30(%rdx)
  movdqu 0x30(%rcx),%xmm1
  shufpd $0x1,%xmm0,%xmm0
  shufpd $0x1,%xmm1,%xmm1
  pxor   %xmm1,%xmm0
  shufpd $0x1,%xmm0,%xmm0
  movups %xmm0,0x30(%rcx)
  movdqu 0xb0(%rax),%xmm5
  movups %xmm5,0xb0(%rdx)
  movdqu 0x20(%rax),%xmm0
  movups %xmm0,0x20(%rdx)
  movdqu 0x20(%rcx),%xmm1
  shufpd $0x1,%xmm0,%xmm0
  pop    %rbx
  pop    %rbp
  shufpd $0x1,%xmm1,%xmm1
  pxor   %xmm1,%xmm0
  shufpd $0x1,%xmm0,%xmm0
  movups %xmm0,0x20(%rcx)
  movdqu 0xa0(%rax),%xmm7
  movups %xmm7,0xa0(%rdx)
  movdqu 0x10(%rax),%xmm0
  movups %xmm0,0x10(%rdx)
  movdqu 0x10(%rcx),%xmm1
  shufpd $0x1,%xmm0,%xmm0
  shufpd $0x1,%xmm1,%xmm1
  pxor   %xmm1,%xmm0
  shufpd $0x1,%xmm0,%xmm0
  movups %xmm0,0x10(%rcx)
  movdqu 0x90(%rax),%xmm3
  movups %xmm3,0x90(%rdx)
  movdqu (%rax),%xmm0
  movups %xmm0,(%rdx)
  movdqu (%rcx),%xmm1
  shufpd $0x1,%xmm0,%xmm0
  shufpd $0x1,%xmm1,%xmm1
  pxor   %xmm1,%xmm0
  shufpd $0x1,%xmm0,%xmm0
  movups %xmm0,(%rcx)
  movdqu 0x80(%rax),%xmm5
  movups %xmm5,0x80(%rdx)
  ret
  nopl   0x0(%rax)
L17:
  mov    0x78(%rax),%rsi
  mov    %rsi,0x78(%rdx)
  xor    %rsi,0x78(%rcx)
  mov    0xf8(%rax),%rsi
  mov    %rsi,0xf8(%rdx)
  mov    0x70(%rax),%rsi
  mov    %rsi,0x70(%rdx)
  xor    %rsi,0x70(%rcx)
  mov    0xf0(%rax),%rsi
  mov    %rsi,0xf0(%rdx)
  mov    0x68(%rax),%rsi
  mov    %rsi,0x68(%rdx)
  xor    %rsi,0x68(%rcx)
  mov    0xe8(%rax),%rsi
  mov    %rsi,0xe8(%rdx)
  mov    0x60(%rax),%rsi
  mov    %rsi,0x60(%rdx)
  xor    %rsi,0x60(%rcx)
  mov    0xe0(%rax),%rsi
  mov    %rsi,0xe0(%rdx)
  mov    0x58(%rax),%rsi
  mov    %rsi,0x58(%rdx)
  xor    %rsi,0x58(%rcx)
  mov    0xd8(%rax),%rsi
  mov    %rsi,0xd8(%rdx)
  mov    0x50(%rax),%rsi
  mov    %rsi,0x50(%rdx)
  xor    %rsi,0x50(%rcx)
  mov    0xd0(%rax),%rsi
  mov    %rsi,0xd0(%rdx)
  mov    0x48(%rax),%rsi
  mov    %rsi,0x48(%rdx)
  xor    %rsi,0x48(%rcx)
  mov    0xc8(%rax),%rsi
  mov    %rsi,0xc8(%rdx)
  mov    0x40(%rax),%rsi
  mov    %rsi,0x40(%rdx)
  xor    %rsi,0x40(%rcx)
  mov    0xc0(%rax),%rsi
  mov    %rsi,0xc0(%rdx)
  mov    0x38(%rax),%rsi
  mov    %rsi,0x38(%rdx)
  xor    %rsi,0x38(%rcx)
  mov    0xb8(%rax),%rsi
  mov    %rsi,0xb8(%rdx)
  mov    0x30(%rax),%rsi
  mov    %rsi,0x30(%rdx)
  xor    %rsi,0x30(%rcx)
  mov    0xb0(%rax),%rsi
  mov    %rsi,0xb0(%rdx)
  mov    0x28(%rax),%rsi
  mov    %rsi,0x28(%rdx)
  xor    %rsi,0x28(%rcx)
  mov    0xa8(%rax),%rsi
  mov    %rsi,0xa8(%rdx)
  mov    0x20(%rax),%rsi
  pop    %rbx
  pop    %rbp
  mov    %rsi,0x20(%rdx)
  xor    %rsi,0x20(%rcx)
  mov    0xa0(%rax),%rsi
  mov    %rsi,0xa0(%rdx)
  mov    0x18(%rax),%rsi
  mov    %rsi,0x18(%rdx)
  xor    %rsi,0x18(%rcx)
  mov    0x98(%rax),%rsi
  mov    %rsi,0x98(%rdx)
  mov    0x10(%rax),%rsi
  mov    %rsi,0x10(%rdx)
  xor    %rsi,0x10(%rcx)
  mov    0x90(%rax),%rsi
  mov    %rsi,0x90(%rdx)
  mov    0x8(%rax),%rsi
  mov    %rsi,0x8(%rdx)
  xor    %rsi,0x8(%rcx)
  mov    0x88(%rax),%rsi
  mov    %rsi,0x88(%rdx)
  mov    (%rax),%rsi
  mov    %rsi,(%rdx)
  xor    %rsi,(%rcx)
  mov    0x80(%rax),%rax
  mov    %rax,0x80(%rdx)
  ret
```

assistant: ```c
void aes_addRoundKey_cpy(uint8_t *buf, uint8_t *key, uint8_t *cpk) {
  register uint8_t i = 16;
  while (i--)
    buf[i] ^= (cpk[i] = key[i]), cpk[16 + i] = key[16 + i];
}
```