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

```asm
<pi_check>:
  endbr64
  push   %rbx
  mov    %rsi,%rbx
  sub    $0x10,%rsp
  test   %rdi,%rdi
  js     L67
  pxor   %xmm2,%xmm2
  cvtsi2sd %rdi,%xmm2
L30:
  movapd %xmm2,%xmm0
  mov    %rbx,%rsi
  mov    $0x1,%eax
  movsd  %xmm2,(%rsp)
  lea    D58(%rip),%rdi
  call   <printf@plt>
  test   %rbx,%rbx
  movsd  (%rsp),%xmm2
  js     L35
  pxor   %xmm3,%xmm3
  cvtsi2sd %rbx,%xmm3
L44:
  movsd  D135(%rip),%xmm0
  mov    $0x2,%eax
  movsd  %xmm3,(%rsp)
  movsd  D77(%rip),%xmm4
  lea    D59(%rip),%rdi
  movsd  %xmm2,0x8(%rsp)
  mulsd  %xmm2,%xmm0
  divsd  %xmm3,%xmm0
  movapd %xmm0,%xmm1
  subsd  %xmm4,%xmm1
  mulsd  D14(%rip),%xmm1
  divsd  %xmm4,%xmm1
  call   <printf@plt>
  movsd  (%rsp),%xmm3
  mulsd  D4(%rip),%xmm3
  movsd  0x8(%rsp),%xmm2
  movsd  D39(%rip),%xmm1
  subsd  %xmm3,%xmm2
  mulsd  D73(%rip),%xmm3
  movapd %xmm2,%xmm0
  mulsd  %xmm2,%xmm0
  divsd  %xmm3,%xmm0
  comisd %xmm0,%xmm1
  ja     L27
  movsd  D135(%rip),%xmm5
  comisd %xmm0,%xmm5
  ja     L20
  movsd  D119(%rip),%xmm1
  comisd %xmm0,%xmm1
  jbe    L51
  lea    D100(%rip),%rdi
  mov    $0x1,%eax
  call   <printf@plt>
  add    $0x10,%rsp
  xor    %eax,%eax
  pop    %rbx
  ret
L20:
  lea    D34(%rip),%rdi
  mov    $0x1,%eax
  call   <printf@plt>
  add    $0x10,%rsp
  xor    %eax,%eax
  pop    %rbx
  ret
  nopl   0x0(%rax)
L35:
  mov    %rbx,%rax
  and    $0x1,%ebx
  pxor   %xmm3,%xmm3
  shr    %rax
  or     %rbx,%rax
  cvtsi2sd %rax,%xmm3
  addsd  %xmm3,%xmm3
  jmp    L44
  xchg   %ax,%ax
L67:
  mov    %rdi,%rax
  and    $0x1,%edi
  pxor   %xmm2,%xmm2
  shr    %rax
  or     %rdi,%rax
  cvtsi2sd %rax,%xmm2
  addsd  %xmm2,%xmm2
  jmp    L30
  xchg   %ax,%ax
L27:
  lea    D130(%rip),%rdi
  mov    $0x1,%eax
  call   <printf@plt>
  add    $0x10,%rsp
  xor    %eax,%eax
  pop    %rbx
  ret
  nopl   0x0(%rax)
L51:
  lea    D5(%rip),%rdi
  mov    $0x1,%eax
  call   <printf@plt>
  add    $0x10,%rsp
  mov    $0x1,%eax
  pop    %rbx
  ret
```

tool_calls: name: retrieve_data
arguments: data_label: D58
type: string
name: retrieve_data
arguments: data_label: D135
type: f64
name: retrieve_data
arguments: data_label: D77
type: f64
name: retrieve_data
arguments: data_label: D59
type: string
name: retrieve_data
arguments: data_label: D14
type: f64
name: retrieve_data
arguments: data_label: D4
type: byte[8]
name: retrieve_data
arguments: data_label: D39
type: f64
name: retrieve_data
arguments: data_label: D73
type: byte[8]
name: retrieve_data
arguments: data_label: D119
type: f64
name: retrieve_data
arguments: data_label: D100
type: string
name: retrieve_data
arguments: data_label: D34
type: string
name: retrieve_data
arguments: data_label: D130
type: string
name: retrieve_data
arguments: data_label: D5
type: string

tool: D58: %lu out of %lu darts thrown at a square board hit the inscribed circle


tool: D135: 4

tool: D77: 3.141592653589793

tool: D59: pi is approximately %.8g (diff = %.2g %%)


tool: D14: 100

tool: {"D4": [0x18,0x2d,0x44,0x54,0xfb,0x21,0xe9,0x3f]}

tool: D39: 1

tool: {"D73": [0xa0,0x4b,0xef,0xae,0x12,0x78,0xcb,0x3f]}

tool: D119: 9

tool: D100: Maybe OK, # of hits is between two and three 'sigma' away from expectation
(chisquared = %.2g)


tool: D34: OK, # of hits is between one and two 'sigma' away from expectation
(chisquared = %.2g)


tool: D130: OK, # of hits is less than one 'sigma' away from expectation
(chisquared = %.2g)


tool: D5: May not be OK, # of hits is more than three 'sigma'.  Worth looking into.
(chisquared = %.2g)


assistant: ```c
int pi_check(unsigned long hits, unsigned long tries) {
  const double PI = 3.14159265358979323846;
  double ourpi, mean, var, delta, chisq;
  printf("%lu out of %lu darts thrown at a square board hit the inscribed circle\n", hits, tries);
  ourpi = 4. * hits / tries;
  printf("pi is approximately %.8g (diff = %.2g %%)\n", ourpi, (ourpi - PI) * 100. / PI);
  mean = tries * (PI / 4.);
  var = tries * (PI / 4.) * (1. - (PI / 4.));
  delta = hits - mean;
  chisq = delta * delta / var;
  if (chisq < 1.)
    printf("OK, # of hits is less than one 'sigma' away from expectation\n(chisquared = %.2g)\n", chisq);
  else if (chisq < 4.)
    printf("OK, # of hits is between one and two 'sigma' away from expectation\n(chisquared = %.2g)\n", chisq);
  else if (chisq < 9.)
    printf("Maybe OK, # of hits is between two and three 'sigma' away from expectation\n(chisquared = %.2g)\n", chisq);
  else {
    printf("May not be OK, # of hits is more than three 'sigma'.  Worth looking into.\n(chisquared = %.2g)\n", chisq);
    return 1;
  }
  return 0;
}
```