user: 这段汇编代码用C语言表示是什么样的：

```asm
<__memchr>:
  endbr64
  mov    %rdi,%rax
  mov    %esi,%ecx
  test   %rdx,%rdx
  jne    L155
  jmp    L45
  nopl   0x0(%rax,%rax,1)
L122:
  cmp    %cl,(%rax)
  je     L37
  add    $0x1,%rax
  sub    $0x1,%rdx
  je     L45
L155:
  test   $0x7,%al
  jne    L122
  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    D5(%rip),%rsi
  mov    (%rsi),%r9d
  sar    %r9d
  and    $0xfefefeff,%r9d
  cmp    $0x7,%rdx
  ja     L141
  jmp    L72
  nopl   0x0(%rax)
L178:
  mov    %rsi,%rdx
L141:
  mov    %rax,%r8
  lea    0x8(%rax),%rax
  mov    (%r8),%rdi
  xor    %r10,%rdi
  lea    (%r9,%rdi,1),%rsi
  xor    %rdi,%rsi
  or     %r9,%rsi
  cmp    $0xffffffffffffffff,%rsi
  je     L51
  cmp    %cl,-0x8(%rax)
  je     L80
  cmp    %cl,-0x7(%rax)
  je     L131
  cmp    %cl,-0x6(%rax)
  je     L174
  cmp    %cl,-0x5(%rax)
  je     L170
  cmp    %cl,-0x4(%rax)
  je     L28
  cmp    %cl,-0x3(%rax)
  je     L24
  cmp    %cl,-0x2(%rax)
  je     L98
  cmp    %cl,-0x1(%rax)
  je     L181
L51:
  lea    -0x8(%rdx),%rsi
  cmp    $0x7,%rsi
  ja     L178
  sub    $0x9,%rdx
  test   %rsi,%rsi
  je     L45
L285:
  mov    %rax,%r8
  lea    0x1(%rax,%rdx,1),%rax
  jmp    L42
  nopl   (%rax)
L263:
  add    $0x1,%r8
  cmp    %rax,%r8
  je     L45
L42:
  cmp    %cl,(%r8)
  jne    L263
L80:
  mov    %r8,%rax
  ret
  nopw   0x0(%rax,%rax,1)
L45:
  xor    %r8d,%r8d
  mov    %r8,%rax
  ret
  nopw   0x0(%rax,%rax,1)
L37:
  mov    %rax,%r8
  mov    %r8,%rax
  ret
L131:
  add    $0x1,%r8
  jmp    L80
L174:
  add    $0x2,%r8
  jmp    L80
L170:
  add    $0x3,%r8
  jmp    L80
L28:
  add    $0x4,%r8
  jmp    L80
L24:
  add    $0x5,%r8
  jmp    L80
L98:
  add    $0x6,%r8
  jmp    L80
L181:
  add    $0x7,%r8
  jmp    L80
L72:
  sub    $0x1,%rdx
  jmp    L285
```

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;
}
```