user: What is the c source code of the assembly code below?

```asm
<__memchr>:
  endbr64
  mov    %rdi,%rax
  mov    %esi,%ecx
  test   %rdx,%rdx
  je     L287
  test   $0x7,%al
  je     L110
L213:
  cmp    %cl,(%rax)
  je     L249
  add    $0x1,%rax
  sub    $0x1,%rdx
  je     L145
  test   $0x7,%al
  jne    L213
L110:
  movzbl %sil,%esi
  mov    %esi,%edi
  shl    $0x8,%edi
  or     %edi,%esi
  movslq %esi,%rsi
  mov    %rsi,%r10
  shl    $0x10,%r10
  or     %rsi,%r10
  mov    D1(%rip),%rsi
  mov    (%rsi),%r8d
  sar    %r8d
  and    $0xfefefeff,%r8d
  cmp    $0x7,%rdx
  ja     L206
L161:
  test   %rdx,%rdx
  je     L277
  add    %rax,%rdx
  mov    %rax,%r9
L98:
  cmp    %cl,(%r9)
  je     L78
  add    $0x1,%r9
  cmp    %rdx,%r9
  jne    L98
  mov    $0x0,%r9d
  jmp    L78
L283:
  lea    -0x7(%rax),%r9
  jmp    L78
L225:
  lea    -0x6(%rax),%r9
  jmp    L78
L181:
  lea    -0x5(%rax),%r9
  jmp    L78
L118:
  lea    -0x4(%rax),%r9
  jmp    L78
L299:
  lea    -0x3(%rax),%r9
  jmp    L78
L87:
  lea    -0x2(%rax),%r9
  jmp    L78
L115:
  sub    $0x8,%rdx
  cmp    $0x7,%rdx
  jbe    L161
L206:
  mov    %rax,%r9
  add    $0x8,%rax
  mov    %r10,%rdi
  xor    -0x8(%rax),%rdi
  lea    (%r8,%rdi,1),%rsi
  xor    %rdi,%rsi
  or     %r8,%rsi
  cmp    $0xffffffffffffffff,%rsi
  je     L115
  cmp    %cl,-0x8(%rax)
  je     L78
  cmp    %cl,-0x7(%rax)
  je     L283
  cmp    %cl,-0x6(%rax)
  je     L225
  cmp    %cl,-0x5(%rax)
  je     L181
  cmp    %cl,-0x4(%rax)
  je     L118
  cmp    %cl,-0x3(%rax)
  je     L299
  cmp    %cl,-0x2(%rax)
  je     L87
  cmp    %cl,-0x1(%rax)
  jne    L115
  lea    -0x1(%rax),%r9
  jmp    L78
L287:
  mov    $0x0,%r9d
  jmp    L78
L249:
  mov    %rax,%r9
L78:
  mov    %r9,%rax
  ret
L145:
  mov    $0x0,%r9d
  jmp    L78
L277:
  mov    $0x0,%r9d
  jmp    L78
```

assistant: ```c
void *__memchr(void const *s, int c_in, size_t n) {
  const unsigned char *char_ptr;
  const unsigned long int *longword_ptr;
  unsigned long int longword, magic_bits, charmask;
  unsigned char c;
  int i;
  c = (unsigned char)c_in;
  for (char_ptr = (const unsigned char *)s; n > 0 && (size_t)char_ptr % sizeof longword != 0; --n, ++char_ptr)
    if (*char_ptr == c)
      return (void *)char_ptr;
  longword_ptr = (const unsigned long int *)char_ptr;
  magic_bits = 0xfefefefe;
  charmask = c | (c << 8);
  charmask |= charmask << 16;
  magic_bits = (ULONG_MAX >> 1) & (magic_bits | 1);
  while (n >= sizeof longword) {
    longword = *longword_ptr++ ^ charmask;
    if ((((longword + magic_bits) ^ ~longword) & ~magic_bits) != 0) {
      const unsigned char *cp = (const unsigned char *)(longword_ptr - 1);
      if (cp[0] == c)
        return (void *)cp;
      if (cp[1] == c)
        return (void *)&cp[1];
      if (cp[2] == c)
        return (void *)&cp[2];
      if (cp[3] == c)
        return (void *)&cp[3];
      if (4 < sizeof longword && cp[4] == c)
        return (void *)&cp[4];
      if (5 < sizeof longword && cp[5] == c)
        return (void *)&cp[5];
      if (6 < sizeof longword && cp[6] == c)
        return (void *)&cp[6];
      if (7 < sizeof longword && cp[7] == c)
        return (void *)&cp[7];
      if (8 < sizeof longword)
        for (i = 8; i < sizeof longword; i++)
          if (cp[i] == c)
            return (void *)&cp[i];
    }
    n -= sizeof longword;
  }
  char_ptr = (const unsigned char *)longword_ptr;
  while (n-- > 0) {
    if (*char_ptr == c)
      return (void *)char_ptr;
    else
      ++char_ptr;
  }
  return 0;
}
```