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

```asm
<write_cg_info>:
  endbr64
  push   %r15
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  sub    $0x8,%rsp
  mov    %rdi,%rbx
  mov    %esi,%ebp
  lea    -0x41(%rdx),%eax
  cmp    $0x16,%al
  ja     L10
  movzbl %al,%eax
  lea    D19(%rip),%rcx
  movslq (%rcx,%rax,4),%rax
  add    %rcx,%rax
  notrack jmp *%rax
  lea    D128(%rip),%r12
  mov    $0xf,%r13d
  mov    $0x8,%r14d
  mov    $0x1b58,%r15d
  jmp    L61
  lea    D65(%rip),%r12
  mov    $0xf,%r13d
  mov    $0xb,%r14d
  mov    $0x36b0,%r15d
L61:
  mov    %r15d,%edx
  lea    D36(%rip),%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    %r14d,%edx
  lea    D83(%rip),%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    %r13d,%edx
  lea    D156(%rip),%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    %r12,%rdx
  lea    D31(%rip),%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  lea    D139(%rip),%rdx
  lea    D129(%rip),%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    %ebp,%edi
  call   <ilog2@plt>
  mov    %eax,%edx
  shr    $0x1f,%edx
  lea    (%rdx,%rax,1),%r12d
  sar    %r12d
  mov    %ebp,%edi
  call   <ilog2@plt>
  lea    (%r12,%r12,1),%edx
  cmp    %eax,%edx
  setne  %dil
  movzbl %dil,%edi
  add    %r12d,%edi
  call   <ipow2@plt>
  mov    %eax,%r13d
  mov    %r12d,%edi
  call   <ipow2@plt>
  mov    %eax,%r12d
  mov    %rbx,%rcx
  mov    $0x37,%edx
  mov    $0x1,%esi
  lea    D188(%rip),%rdi
  call   <fwrite@plt>
  mov    %ebp,%edx
  lea    D37(%rip),%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    %r13d,%edx
  lea    D119(%rip),%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  mov    %r12d,%edx
  lea    D97(%rip),%rsi
  mov    %rbx,%rdi
  mov    $0x0,%eax
  call   <fprintf@plt>
  add    $0x8,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  pop    %r15
  ret
  lea    D153(%rip),%r12
  mov    $0x4b,%r13d
  mov    $0xd,%r14d
  mov    $0x124f8,%r15d
  jmp    L61
  lea    D167(%rip),%r12
  mov    $0x4b,%r13d
  mov    $0xf,%r14d
  mov    $0x249f0,%r15d
  jmp    L61
  lea    D106(%rip),%r12
  mov    $0x64,%r13d
  mov    $0x15,%r14d
  mov    $0x16e360,%r15d
  jmp    L61
  lea    D68(%rip),%r12
  mov    $0x64,%r13d
  mov    $0x1a,%r14d
  mov    $0x895440,%r15d
  jmp    L61
L10:
  movsbl %dl,%esi
  lea    D45(%rip),%rdi
  call   <printf@plt>
  mov    $0x1,%edi
  call   <exit@plt>
  jmp    L61
  lea    D107(%rip),%r12
  mov    $0xf,%r13d
  mov    $0x7,%r14d
  mov    $0x578,%r15d
  jmp    L61
```

tool_calls: name: unpack_data
arguments: tag: D128
datatype: string
name: unpack_data
arguments: tag: D65
datatype: string
name: unpack_data
arguments: tag: D36
datatype: string
name: unpack_data
arguments: tag: D83
datatype: string
name: unpack_data
arguments: tag: D156
datatype: string
name: unpack_data
arguments: tag: D31
datatype: string
name: unpack_data
arguments: tag: D139
datatype: string
name: unpack_data
arguments: tag: D129
datatype: string
name: unpack_data
arguments: tag: D188
datatype: string
name: unpack_data
arguments: tag: D37
datatype: string
name: unpack_data
arguments: tag: D119
datatype: string
name: unpack_data
arguments: tag: D97
datatype: string
name: unpack_data
arguments: tag: D153
datatype: string
name: unpack_data
arguments: tag: D167
datatype: string
name: unpack_data
arguments: tag: D106
datatype: string
name: unpack_data
arguments: tag: D68
datatype: string
name: unpack_data
arguments: tag: D45
datatype: string
name: unpack_data
arguments: tag: D107
datatype: string

tool: D128: 12.

tool: D65: 20.

tool: D36: const int na = %d;


tool: D83: const int nonzer = %d;


tool: D156: const int niter = %d;


tool: D31: const double shift = %s;


tool: D139: 1.0e-1

tool: D129: const double rcond = %s;


tool: D188: 
// number of nodes for which this version is compiled


tool: D37: const int nnodes_compiled = %d;


tool: D119: const int num_proc_cols = %d;


tool: D97: const int num_proc_rows = %d;


tool: D153: 60.

tool: D167: 110.

tool: D106: 500.

tool: D68: 1.5e3

tool: D45: setparams: Internal error: invalid class type %c


tool: D107: 10.

assistant: ```c
void write_cg_info(FILE *fp, int nprocs, char class) {
  int na, nonzer, niter;
  char *shift, *rcond = "1.0e-1";
  char *shiftS = "10.", *shiftW = "12.", *shiftA = "20.", *shiftB = "60.", *shiftC = "110.", *shiftD = "500.", *shiftE = "1.5e3";
  int num_proc_cols, num_proc_rows;
  if (class == 'S') {
    na = 1400;
    nonzer = 7;
    niter = 15;
    shift = shiftS;
  } else if (class == 'W') {
    na = 7000;
    nonzer = 8;
    niter = 15;
    shift = shiftW;
  } else if (class == 'A') {
    na = 14000;
    nonzer = 11;
    niter = 15;
    shift = shiftA;
  } else if (class == 'B') {
    na = 75000;
    nonzer = 13;
    niter = 75;
    shift = shiftB;
  } else if (class == 'C') {
    na = 150000;
    nonzer = 15;
    niter = 75;
    shift = shiftC;
  } else if (class == 'D') {
    na = 1500000;
    nonzer = 21;
    niter = 100;
    shift = shiftD;
  } else if (class == 'E') {
    na = 9000000;
    nonzer = 26;
    niter = 100;
    shift = shiftE;
  } else {
    printf("setparams: Internal error: invalid class type %c\n", class);
    exit(1);
  }
  fprintf(fp, "const int na = %d;\n", na);
  fprintf(fp, "const int nonzer = %d;\n", nonzer);
  fprintf(fp, "const int niter = %d;\n", niter);
  fprintf(fp, "const double shift = %s;\n", shift);
  fprintf(fp, "const double rcond = %s;\n", rcond);
  num_proc_cols = num_proc_rows = ilog2(nprocs) / 2;
  if (num_proc_cols + num_proc_rows != ilog2(nprocs))
    num_proc_cols += 1;
  num_proc_cols = ipow2(num_proc_cols);
  num_proc_rows = ipow2(num_proc_rows);
  fprintf(fp, "\n// number of nodes for which this version is compiled\n");
  fprintf(fp, "const int nnodes_compiled = %d;\n", nprocs);
  fprintf(fp, "const int num_proc_cols = %d;\n", num_proc_cols);
  fprintf(fp, "const int num_proc_rows = %d;\n", num_proc_rows);
}
```