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

```asm
<of_add_to_multiple_symbols>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%r12
  mov    %rsi,%rbp
  mov    %edx,-0xc(%rsp)
  mov    %ecx,%eax
  shr    $0x2,%eax
  mov    %eax,-0x28(%rsp)
  mov    %ecx,%r14d
  and    $0x3,%r14d
  mov    %ecx,%eax
  shr    $0x3,%eax
  mov    %eax,-0x24(%rsp)
  cmp    $0x7,%edx
  jbe    L351
  lea    (%rax,%rax,1),%ebx
  mov    %ebx,-0x10(%rsp)
  lea    -0x8(%rdx),%r15d
  shr    $0x3,%r15d
  add    $0x1,%r15d
  mov    %r15d,%r15d
  shl    $0x6,%r15
  add    %rdi,%r15
  lea    -0x1(%rax),%r13d
  lea    0x8(,%r13,8),%rax
  mov    %rax,-0x18(%rsp)
  add    %rsi,%rax
  mov    %rax,-0x20(%rsp)
  mov    %r13,-0x30(%rsp)
  jmp    L6
L177:
  mov    %rbp,%rdx
  jmp    L214
L76:
  test   %r14d,%r14d
  jne    L101
L131:
  cmp    %r15,%r12
  je     L284
L6:
  mov    (%r12),%rcx
  mov    0x8(%r12),%rsi
  mov    0x10(%r12),%rdi
  mov    0x18(%r12),%r8
  mov    0x20(%r12),%r9
  mov    0x28(%r12),%r10
  mov    0x30(%r12),%r11
  mov    0x38(%r12),%rbx
  add    $0x40,%r12
  cmpl   $0x0,-0x24(%rsp)
  je     L177
  mov    $0x0,%eax
  mov    -0x30(%rsp),%r13
L197:
  mov    0x0(%rbp,%rax,8),%rdx
  xor    %rdx,(%rcx,%rax,8)
  xor    %rdx,(%rsi,%rax,8)
  xor    %rdx,(%rdi,%rax,8)
  xor    %rdx,(%r8,%rax,8)
  xor    %rdx,(%r9,%rax,8)
  xor    %rdx,(%r10,%rax,8)
  xor    %rdx,(%r11,%rax,8)
  xor    %rdx,(%rbx,%rax,8)
  mov    %rax,%rdx
  add    $0x1,%rax
  cmp    %rdx,%r13
  jne    L197
  mov    %r13,-0x30(%rsp)
  mov    -0x18(%rsp),%rax
  add    %rax,%rcx
  add    %rax,%rsi
  add    %rax,%rdi
  add    %rax,%r8
  add    %rax,%r9
  add    %rax,%r10
  add    %rax,%r11
  add    %rax,%rbx
  mov    -0x20(%rsp),%rdx
L214:
  mov    -0x28(%rsp),%r13d
  cmp    %r13d,-0x10(%rsp)
  jae    L76
  mov    (%rdx),%eax
  xor    %eax,(%rcx)
  mov    (%rdx),%eax
  xor    %eax,(%rsi)
  mov    (%rdx),%eax
  xor    %eax,(%rdi)
  mov    (%rdx),%eax
  xor    %eax,(%r8)
  mov    (%rdx),%eax
  xor    %eax,(%r9)
  mov    (%rdx),%eax
  xor    %eax,(%r10)
  mov    (%rdx),%eax
  xor    %eax,(%r11)
  mov    (%rdx),%eax
  xor    %eax,(%rbx)
  add    $0x4,%rdx
  lea    0x8(%rbx),%rbx
  lea    0x8(%r11),%r11
  lea    0x8(%r10),%r10
  lea    0x8(%r9),%r9
  lea    0x8(%r8),%r8
  lea    0x8(%rdi),%rdi
  lea    0x8(%rsi),%rsi
  lea    0x8(%rcx),%rcx
  jmp    L76
L101:
  mov    $0x0,%eax
  mov    -0x30(%rsp),%r13
  mov    %rbp,-0x8(%rsp)
L242:
  movzbl (%rdx),%ebp
  xor    %bpl,(%rcx,%rax,1)
  movzbl (%rdx),%ebp
  xor    %bpl,(%rsi,%rax,1)
  movzbl (%rdx),%ebp
  xor    %bpl,(%rdi,%rax,1)
  movzbl (%rdx),%ebp
  xor    %bpl,(%r8,%rax,1)
  movzbl (%rdx),%ebp
  xor    %bpl,(%r9,%rax,1)
  movzbl (%rdx),%ebp
  xor    %bpl,(%r10,%rax,1)
  movzbl (%rdx),%ebp
  xor    %bpl,(%r11,%rax,1)
  movzbl (%rdx),%ebp
  xor    %bpl,(%rbx,%rax,1)
  add    $0x1,%rax
  add    $0x1,%rdx
  cmp    %eax,%r14d
  ja     L242
  mov    %r13,-0x30(%rsp)
  mov    -0x8(%rsp),%rbp
  jmp    L131
L284:
  andl   $0x7,-0xc(%rsp)
L285:
  mov    -0xc(%rsp),%eax
  cmp    $0x3,%eax
  jbe    L263
  mov    -0x24(%rsp),%esi
  lea    (%rsi,%rsi,1),%ebx
  lea    -0x4(%rax),%r10d
  shr    $0x2,%r10d
  add    $0x1,%r10d
  mov    %r10d,%r10d
  shl    $0x5,%r10
  add    %r15,%r10
  lea    -0x1(%rsi),%r9d
  lea    0x8(,%r9,8),%r11
  lea    0x0(%rbp,%r11,1),%r12
  mov    %esi,%r13d
L269:
  mov    (%r15),%rdx
  mov    0x8(%r15),%rcx
  mov    0x10(%r15),%rsi
  mov    0x18(%r15),%rdi
  add    $0x20,%r15
  test   %r13d,%r13d
  je     L334
  mov    $0x0,%eax
L193:
  mov    0x0(%rbp,%rax,8),%r8
  xor    %r8,(%rdx,%rax,8)
  xor    %r8,(%rcx,%rax,8)
  xor    %r8,(%rsi,%rax,8)
  xor    %r8,(%rdi,%rax,8)
  mov    %rax,%r8
  add    $0x1,%rax
  cmp    %r8,%r9
  jne    L193
  add    %r11,%rdx
  add    %r11,%rcx
  add    %r11,%rsi
  add    %r11,%rdi
  mov    %r12,%r8
L113:
  cmp    -0x28(%rsp),%ebx
  jae    L327
  mov    (%r8),%eax
  xor    %eax,(%rdx)
  mov    (%r8),%eax
  xor    %eax,(%rcx)
  mov    (%r8),%eax
  xor    %eax,(%rsi)
  mov    (%r8),%eax
  xor    %eax,(%rdi)
  add    $0x4,%r8
  lea    0x8(%rdi),%rdi
  lea    0x8(%rsi),%rsi
  lea    0x8(%rcx),%rcx
  lea    0x8(%rdx),%rdx
L327:
  test   %r14d,%r14d
  jne    L10
L156:
  cmp    %r10,%r15
  jne    L269
  andl   $0x3,-0xc(%rsp)
  mov    %r10,%r15
L263:
  mov    -0xc(%rsp),%eax
  cmp    $0x1,%eax
  jbe    L116
  mov    -0x24(%rsp),%ebx
  lea    (%rbx,%rbx,1),%r10d
  sub    $0x2,%eax
  shr    %eax
  lea    0x1(%rax),%r8d
  shl    $0x4,%r8
  add    %r15,%r8
  lea    -0x1(%rbx),%esi
  lea    0x8(,%rsi,8),%r9
  lea    0x0(%rbp,%r9,1),%r11
L275:
  mov    (%r15),%rdx
  mov    0x8(%r15),%rcx
  add    $0x10,%r15
  test   %ebx,%ebx
  je     L69
  mov    $0x0,%eax
L277:
  mov    0x0(%rbp,%rax,8),%rdi
  xor    %rdi,(%rdx,%rax,8)
  mov    0x0(%rbp,%rax,8),%rdi
  xor    %rdi,(%rcx,%rax,8)
  mov    %rax,%rdi
  add    $0x1,%rax
  cmp    %rdi,%rsi
  jne    L277
  add    %r9,%rdx
  add    %r9,%rcx
  mov    %r11,%rdi
L70:
  cmp    -0x28(%rsp),%r10d
  jae    L13
  mov    (%rdi),%eax
  xor    %eax,(%rdx)
  mov    (%rdi),%eax
  xor    %eax,(%rcx)
  add    $0x4,%rdi
  lea    0x8(%rcx),%rcx
  lea    0x8(%rdx),%rdx
L13:
  test   %r14d,%r14d
  jne    L137
L270:
  cmp    %r8,%r15
  jne    L275
  andl   $0x1,-0xc(%rsp)
  mov    %r8,%r15
L116:
  cmpl   $0x0,-0xc(%rsp)
  je     L204
  mov    (%r15),%rdx
  mov    -0x24(%rsp),%eax
  test   %eax,%eax
  je     L300
  mov    %eax,%esi
  mov    $0x0,%eax
L185:
  mov    0x0(%rbp,%rax,8),%rcx
  xor    %rcx,(%rdx,%rax,8)
  add    $0x1,%rax
  cmp    %rsi,%rax
  jne    L185
  shl    $0x3,%rsi
  add    %rsi,%rdx
  add    %rsi,%rbp
L300:
  mov    -0x24(%rsp),%eax
  add    %eax,%eax
  cmp    -0x28(%rsp),%eax
  jae    L354
  mov    0x0(%rbp),%eax
  xor    %eax,(%rdx)
  add    $0x4,%rdx
  add    $0x4,%rbp
L354:
  test   %r14d,%r14d
  je     L204
  mov    $0x0,%eax
L332:
  movzbl 0x0(%rbp,%rax,1),%ecx
  xor    %cl,(%rdx,%rax,1)
  add    $0x1,%rax
  cmp    %eax,%r14d
  ja     L332
L204:
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
L351:
  mov    %rdi,%r15
  jmp    L285
L334:
  mov    %rbp,%r8
  jmp    L113
L10:
  mov    $0x0,%eax
  mov    %r9,-0x30(%rsp)
L18:
  movzbl (%r8,%rax,1),%r9d
  xor    %r9b,(%rdx,%rax,1)
  movzbl (%r8,%rax,1),%r9d
  xor    %r9b,(%rcx,%rax,1)
  movzbl (%r8,%rax,1),%r9d
  xor    %r9b,(%rsi,%rax,1)
  movzbl (%r8,%rax,1),%r9d
  xor    %r9b,(%rdi,%rax,1)
  add    $0x1,%rax
  cmp    %eax,%r14d
  ja     L18
  mov    -0x30(%rsp),%r9
  jmp    L156
L69:
  mov    %rbp,%rdi
  jmp    L70
L137:
  mov    $0x0,%eax
L108:
  movzbl (%rdi,%rax,1),%r12d
  xor    %r12b,(%rdx,%rax,1)
  movzbl (%rdi,%rax,1),%r12d
  xor    %r12b,(%rcx,%rax,1)
  add    $0x1,%rax
  cmp    %eax,%r14d
  ja     L108
  jmp    L270
```

assistant: ```c
void of_add_to_multiple_symbols(void **to, const void *from, unsigned int to_size, unsigned int symbol_size) {
  unsigned int i;
  unsigned int symbolSize32;
  unsigned int symbolSize32rem;
  symbolSize32 = symbol_size >> 2;
  symbolSize32rem = symbol_size % 4;
  unsigned int symbolSize64;
  symbolSize64 = symbol_size >> 3;
  unsigned long long *pt1, *pt2, *pt3, *pt4, *pt5, *pt6, *pt7, *pt8, *from_s, from_value;
  while (to_size >= 8) {
    from_s = (unsigned long long *)from;
    pt1 = (unsigned long long *)to[0];
    pt2 = (unsigned long long *)to[1];
    pt3 = (unsigned long long *)to[2];
    pt4 = (unsigned long long *)to[3];
    pt5 = (unsigned long long *)to[4];
    pt6 = (unsigned long long *)to[5];
    pt7 = (unsigned long long *)to[6];
    pt8 = (unsigned long long *)to[7];
    to += 8;
    to_size -= 8;
    for (i = symbolSize64; i > 0; i--) {
      from_value = *from_s;
      *pt1 ^= from_value;
      *pt2 ^= from_value;
      *pt3 ^= from_value;
      *pt4 ^= from_value;
      *pt5 ^= from_value;
      *pt6 ^= from_value;
      *pt7 ^= from_value;
      *pt8 ^= from_value;
      from_s++;
      pt1++;
      pt2++;
      pt3++;
      pt4++;
      pt5++;
      pt6++;
      pt7++;
      pt8++;
    }
    unsigned int *from_s32 = (unsigned int *)from_s;
    from_s32 = (unsigned int *)from_s;
    if ((symbolSize64 << 1) < symbolSize32) {
      (*(unsigned int *)pt1++) ^= *from_s32;
      (*(unsigned int *)pt2++) ^= *from_s32;
      (*(unsigned int *)pt3++) ^= *from_s32;
      (*(unsigned int *)pt4++) ^= *from_s32;
      (*(unsigned int *)pt5++) ^= *from_s32;
      (*(unsigned int *)pt6++) ^= *from_s32;
      (*(unsigned int *)pt7++) ^= *from_s32;
      (*(unsigned int *)pt8++) ^= *from_s32;
      from_s32++;
    }
    if (symbolSize32rem > 0) {
      unsigned char *s8;
      for (i = 0; i < symbolSize32rem; i++) {
        s8 = ((unsigned char *)from_s32 + i);
        (*(unsigned char *)((unsigned char *)pt1 + i)) ^= *(unsigned char *)s8;
        (*(unsigned char *)((unsigned char *)pt2 + i)) ^= *(unsigned char *)s8;
        (*(unsigned char *)((unsigned char *)pt3 + i)) ^= *(unsigned char *)s8;
        (*(unsigned char *)((unsigned char *)pt4 + i)) ^= *(unsigned char *)s8;
        (*(unsigned char *)((unsigned char *)pt5 + i)) ^= *(unsigned char *)s8;
        (*(unsigned char *)((unsigned char *)pt6 + i)) ^= *(unsigned char *)s8;
        (*(unsigned char *)((unsigned char *)pt7 + i)) ^= *(unsigned char *)s8;
        (*(unsigned char *)((unsigned char *)pt8 + i)) ^= *(unsigned char *)s8;
      }
    }
  }
  while (to_size >= 4) {
    unsigned int *from_s32;
    from_s = (unsigned long long *)from;
    pt1 = (unsigned long long *)to[0];
    pt2 = (unsigned long long *)to[1];
    pt3 = (unsigned long long *)to[2];
    pt4 = (unsigned long long *)to[3];
    to += 4;
    to_size -= 4;
    for (i = symbolSize64; i > 0; i--) {
      from_value = *from_s;
      *pt1 ^= from_value;
      *pt2 ^= from_value;
      *pt3 ^= from_value;
      *pt4 ^= from_value;
      from_s++;
      pt1++;
      pt2++;
      pt3++;
      pt4++;
    }
    from_s32 = (unsigned int *)from_s;
    if ((symbolSize64 << 1) < symbolSize32) {
      (*(unsigned int *)pt1++) ^= *from_s32;
      (*(unsigned int *)pt2++) ^= *from_s32;
      (*(unsigned int *)pt3++) ^= *from_s32;
      (*(unsigned int *)pt4++) ^= *from_s32;
      from_s32++;
    }
    if (symbolSize32rem > 0) {
      unsigned char *s8;
      for (i = 0; i < symbolSize32rem; i++) {
        s8 = ((unsigned char *)from_s32 + i);
        (*(unsigned char *)((unsigned char *)pt1 + i)) ^= *(unsigned char *)s8;
        (*(unsigned char *)((unsigned char *)pt2 + i)) ^= *(unsigned char *)s8;
        (*(unsigned char *)((unsigned char *)pt3 + i)) ^= *(unsigned char *)s8;
        (*(unsigned char *)((unsigned char *)pt4 + i)) ^= *(unsigned char *)s8;
      }
    }
  }
  while (to_size >= 2) {
    unsigned int *from_s32;
    from_s = (unsigned long long *)from;
    pt1 = (unsigned long long *)to[0];
    pt2 = (unsigned long long *)to[1];
    to += 2;
    to_size -= 2;
    for (i = symbolSize64; i > 0; i--) {
      *pt1 ^= *from_s;
      *pt2 ^= *from_s;
      from_s++;
      pt1++;
      pt2++;
    }
    from_s32 = (unsigned int *)from_s;
    if ((symbolSize64 << 1) < symbolSize32) {
      (*(unsigned int *)pt1++) ^= *from_s32;
      (*(unsigned int *)pt2++) ^= *from_s32;
      from_s32++;
    }
    if (symbolSize32rem > 0) {
      unsigned char *s8;
      for (i = 0; i < symbolSize32rem; i++) {
        s8 = ((unsigned char *)from_s32 + i);
        (*(unsigned char *)((unsigned char *)pt1 + i)) ^= *(unsigned char *)s8;
        (*(unsigned char *)((unsigned char *)pt2 + i)) ^= *(unsigned char *)s8;
      }
    }
  }
  if (to_size == 0)
    return;
  unsigned long long *t = (unsigned long long *)to[0];
  unsigned long long *f = (unsigned long long *)from;
  for (i = symbolSize64; i > 0; i--) {
    *t ^= *f;
    t++;
    f++;
  }
  unsigned int *t32 = (unsigned int *)t;
  unsigned int *f32 = (unsigned int *)f;
  if ((symbolSize64 << 1) < symbolSize32) {
    *(unsigned int *)t32 ^= *(unsigned int *)f32;
    t32++;
    f32++;
  }
  if (symbolSize32rem > 0) {
    for (i = 0; i < symbolSize32rem; i++) {
      *(unsigned char *)((unsigned char *)t32 + i) ^= *(unsigned char *)((unsigned char *)f32 + i);
    }
  }
}
```