user: 请从给定的汇编指令推导出C源代码：

```asm
<main>:
  endbr64
  push   %rbx
  lea    D441(%rip),%rbx
  mov    %rbx,%rdi
  call   <puts@plt>
  lea    D469(%rip),%rdi
  call   <puts@plt>
  mov    %rbx,%rdi
  call   <puts@plt>
  mov    $0x0,%edi
  call   <check_sdot@plt>
  mov    %eax,%esi
  lea    D21(%rip),%rdi
  call   <test_function@plt>
  test   %rax,%rax
  setne  %bl
  movzbl %bl,%ebx
  mov    $0x0,%edi
  call   <check_saxpy@plt>
  mov    %eax,%esi
  lea    D3(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_srotg@plt>
  mov    %eax,%esi
  lea    D304(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_srot@plt>
  mov    %eax,%esi
  lea    D291(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_scopy@plt>
  mov    %eax,%esi
  lea    D337(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_sswap@plt>
  mov    %eax,%esi
  lea    D55(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_snrm2@plt>
  mov    %eax,%esi
  lea    D445(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_sasum@plt>
  mov    %eax,%esi
  lea    D14(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_sscal@plt>
  mov    %eax,%esi
  lea    D233(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_isamax@plt>
  mov    %eax,%esi
  lea    D483(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_srotmg@plt>
  mov    %eax,%esi
  lea    D356(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_srotm@plt>
  mov    %eax,%esi
  lea    D223(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_sdsdot@plt>
  mov    %eax,%esi
  lea    D439(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_ddot@plt>
  mov    %eax,%esi
  lea    D40(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_daxpy@plt>
  mov    %eax,%esi
  lea    D263(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_drotg@plt>
  mov    %eax,%esi
  lea    D48(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_drot@plt>
  mov    %eax,%esi
  lea    D370(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_dcopy@plt>
  mov    %eax,%esi
  lea    D505(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_dswap@plt>
  mov    %eax,%esi
  lea    D131(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_dnrm2@plt>
  mov    %eax,%esi
  lea    D34(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_dasum@plt>
  mov    %eax,%esi
  lea    D448(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_dscal@plt>
  mov    %eax,%esi
  lea    D329(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_idamax@plt>
  mov    %eax,%esi
  lea    D30(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_drotmg@plt>
  mov    %eax,%esi
  lea    D270(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_drotm@plt>
  mov    %eax,%esi
  lea    D68(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_dsdot@plt>
  mov    %eax,%esi
  lea    D423(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_cdotc@plt>
  mov    %eax,%esi
  lea    D409(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_cdotu@plt>
  mov    %eax,%esi
  lea    D221(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_caxpy@plt>
  mov    %eax,%esi
  lea    D167(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_ccopy@plt>
  mov    %eax,%esi
  lea    D392(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_cswap@plt>
  mov    %eax,%esi
  lea    D65(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_scnrm2@plt>
  mov    %eax,%esi
  lea    D161(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_scasum@plt>
  mov    %eax,%esi
  lea    D137(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_cscal@plt>
  mov    %eax,%esi
  lea    D206(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_csscal@plt>
  mov    %eax,%esi
  lea    D12(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_icamax@plt>
  mov    %eax,%esi
  lea    D15(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_zdotc@plt>
  mov    %eax,%esi
  lea    D192(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_zdotu@plt>
  mov    %eax,%esi
  lea    D401(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_zaxpy@plt>
  mov    %eax,%esi
  lea    D357(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_zcopy@plt>
  mov    %eax,%esi
  lea    D182(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_zswap@plt>
  mov    %eax,%esi
  lea    D117(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_dznrm2@plt>
  mov    %eax,%esi
  lea    D230(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_dzasum@plt>
  mov    %eax,%esi
  lea    D312(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_zscal@plt>
  mov    %eax,%esi
  lea    D381(%rip),%rdi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%ebx
  mov    $0x0,%edi
  call   <check_zdscal@plt>
  mov    %eax,%esi
  lea    D69(%rip),%rdi
  call   <test_function@plt>
  test   %rax,%rax
  je     L59
  add    $0x1,%ebx
  mov    $0x0,%edi
  call   <check_izamax@plt>
  mov    %eax,%esi
  lea    D521(%rip),%rdi
  call   <test_function@plt>
  test   %rax,%rax
  je     L60
L69:
  add    $0x1,%ebx
  lea    D441(%rip),%rdi
  call   <puts@plt>
L30:
  cmp    $0x1,%ebx
  je     L32
  mov    %ebx,%esi
  lea    D502(%rip),%rdi
  mov    $0x0,%eax
  call   <printf@plt>
L52:
  mov    %ebx,%eax
  pop    %rbx
  ret
L59:
  mov    $0x0,%edi
  call   <check_izamax@plt>
  mov    %eax,%esi
  lea    D521(%rip),%rdi
  call   <test_function@plt>
  test   %rax,%rax
  jne    L69
  lea    D441(%rip),%rdi
  call   <puts@plt>
  test   %ebx,%ebx
  jne    L30
  lea    D410(%rip),%rdi
  call   <puts@plt>
  jmp    L52
L32:
  lea    D186(%rip),%rdi
  call   <puts@plt>
  jmp    L52
L60:
  lea    D441(%rip),%rdi
  call   <puts@plt>
  jmp    L30
```

tool_calls: name: parse_data
arguments: data_tag: D441
datatype: string
name: parse_data
arguments: data_tag: D469
datatype: string
name: parse_data
arguments: data_tag: D21
datatype: string
name: parse_data
arguments: data_tag: D3
datatype: string
name: parse_data
arguments: data_tag: D304
datatype: string
name: parse_data
arguments: data_tag: D291
datatype: string
name: parse_data
arguments: data_tag: D337
datatype: string
name: parse_data
arguments: data_tag: D55
datatype: string
name: parse_data
arguments: data_tag: D445
datatype: string
name: parse_data
arguments: data_tag: D14
datatype: string
name: parse_data
arguments: data_tag: D233
datatype: string
name: parse_data
arguments: data_tag: D483
datatype: string
name: parse_data
arguments: data_tag: D356
datatype: string
name: parse_data
arguments: data_tag: D223
datatype: string
name: parse_data
arguments: data_tag: D439
datatype: string
name: parse_data
arguments: data_tag: D40
datatype: string
name: parse_data
arguments: data_tag: D263
datatype: string
name: parse_data
arguments: data_tag: D48
datatype: string
name: parse_data
arguments: data_tag: D370
datatype: string
name: parse_data
arguments: data_tag: D505
datatype: string
name: parse_data
arguments: data_tag: D131
datatype: string
name: parse_data
arguments: data_tag: D34
datatype: string
name: parse_data
arguments: data_tag: D448
datatype: string
name: parse_data
arguments: data_tag: D329
datatype: string
name: parse_data
arguments: data_tag: D30
datatype: string
name: parse_data
arguments: data_tag: D270
datatype: string
name: parse_data
arguments: data_tag: D68
datatype: string
name: parse_data
arguments: data_tag: D423
datatype: string
name: parse_data
arguments: data_tag: D409
datatype: string
name: parse_data
arguments: data_tag: D221
datatype: string
name: parse_data
arguments: data_tag: D167
datatype: string
name: parse_data
arguments: data_tag: D392
datatype: string
name: parse_data
arguments: data_tag: D65
datatype: string
name: parse_data
arguments: data_tag: D161
datatype: string
name: parse_data
arguments: data_tag: D137
datatype: string
name: parse_data
arguments: data_tag: D206
datatype: string
name: parse_data
arguments: data_tag: D12
datatype: string
name: parse_data
arguments: data_tag: D15
datatype: string
name: parse_data
arguments: data_tag: D192
datatype: string
name: parse_data
arguments: data_tag: D401
datatype: string
name: parse_data
arguments: data_tag: D357
datatype: string
name: parse_data
arguments: data_tag: D182
datatype: string
name: parse_data
arguments: data_tag: D117
datatype: string
name: parse_data
arguments: data_tag: D230
datatype: string
name: parse_data
arguments: data_tag: D312
datatype: string
name: parse_data
arguments: data_tag: D381
datatype: string
name: parse_data
arguments: data_tag: D69
datatype: string
name: parse_data
arguments: data_tag: D521
datatype: string
name: parse_data
arguments: data_tag: D502
datatype: string
name: parse_data
arguments: data_tag: D410
datatype: string
name: parse_data
arguments: data_tag: D186
datatype: string

tool: D441:  ---------------------------

tool: D469:       CoBLAS Test Suite     

tool: D21: cblas_sdot  

tool: D3: cblas_saxpy 

tool: D304: cblas_srotg 

tool: D291: cblas_srot  

tool: D337: cblas_scopy 

tool: D55: cblas_sswap 

tool: D445: cblas_snrm2 

tool: D14: cblas_sasum 

tool: D233: cblas_sscal 

tool: D483: cblas_isamax

tool: D356: cblas_srotmg

tool: D223: cblas_srotm 

tool: D439: cblas_sdsdot

tool: D40: cblas_ddot  

tool: D263: cblas_daxpy 

tool: D48: cblas_drotg 

tool: D370: cblas_drot  

tool: D505: cblas_dcopy 

tool: D131: cblas_dswap 

tool: D34: cblas_dnrm2 

tool: D448: cblas_dasum 

tool: D329: cblas_dscal 

tool: D30: cblas_idamax

tool: D270: cblas_drotmg

tool: D68: cblas_drotm 

tool: D423: cblas_dsdot 

tool: D409: cblas_cdotc 

tool: D221: cblas_cdotu 

tool: D167: cblas_caxpy 

tool: D392: cblas_ccopy 

tool: D65: cblas_cswap 

tool: D161: cblas_scnrm2

tool: D137: cblas_scasum

tool: D206: cblas_cscal 

tool: D12: cblas_csscal

tool: D15: cblas_icamax

tool: D192: cblas_zdotc 

tool: D401: cblas_zdotu 

tool: D357: cblas_zaxpy 

tool: D182: cblas_zcopy 

tool: D117: cblas_zswap 

tool: D230: cblas_dznrm2

tool: D312: cblas_dzasum

tool: D381: cblas_zscal 

tool: D69: cblas_zdscal

tool: D521: cblas_izamax

tool: D502:  There were %d failed tests.


tool: D410:  All tests passed.

tool: D186:  There was one failed test.

assistant: ```c
int main(int argc, char *argv[]) {
  int fail = 0;
  bool verbose = false;
  printf(" ---------------------------\n");
  printf("      CoBLAS Test Suite     \n");
  printf(" ---------------------------\n");
  if (test_function("cblas_sdot  ", check_sdot(verbose)))
    fail++;
  if (test_function("cblas_saxpy ", check_saxpy(verbose)))
    fail++;
  if (test_function("cblas_srotg ", check_srotg(verbose)))
    fail++;
  if (test_function("cblas_srot  ", check_srot(verbose)))
    fail++;
  if (test_function("cblas_scopy ", check_scopy(verbose)))
    fail++;
  if (test_function("cblas_sswap ", check_sswap(verbose)))
    fail++;
  if (test_function("cblas_snrm2 ", check_snrm2(verbose)))
    fail++;
  if (test_function("cblas_sasum ", check_sasum(verbose)))
    fail++;
  if (test_function("cblas_sscal ", check_sscal(verbose)))
    fail++;
  if (test_function("cblas_isamax", check_isamax(verbose)))
    fail++;
  if (test_function("cblas_srotmg", check_srotmg(verbose)))
    fail++;
  if (test_function("cblas_srotm ", check_srotm(verbose)))
    fail++;
  if (test_function("cblas_sdsdot", check_sdsdot(verbose)))
    fail++;
  if (test_function("cblas_ddot  ", check_ddot(verbose)))
    fail++;
  if (test_function("cblas_daxpy ", check_daxpy(verbose)))
    fail++;
  if (test_function("cblas_drotg ", check_drotg(verbose)))
    fail++;
  if (test_function("cblas_drot  ", check_drot(verbose)))
    fail++;
  if (test_function("cblas_dcopy ", check_dcopy(verbose)))
    fail++;
  if (test_function("cblas_dswap ", check_dswap(verbose)))
    fail++;
  if (test_function("cblas_dnrm2 ", check_dnrm2(verbose)))
    fail++;
  if (test_function("cblas_dasum ", check_dasum(verbose)))
    fail++;
  if (test_function("cblas_dscal ", check_dscal(verbose)))
    fail++;
  if (test_function("cblas_idamax", check_idamax(verbose)))
    fail++;
  if (test_function("cblas_drotmg", check_drotmg(verbose)))
    fail++;
  if (test_function("cblas_drotm ", check_drotm(verbose)))
    fail++;
  if (test_function("cblas_dsdot ", check_dsdot(verbose)))
    fail++;
  if (test_function("cblas_cdotc ", check_cdotc(verbose)))
    fail++;
  if (test_function("cblas_cdotu ", check_cdotu(verbose)))
    fail++;
  if (test_function("cblas_caxpy ", check_caxpy(verbose)))
    fail++;
  if (test_function("cblas_ccopy ", check_ccopy(verbose)))
    fail++;
  if (test_function("cblas_cswap ", check_cswap(verbose)))
    fail++;
  if (test_function("cblas_scnrm2", check_scnrm2(verbose)))
    fail++;
  if (test_function("cblas_scasum", check_scasum(verbose)))
    fail++;
  if (test_function("cblas_cscal ", check_cscal(verbose)))
    fail++;
  if (test_function("cblas_csscal", check_csscal(verbose)))
    fail++;
  if (test_function("cblas_icamax", check_icamax(verbose)))
    fail++;
  if (test_function("cblas_zdotc ", check_zdotc(verbose)))
    fail++;
  if (test_function("cblas_zdotu ", check_zdotu(verbose)))
    fail++;
  if (test_function("cblas_zaxpy ", check_zaxpy(verbose)))
    fail++;
  if (test_function("cblas_zcopy ", check_zcopy(verbose)))
    fail++;
  if (test_function("cblas_zswap ", check_zswap(verbose)))
    fail++;
  if (test_function("cblas_dznrm2", check_dznrm2(verbose)))
    fail++;
  if (test_function("cblas_dzasum", check_dzasum(verbose)))
    fail++;
  if (test_function("cblas_zscal ", check_zscal(verbose)))
    fail++;
  if (test_function("cblas_zdscal", check_zdscal(verbose)))
    fail++;
  if (test_function("cblas_izamax", check_izamax(verbose)))
    fail++;
  printf(" ---------------------------\n");
  if (fail == 0)
    printf(" All tests passed.\n");
  else if (fail == 1)
    printf(" There was one failed test.\n");
  else
    printf(" There were %d failed tests.\n", fail);
  return fail;
}
```