user: Please show me the C implementation that matches the assembly code listed below:

```asm
<erfcinv>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x90,%rsp
  movsd  %xmm0,-0x88(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movsd  D12(%rip),%xmm0
  movsd  %xmm0,-0x78(%rbp)
  movsd  D237(%rip),%xmm0
  movsd  %xmm0,-0x70(%rbp)
  movsd  -0x88(%rbp),%xmm0
  comisd D172(%rip),%xmm0
  ja     L17
  pxor   %xmm0,%xmm0
  comisd -0x88(%rbp),%xmm0
  jbe    L20
L17:
  lea    D24(%rip),%rax
  mov    %rax,%rdi
  call   <printf@plt>
  mov    $0x1,%edi
  call   <exit@plt>
L20:
  movsd  -0x88(%rbp),%xmm0
  comisd D196(%rip),%xmm0
  jb     L76
  movsd  D172(%rip),%xmm0
  comisd -0x88(%rbp),%xmm0
  jbe    L76
  movsd  D184(%rip),%xmm0
  subsd  -0x88(%rbp),%xmm0
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  call   <erfinv@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x80(%rbp)
  jmp    L22
L76:
  movsd  D196(%rip),%xmm0
  comisd -0x88(%rbp),%xmm0
  jbe    L59
  movsd  -0x88(%rbp),%xmm0
  comisd D216(%rip),%xmm0
  jb     L59
  movsd  D299(%rip),%xmm0
  movsd  %xmm0,-0x40(%rbp)
  movsd  D302(%rip),%xmm0
  movsd  %xmm0,-0x38(%rbp)
  movsd  D108(%rip),%xmm0
  movsd  %xmm0,-0x30(%rbp)
  movsd  D104(%rip),%xmm0
  movsd  %xmm0,-0x28(%rbp)
  movsd  D213(%rip),%xmm0
  movsd  %xmm0,-0x20(%rbp)
  movsd  D228(%rip),%xmm0
  movsd  %xmm0,-0x18(%rbp)
  movsd  D236(%rip),%xmm0
  movsd  %xmm0,-0x60(%rbp)
  movsd  D180(%rip),%xmm0
  movsd  %xmm0,-0x58(%rbp)
  movsd  D184(%rip),%xmm0
  movsd  %xmm0,-0x50(%rbp)
  mov    -0x88(%rbp),%rax
  movq   %rax,%xmm0
  call   <log@plt>
  neg    %eax
  mov    %eax,%edi
  call   <sqrt@plt>
  movapd %xmm0,%xmm1
  movsd  D184(%rip),%xmm0
  divsd  %xmm1,%xmm0
  movsd  %xmm0,-0x68(%rbp)
  movsd  -0x40(%rbp),%xmm0
  movapd %xmm0,%xmm1
  divsd  -0x68(%rbp),%xmm1
  movsd  -0x38(%rbp),%xmm0
  addsd  %xmm0,%xmm1
  movsd  -0x30(%rbp),%xmm2
  movsd  -0x28(%rbp),%xmm3
  movsd  -0x20(%rbp),%xmm4
  movsd  -0x18(%rbp),%xmm0
  mulsd  -0x68(%rbp),%xmm0
  addsd  %xmm4,%xmm0
  mulsd  -0x68(%rbp),%xmm0
  addsd  %xmm3,%xmm0
  mulsd  -0x68(%rbp),%xmm0
  addsd  %xmm2,%xmm0
  mulsd  -0x68(%rbp),%xmm0
  addsd  %xmm1,%xmm0
  movsd  -0x60(%rbp),%xmm2
  movsd  -0x58(%rbp),%xmm3
  movsd  -0x50(%rbp),%xmm1
  mulsd  -0x68(%rbp),%xmm1
  addsd  %xmm3,%xmm1
  mulsd  -0x68(%rbp),%xmm1
  addsd  %xmm2,%xmm1
  divsd  %xmm1,%xmm0
  movsd  %xmm0,-0x80(%rbp)
  jmp    L22
L59:
  movsd  D216(%rip),%xmm0
  comisd -0x88(%rbp),%xmm0
  jbe    L146
  movsd  -0x88(%rbp),%xmm0
  pxor   %xmm1,%xmm1
  comisd %xmm1,%xmm0
  jbe    L146
  movsd  D136(%rip),%xmm0
  movsd  %xmm0,-0x40(%rbp)
  movsd  D296(%rip),%xmm0
  movsd  %xmm0,-0x38(%rbp)
  movsd  D260(%rip),%xmm0
  movsd  %xmm0,-0x30(%rbp)
  movsd  D187(%rip),%xmm0
  movsd  %xmm0,-0x28(%rbp)
  movsd  D283(%rip),%xmm0
  movsd  %xmm0,-0x60(%rbp)
  movsd  D20(%rip),%xmm0
  movsd  %xmm0,-0x58(%rbp)
  movsd  D184(%rip),%xmm0
  movsd  %xmm0,-0x50(%rbp)
  mov    -0x88(%rbp),%rax
  movq   %rax,%xmm0
  call   <log@plt>
  neg    %eax
  mov    %eax,%edi
  call   <sqrt@plt>
  movapd %xmm0,%xmm1
  movsd  D184(%rip),%xmm0
  divsd  %xmm1,%xmm0
  movsd  %xmm0,-0x68(%rbp)
  movsd  -0x40(%rbp),%xmm0
  movapd %xmm0,%xmm1
  divsd  -0x68(%rbp),%xmm1
  movsd  -0x38(%rbp),%xmm0
  addsd  %xmm0,%xmm1
  movsd  -0x30(%rbp),%xmm2
  movsd  -0x28(%rbp),%xmm0
  mulsd  -0x68(%rbp),%xmm0
  addsd  %xmm2,%xmm0
  mulsd  -0x68(%rbp),%xmm0
  addsd  %xmm1,%xmm0
  movsd  -0x60(%rbp),%xmm2
  movsd  -0x58(%rbp),%xmm3
  movsd  -0x50(%rbp),%xmm1
  mulsd  -0x68(%rbp),%xmm1
  addsd  %xmm3,%xmm1
  mulsd  -0x68(%rbp),%xmm1
  addsd  %xmm2,%xmm1
  divsd  %xmm1,%xmm0
  movsd  %xmm0,-0x80(%rbp)
  jmp    L22
L146:
  pxor   %xmm0,%xmm0
  comisd -0x88(%rbp),%xmm0
  jb     L101
  movsd  -0x78(%rbp),%xmm0
  movsd  %xmm0,-0x80(%rbp)
  jmp    L22
L101:
  movsd  -0x88(%rbp),%xmm0
  ucomisd D172(%rip),%xmm0
  jp     L22
  movsd  -0x88(%rbp),%xmm0
  ucomisd D172(%rip),%xmm0
  jne    L22
  movsd  -0x78(%rbp),%xmm0
  movq   D231(%rip),%xmm1
  xorpd  %xmm1,%xmm0
  movsd  %xmm0,-0x80(%rbp)
L22:
  movsd  -0x80(%rbp),%xmm0
  movq   %xmm0,%rax
  mov    -0x8(%rbp),%rdx
  sub    %fs:0x28,%rdx
  je     L114
  call   <__stack_chk_fail@plt>
L114:
  movq   %rax,%xmm0
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: data_label: D12
datatype: f64
name: retrieve_data
arguments: data_label: D237
datatype: f64
name: retrieve_data
arguments: data_label: D172
datatype: f64[2]
name: retrieve_data
arguments: data_label: D24
datatype: string
name: retrieve_data
arguments: data_label: D196
datatype: f64[2]
name: retrieve_data
arguments: data_label: D184
datatype: f64
name: retrieve_data
arguments: data_label: D216
datatype: byte[16]
name: retrieve_data
arguments: data_label: D299
datatype: f64
name: retrieve_data
arguments: data_label: D302
datatype: f64
name: retrieve_data
arguments: data_label: D108
datatype: f64
name: retrieve_data
arguments: data_label: D104
datatype: byte[8]
name: retrieve_data
arguments: data_label: D213
datatype: f64
name: retrieve_data
arguments: data_label: D228
datatype: byte[8]
name: retrieve_data
arguments: data_label: D236
datatype: f64
name: retrieve_data
arguments: data_label: D180
datatype: f64
name: retrieve_data
arguments: data_label: D136
datatype: f64
name: retrieve_data
arguments: data_label: D296
datatype: f64
name: retrieve_data
arguments: data_label: D260
datatype: f64
name: retrieve_data
arguments: data_label: D187
datatype: byte[8]
name: retrieve_data
arguments: data_label: D283
datatype: f64
name: retrieve_data
arguments: data_label: D20
datatype: f64
name: retrieve_data
arguments: data_label: D231
datatype: f32[2]

tool: D12: 1.79e+308

tool: D237: 3.141592653589793

tool: {"D172": [2.0,0.0625]}

tool: D24: The Input takes values between 0.0 and 2.0

tool: {"D196": [0.0625,1.0]}

tool: D184: 1

tool: {"D216": [0x30,0x05,0x8e,0xe4,0x2e,0xff,0x2b,0x2b,0x57,0x32,0xd7,0x81,0x94,0xd8,0xc3,0x3f]}

tool: D299: 0.1550470003116

tool: D302: 1.382719649631

tool: D108: 0.690969348887

tool: {"D104": [0xf8,0x89,0xc3,0x12,0x9f,0x0c,0xf2,0xbf]}

tool: D213: 0.680544246825

tool: {"D228": [0x81,0x61,0x23,0xda,0x6b,0x0c,0xc5,0xbf]}

tool: D236: 0.155024849822

tool: D180: 1.385228141995

tool: D136: 0.00980456202915

tool: D296: 0.363667889171

tool: D260: 0.97302949837

tool: {"D187": [0x73,0x0c,0x50,0x2b,0x28,0x33,0xe1,0xbf]}

tool: D283: 0.00980451277802

tool: D20: 0.363699971544

tool: {"D231": [0.0,-0.0]}

assistant: ```c
double erfcinv(double x) {
  double oup, xinf, pi, t;
  xinf = 1.79e308;
  pi = 3.1415926535897932384626434;
  if (x > 2. || x < 0.) {
    printf("The Input takes values between 0.0 and 2.0");
    exit(1);
  }
  if (x >= 0.0625 && x < 2.0) {
    oup = erfinv(1.0 - x);
  } else if (x < 0.0625 && x >= 1.0e-100) {
    double p[6] = {0.1550470003116, 1.382719649631, 0.690969348887, -1.128081391617, 0.680544246825, -0.16444156791};
    double q[3] = {0.155024849822, 1.385228141995, 1.000000000000};
    t = 1.0 / sqrt(-log(x));
    oup = (p[0] / t + p[1] + t * (p[2] + t * (p[3] + t * (p[4] + t * p[5])))) / (q[0] + t * (q[1] + t * (q[2])));
  } else if (x < 1.0e-100 && x > 1.0e-1000) {
    double p[4] = {0.00980456202915, 0.363667889171, 0.97302949837, -0.5374947401};
    double q[3] = {0.00980451277802, 0.363699971544, 1.000000000000};
    t = 1.0 / sqrt(-log(x));
    oup = (p[0] / t + p[1] + t * (p[2] + t * p[3])) / (q[0] + t * (q[1] + t * (q[2])));
  } else if (x <= 1.0e-1000) {
    oup = xinf;
  } else if (x == 2.) {
    oup = -xinf;
  }
  return oup;
}
```