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

```asm
<memset>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  mov    %rdi,-0x28(%rbp)
  mov    %esi,-0x2c(%rbp)
  mov    %rdx,-0x38(%rbp)
  mov    -0x28(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  mov    -0x2c(%rbp),%eax
  and    $0xff,%eax
  mov    %eax,-0x1c(%rbp)
  jmp    L118
L82:
  mov    -0x38(%rbp),%rax
  lea    -0x1(%rax),%rdx
  mov    %rdx,-0x38(%rbp)
  test   %rax,%rax
  je     L92
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  mov    -0x2c(%rbp),%edx
  mov    %dl,(%rax)
  jmp    L118
L92:
  mov    -0x28(%rbp),%rax
  jmp    L90
L118:
  mov    -0x18(%rbp),%rax
  and    $0x7,%eax
  test   %rax,%rax
  jne    L82
  cmpq   $0x7,-0x38(%rbp)
  jbe    L136
  mov    -0x18(%rbp),%rax
  mov    %rax,-0x10(%rbp)
  mov    -0x1c(%rbp),%eax
  shl    $0x8,%eax
  or     -0x1c(%rbp),%eax
  mov    %eax,%eax
  mov    %rax,-0x8(%rbp)
  movl   $0x10,-0x20(%rbp)
  jmp    L120
L55:
  mov    -0x20(%rbp),%eax
  mov    -0x8(%rbp),%rdx
  mov    %eax,%ecx
  shl    %cl,%rdx
  mov    %rdx,%rax
  or     %rax,-0x8(%rbp)
  shll   -0x20(%rbp)
L120:
  mov    -0x20(%rbp),%eax
  cmp    $0x3f,%eax
  jbe    L55
  jmp    L135
L11:
  mov    -0x10(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  mov    -0x8(%rbp),%rdx
  mov    %rdx,(%rax)
  mov    -0x10(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  mov    -0x8(%rbp),%rdx
  mov    %rdx,(%rax)
  mov    -0x10(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  mov    -0x8(%rbp),%rdx
  mov    %rdx,(%rax)
  mov    -0x10(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  mov    -0x8(%rbp),%rdx
  mov    %rdx,(%rax)
  subq   $0x20,-0x38(%rbp)
L135:
  cmpq   $0x1f,-0x38(%rbp)
  ja     L11
  jmp    L18
L100:
  mov    -0x10(%rbp),%rax
  lea    0x8(%rax),%rdx
  mov    %rdx,-0x10(%rbp)
  mov    -0x8(%rbp),%rdx
  mov    %rdx,(%rax)
  subq   $0x8,-0x38(%rbp)
L18:
  cmpq   $0x7,-0x38(%rbp)
  ja     L100
  mov    -0x10(%rbp),%rax
  mov    %rax,-0x18(%rbp)
  jmp    L136
L40:
  mov    -0x18(%rbp),%rax
  lea    0x1(%rax),%rdx
  mov    %rdx,-0x18(%rbp)
  mov    -0x2c(%rbp),%edx
  mov    %dl,(%rax)
L136:
  mov    -0x38(%rbp),%rax
  lea    -0x1(%rax),%rdx
  mov    %rdx,-0x38(%rbp)
  test   %rax,%rax
  jne    L40
  mov    -0x28(%rbp),%rax
L90:
  pop    %rbp
  ret
```

assistant: ```c
__attribute__((__optimize__("-fno-tree-loop-distribute-patterns"))) void *memset(void *addr_, int c, size_t n) {
  char *addr = addr_;
  unsigned long *aligned_addr;
  unsigned long buffer;
  unsigned int d = c & 0xff;
  while (((unsigned long)(uintptr_t)addr & (sizeof(unsigned long) - 1))) {
    if (n--) {
      *addr++ = (char)c;
    } else {
      return addr_;
    }
  }
  if (n >= (sizeof(unsigned long))) {
    aligned_addr = (unsigned long *)addr;
    buffer = (d << 8) | d;
    for (int i = 16; i < (sizeof(unsigned long)) * 8; i <<= 1) {
      buffer |= (buffer << i);
    }
    for (; n >= (sizeof(unsigned long)) * 4; n -= (sizeof(unsigned long)) * 4) {
      *aligned_addr++ = buffer;
      *aligned_addr++ = buffer;
      *aligned_addr++ = buffer;
      *aligned_addr++ = buffer;
    }
    for (; n >= (sizeof(unsigned long)); n -= (sizeof(unsigned long))) {
      *aligned_addr++ = buffer;
    }
    addr = (char *)aligned_addr;
  }
  while (n--) {
    *addr++ = (char)c;
  }
  return addr_;
}
```