user: 下面的汇编指令对应的C源代码是什么：

```asm
<arch__cpuinfo_freq>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %rbx
  sub    $0x48,%rsp
  mov    %rdi,-0x48(%rbp)
  mov    %rsi,-0x50(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x18(%rbp)
  xor    %eax,%eax
  movq   $0x0,-0x38(%rbp)
  movq   $0x0,-0x30(%rbp)
  movl   $0xffffffff,-0x3c(%rbp)
  lea    D33(%rip),%rax
  mov    %rax,%rsi
  lea    D25(%rip),%rax
  mov    %rax,%rdi
  call   <fopen@plt>
  mov    %rax,-0x28(%rbp)
  cmpq   $0x0,-0x28(%rbp)
  jne    L99
  mov    $0xffffffff,%eax
  jmp    L91
L56:
  mov    -0x38(%rbp),%rax
  mov    $0x5,%edx
  lea    D83(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L79
  jmp    L99
L79:
  mov    -0x38(%rbp),%rbx
  mov    -0x38(%rbp),%rax
  lea    D88(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcspn@plt>
  cltq
  add    $0x1,%rax
  lea    (%rbx,%rax,1),%rdi
  mov    -0x50(%rbp),%rdx
  mov    -0x48(%rbp),%rax
  mov    %rdx,%rcx
  mov    %rax,%rdx
  lea    D11(%rip),%rax
  mov    %rax,%rsi
  call   <sscanf@plt>
  cmp    $0x2,%eax
  jne    L99
  mov    -0x50(%rbp),%rax
  lea    D39(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcasecmp@plt>
  test   %rax,%rax
  jne    L155
  mov    -0x48(%rbp),%rax
  movsd  (%rax),%xmm1
  movsd  D97(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  mov    -0x48(%rbp),%rax
  movsd  %xmm0,(%rax)
  jmp    L21
L155:
  mov    -0x50(%rbp),%rax
  lea    D16(%rip),%rdx
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <strcasecmp@plt>
  test   %rax,%rax
  jne    L21
  mov    -0x48(%rbp),%rax
  movsd  (%rax),%xmm1
  movsd  D102(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  mov    -0x48(%rbp),%rax
  movsd  %xmm0,(%rax)
  jmp    L21
L99:
  mov    -0x28(%rbp),%rdx
  lea    -0x30(%rbp),%rcx
  lea    -0x38(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <getline@plt>
  test   %rax,%rax
  jg     L56
  jmp    L166
L21:
  nop
  jmp    L166
L159:
  mov    -0x38(%rbp),%rax
  mov    $0x6,%edx
  lea    D95(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  je     L84
  jmp    L166
L84:
  mov    -0x38(%rbp),%rax
  mov    $0x3a,%esi
  mov    %rax,%rdi
  call   <strchr@plt>
  mov    %rax,-0x20(%rbp)
  mov    -0x38(%rbp),%rdx
  mov    -0x20(%rbp),%rax
  sub    %rdx,%rax
  add    $0x2,%rax
  mov    %rax,%rdx
  mov    -0x30(%rbp),%rax
  cmp    %rax,%rdx
  jae    L166
  mov    -0x20(%rbp),%rax
  add    $0x2,%rax
  mov    $0x7,%edx
  lea    D71(%rip),%rcx
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <strncmp@plt>
  test   %rax,%rax
  jne    L166
  movl   $0x0,-0x3c(%rbp)
  jmp    L163
L166:
  mov    -0x28(%rbp),%rdx
  lea    -0x30(%rbp),%rcx
  lea    -0x38(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <getline@plt>
  test   %rax,%rax
  jg     L159
L163:
  mov    -0x38(%rbp),%rax
  mov    %rax,%rdi
  call   <free@plt>
  mov    -0x28(%rbp),%rax
  mov    %rax,%rdi
  call   <fclose@plt>
  mov    -0x3c(%rbp),%eax
L91:
  mov    -0x18(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L24
  call   <__stack_chk_fail@plt>
L24:
  mov    -0x8(%rbp),%rbx
  leave
  ret
```

tool_calls: name: parse_data
arguments: tag: D33
type: string
name: parse_data
arguments: tag: D25
type: string
name: parse_data
arguments: tag: D83
type: string
name: parse_data
arguments: tag: D88
type: string
name: parse_data
arguments: tag: D11
type: string
name: parse_data
arguments: tag: D39
type: string
name: parse_data
arguments: tag: D97
type: byte[8]
name: parse_data
arguments: tag: D16
type: string
name: parse_data
arguments: tag: D102
type: byte[8]
name: parse_data
arguments: tag: D95
type: string
name: parse_data
arguments: tag: D71
type: string

tool: D33: r

tool: D25: /proc/cpuinfo

tool: D83: clock

tool: D88: :

tool: D11: %lf%10s

tool: D39: GHz

tool: {"D97": [0x00,0x00,0x00,0x00,0x65,0xcd,0xcd,0x41]}

tool: D16: MHz

tool: {"D102": [0x00,0x00,0x00,0x00,0x80,0x84,0x2e,0x41]}

tool: D95: platform

tool: D71: pSeries

assistant: ```c
int arch__cpuinfo_freq(double *freq, char *unit) {
  FILE *f;
  char *line = NULL, *c;
  size_t len = 0;
  int ret = -1;
  if ((f = fopen("/proc/cpuinfo", "r")) == NULL) {
    return -1;
  }
  while (getline(&line, &len, f) > 0) {
    if (strncmp(line, "clock", sizeof("clock") - 1)) {
      continue;
    }
    if (sscanf(line + strcspn(line, ":") + 1, "%lf%10s", freq, unit) == 2) {
      if (strcasecmp(unit, "GHz") == 0) {
        *freq *= 1000000000;
      } else if (strcasecmp(unit, "MHz") == 0) {
        *freq *= 1000000;
      }
      break;
    }
  }
  while (getline(&line, &len, f) > 0) {
    if (strncmp(line, "platform", sizeof("sizeof") - 1)) {
      continue;
    }
    c = strchr(line, ':');
    if (c - line + 2 < len && !strncmp(c + 2, "pSeries", sizeof("pSeries") - 1)) {
      ret = 0;
      break;
    }
  }
  free(line);
  fclose(f);
  return ret;
}
```