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

```asm
<main>:
  endbr64
  push   %r12
  xor    %r12d,%r12d
  push   %rbp
  lea    D149(%rip),%rbp
  mov    %rbp,%rdi
  sub    $0x8,%rsp
  call   <puts@plt>
  lea    D244(%rip),%rdi
  call   <puts@plt>
  mov    %rbp,%rdi
  call   <puts@plt>
  xor    %edi,%edi
  call   <check_sdot@plt>
  lea    D377(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  test   %rax,%rax
  setne  %r12b
  xor    %edi,%edi
  call   <check_saxpy@plt>
  lea    D365(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_srotg@plt>
  lea    D421(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_srot@plt>
  lea    D102(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_scopy@plt>
  lea    D85(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_sswap@plt>
  lea    D136(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_snrm2@plt>
  lea    D358(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_sasum@plt>
  lea    D514(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_sscal@plt>
  lea    D30(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_isamax@plt>
  lea    D198(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_srotmg@plt>
  lea    D28(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_srotm@plt>
  lea    D164(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_sdsdot@plt>
  lea    D373(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_ddot@plt>
  lea    D31(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_daxpy@plt>
  lea    D53(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_drotg@plt>
  lea    D92(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_drot@plt>
  lea    D506(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_dcopy@plt>
  lea    D262(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_dswap@plt>
  lea    D144(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_dnrm2@plt>
  lea    D447(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_dasum@plt>
  lea    D354(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_dscal@plt>
  lea    D100(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_idamax@plt>
  lea    D180(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_drotmg@plt>
  lea    D60(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_drotm@plt>
  lea    D405(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_dsdot@plt>
  lea    D494(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_cdotc@plt>
  lea    D264(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_cdotu@plt>
  lea    D174(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_caxpy@plt>
  lea    D303(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_ccopy@plt>
  lea    D113(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_cswap@plt>
  lea    D250(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_scnrm2@plt>
  lea    D510(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_scasum@plt>
  lea    D382(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_cscal@plt>
  lea    D221(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_csscal@plt>
  lea    D489(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_icamax@plt>
  lea    D462(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_zdotc@plt>
  lea    D290(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_zdotu@plt>
  lea    D29(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_zaxpy@plt>
  lea    D450(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_zcopy@plt>
  lea    D109(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_zswap@plt>
  lea    D474(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_dznrm2@plt>
  lea    D155(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_dzasum@plt>
  lea    D483(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_zscal@plt>
  lea    D122(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  cmp    $0x1,%rax
  sbb    $0xffffffff,%r12d
  xor    %edi,%edi
  call   <check_zdscal@plt>
  lea    D217(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  test   %rax,%rax
  je     L12
  xor    %edi,%edi
  add    $0x1,%r12d
  call   <check_izamax@plt>
  lea    D234(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  test   %rax,%rax
  je     L23
L40:
  mov    %rbp,%rdi
  add    $0x1,%r12d
  call   <puts@plt>
L15:
  cmp    $0x1,%r12d
  je     L73
  mov    %r12d,%esi
  lea    D118(%rip),%rdi
  xor    %eax,%eax
  call   <printf@plt>
L52:
  add    $0x8,%rsp
  mov    %r12d,%eax
  pop    %rbp
  pop    %r12
  ret
L12:
  xor    %edi,%edi
  call   <check_izamax@plt>
  lea    D234(%rip),%rdi
  mov    %eax,%esi
  call   <test_function@plt>
  test   %rax,%rax
  jne    L40
  mov    %rbp,%rdi
  call   <puts@plt>
  test   %r12d,%r12d
  jne    L15
  lea    D375(%rip),%rdi
  call   <puts@plt>
  jmp    L52
L73:
  lea    D427(%rip),%rdi
  call   <puts@plt>
  jmp    L52
L23:
  mov    %rbp,%rdi
  call   <puts@plt>
  jmp    L15
```

tool_calls: name: retrieve_data
arguments: label: D149
type: string
name: retrieve_data
arguments: label: D244
type: string
name: retrieve_data
arguments: label: D377
type: string
name: retrieve_data
arguments: label: D365
type: string
name: retrieve_data
arguments: label: D421
type: string
name: retrieve_data
arguments: label: D102
type: string
name: retrieve_data
arguments: label: D85
type: string
name: retrieve_data
arguments: label: D136
type: string
name: retrieve_data
arguments: label: D358
type: string
name: retrieve_data
arguments: label: D514
type: string
name: retrieve_data
arguments: label: D30
type: string
name: retrieve_data
arguments: label: D198
type: string
name: retrieve_data
arguments: label: D28
type: string
name: retrieve_data
arguments: label: D164
type: string
name: retrieve_data
arguments: label: D373
type: string
name: retrieve_data
arguments: label: D31
type: string
name: retrieve_data
arguments: label: D53
type: string
name: retrieve_data
arguments: label: D92
type: string
name: retrieve_data
arguments: label: D506
type: string
name: retrieve_data
arguments: label: D262
type: string
name: retrieve_data
arguments: label: D144
type: string
name: retrieve_data
arguments: label: D447
type: string
name: retrieve_data
arguments: label: D354
type: string
name: retrieve_data
arguments: label: D100
type: string
name: retrieve_data
arguments: label: D180
type: string
name: retrieve_data
arguments: label: D60
type: string
name: retrieve_data
arguments: label: D405
type: string
name: retrieve_data
arguments: label: D494
type: string
name: retrieve_data
arguments: label: D264
type: string
name: retrieve_data
arguments: label: D174
type: string
name: retrieve_data
arguments: label: D303
type: string
name: retrieve_data
arguments: label: D113
type: string
name: retrieve_data
arguments: label: D250
type: string
name: retrieve_data
arguments: label: D510
type: string
name: retrieve_data
arguments: label: D382
type: string
name: retrieve_data
arguments: label: D221
type: string
name: retrieve_data
arguments: label: D489
type: string
name: retrieve_data
arguments: label: D462
type: string
name: retrieve_data
arguments: label: D290
type: string
name: retrieve_data
arguments: label: D29
type: string
name: retrieve_data
arguments: label: D450
type: string
name: retrieve_data
arguments: label: D109
type: string
name: retrieve_data
arguments: label: D474
type: string
name: retrieve_data
arguments: label: D155
type: string
name: retrieve_data
arguments: label: D483
type: string
name: retrieve_data
arguments: label: D122
type: string
name: retrieve_data
arguments: label: D217
type: string
name: retrieve_data
arguments: label: D234
type: string
name: retrieve_data
arguments: label: D118
type: string
name: retrieve_data
arguments: label: D375
type: string
name: retrieve_data
arguments: label: D427
type: string

tool: D149:  ---------------------------

tool: D244:       CoBLAS Test Suite     

tool: D377: cblas_sdot  

tool: D365: cblas_saxpy 

tool: D421: cblas_srotg 

tool: D102: cblas_srot  

tool: D85: cblas_scopy 

tool: D136: cblas_sswap 

tool: D358: cblas_snrm2 

tool: D514: cblas_sasum 

tool: D30: cblas_sscal 

tool: D198: cblas_isamax

tool: D28: cblas_srotmg

tool: D164: cblas_srotm 

tool: D373: cblas_sdsdot

tool: D31: cblas_ddot  

tool: D53: cblas_daxpy 

tool: D92: cblas_drotg 

tool: D506: cblas_drot  

tool: D262: cblas_dcopy 

tool: D144: cblas_dswap 

tool: D447: cblas_dnrm2 

tool: D354: cblas_dasum 

tool: D100: cblas_dscal 

tool: D180: cblas_idamax

tool: D60: cblas_drotmg

tool: D405: cblas_drotm 

tool: D494: cblas_dsdot 

tool: D264: cblas_cdotc 

tool: D174: cblas_cdotu 

tool: D303: cblas_caxpy 

tool: D113: cblas_ccopy 

tool: D250: cblas_cswap 

tool: D510: cblas_scnrm2

tool: D382: cblas_scasum

tool: D221: cblas_cscal 

tool: D489: cblas_csscal

tool: D462: cblas_icamax

tool: D290: cblas_zdotc 

tool: D29: cblas_zdotu 

tool: D450: cblas_zaxpy 

tool: D109: cblas_zcopy 

tool: D474: cblas_zswap 

tool: D155: cblas_dznrm2

tool: D483: cblas_dzasum

tool: D122: cblas_zscal 

tool: D217: cblas_zdscal

tool: D234: cblas_izamax

tool: D118:  There were %d failed tests.


tool: D375:  All tests passed.

tool: D427:  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;
}
```