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

```asm
<__xorpowerset>:
  endbr64
  movzbl (%rsi),%eax
  movzbl (%rdx),%r8d
  cmp    $0x1,%rcx
  jbe    L80
  lea    0x1(%rsi),%r9
  mov    %rdi,%r8
  lea    -0x1(%rcx),%rax
  sub    %r9,%r8
  cmp    $0xe,%r8
  seta   %r9b
  cmp    $0x6,%rax
  seta   %r8b
  test   %r8b,%r9b
  je     L153
  lea    0x1(%rdx),%r9
  mov    %rdi,%r8
  sub    %r9,%r8
  cmp    $0xe,%r8
  jbe    L153
  mov    %rcx,%r8
  cmp    $0xe,%rax
  jbe    L150
  and    $0xfffffffffffffff0,%r8
  xor    %eax,%eax
  nopl   0x0(%rax,%rax,1)
L35:
  movdqu (%rsi,%rax,1),%xmm0
  movdqu (%rdx,%rax,1),%xmm2
  pxor   %xmm2,%xmm0
  movups %xmm0,(%rdi,%rax,1)
  add    $0x10,%rax
  cmp    %rax,%r8
  jne    L35
  mov    %rcx,%rax
  and    $0xfffffffffffffff0,%rax
  test   $0xf,%cl
  je     L117
  mov    %rcx,%r8
  sub    %rax,%r8
  lea    -0x1(%r8),%r9
  cmp    $0x6,%r9
  jbe    L71
L137:
  movq   (%rsi,%rax,1),%xmm0
  movq   (%rdx,%rax,1),%xmm1
  mov    %r8,%r9
  and    $0xfffffffffffffff8,%r9
  pxor   %xmm1,%xmm0
  movq   %xmm0,(%rdi,%rax,1)
  add    %r9,%rax
  cmp    %r9,%r8
  je     L117
L71:
  movzbl (%rsi,%rax,1),%r8d
  xor    (%rdx,%rax,1),%r8b
  mov    %r8b,(%rdi,%rax,1)
  lea    0x1(%rax),%r8
  cmp    %r8,%rcx
  jbe    L117
  movzbl 0x1(%rsi,%rax,1),%r8d
  xor    0x1(%rdx,%rax,1),%r8b
  mov    %r8b,0x1(%rdi,%rax,1)
  lea    0x2(%rax),%r8
  cmp    %r8,%rcx
  jbe    L117
  movzbl 0x2(%rsi,%rax,1),%r8d
  xor    0x2(%rdx,%rax,1),%r8b
  mov    %r8b,0x2(%rdi,%rax,1)
  lea    0x3(%rax),%r8
  cmp    %r8,%rcx
  jbe    L117
  movzbl 0x3(%rsi,%rax,1),%r8d
  xor    0x3(%rdx,%rax,1),%r8b
  mov    %r8b,0x3(%rdi,%rax,1)
  lea    0x4(%rax),%r8
  cmp    %r8,%rcx
  jbe    L117
  movzbl 0x4(%rsi,%rax,1),%r8d
  xor    0x4(%rdx,%rax,1),%r8b
  mov    %r8b,0x4(%rdi,%rax,1)
  lea    0x5(%rax),%r8
  cmp    %r8,%rcx
  jbe    L117
  movzbl 0x5(%rsi,%rax,1),%r8d
  xor    0x5(%rdx,%rax,1),%r8b
  mov    %r8b,0x5(%rdi,%rax,1)
  lea    0x6(%rax),%r8
  cmp    %r8,%rcx
  jbe    L117
  movzbl 0x6(%rsi,%rax,1),%ecx
  xor    0x6(%rdx,%rax,1),%cl
  mov    %cl,0x6(%rdi,%rax,1)
  ret
  nopw   0x0(%rax,%rax,1)
L153:
  xor    %eax,%eax
  nopw   0x0(%rax,%rax,1)
L122:
  movzbl (%rsi,%rax,1),%r8d
  xor    (%rdx,%rax,1),%r8b
  mov    %r8b,(%rdi,%rax,1)
  add    $0x1,%rax
  cmp    %rax,%rcx
  jne    L122
L117:
  ret
  nopw   0x0(%rax,%rax,1)
L80:
  xor    %r8d,%eax
  mov    %eax,%edx
  and    $0x1,%edx
  test   %rcx,%rcx
  cmovne %edx,%eax
  mov    %al,(%rdi)
  ret
L150:
  xor    %eax,%eax
  jmp    L137
```

assistant: ```c
void __xorpowerset(out, left, right, bitlength) unsigned char *out;
unsigned char *left;
unsigned char *right;
unsigned long bitlength;
{
  if (bitlength <= sizeof(char)) {
    *((unsigned char *)out) = *((unsigned char *)left) ^ *((unsigned char *)right);
    {
      if (bitlength)
        *((unsigned char *)out) &= ~((~0) << (bitlength));
    };
  } else if (bitlength <= (sizeof(char) * sizeof(unsigned char))) {
    *((unsigned char *)out) = *((unsigned char *)left) ^ *((unsigned char *)right);
    {
      if (bitlength)
        *((unsigned char *)out) &= ~((~0) << (bitlength));
    };
  } else {
    unsigned long len = (((bitlength) + ((sizeof(char) * sizeof(unsigned char)) - 1)) / (sizeof(char) * sizeof(unsigned char)));
    register unsigned long i;
    for (i = 0; i < len; i++)
      out[i] = left[i] ^ right[i];
    {
      if (bitlength % (sizeof(char) * sizeof(unsigned char)))
        *((out + len - 1)) &= ~((~0) << (bitlength % (sizeof(char) * sizeof(unsigned char))));
    };
  }
}
```