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

```asm
<erfcinv>:
  endbr64
  sub    $0x18,%rsp
  movsd  %xmm0,0x8(%rsp)
  comisd D96(%rip),%xmm0
  ja     L39
  movapd %xmm0,%xmm3
  pxor   %xmm0,%xmm0
  comisd %xmm3,%xmm0
  jbe    L72
L39:
  lea    D79(%rip),%rdi
  call   <printf@plt>
  mov    $0x1,%edi
  call   <exit@plt>
L72:
  movsd  0x8(%rsp),%xmm4
  comisd D143(%rip),%xmm4
  jb     L24
  movsd  D96(%rip),%xmm0
  comisd %xmm4,%xmm0
  ja     L14
L24:
  movsd  D143(%rip),%xmm0
  movsd  0x8(%rsp),%xmm5
  comisd %xmm5,%xmm0
  jbe    L101
  comisd D33(%rip),%xmm5
  jae    L126
L101:
  movsd  D33(%rip),%xmm0
  movsd  0x8(%rsp),%xmm6
  comisd %xmm6,%xmm0
  jbe    L44
  movapd %xmm6,%xmm0
  comisd D30(%rip),%xmm6
  ja     L65
L44:
  movsd  D1(%rip),%xmm0
  pxor   %xmm1,%xmm1
  movsd  0x8(%rsp),%xmm7
  comisd %xmm7,%xmm1
  jae    L66
  ucomisd D96(%rip),%xmm7
  jp     L66
  movq   %xmm0,%rax
  cmove  D215(%rip),%rax
  movq   %rax,%xmm0
L66:
  add    $0x18,%rsp
  ret
L14:
  movsd  D0(%rip),%xmm0
  subsd  %xmm4,%xmm0
  call   <erfinv@plt>
  jmp    L66
L126:
  movapd %xmm5,%xmm0
  call   <log@plt>
  neg    %eax
  mov    %eax,%edi
  call   <sqrt@plt>
  movsd  D0(%rip),%xmm1
  divsd  %xmm0,%xmm1
  movapd %xmm1,%xmm0
  mulsd  D31(%rip),%xmm0
  addsd  D47(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  subsd  D136(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  addsd  D228(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  D234(%rip),%xmm2
  divsd  %xmm1,%xmm2
  addsd  D22(%rip),%xmm2
  addsd  %xmm2,%xmm0
  movapd %xmm1,%xmm2
  addsd  D116(%rip),%xmm2
  mulsd  %xmm2,%xmm1
  addsd  D129(%rip),%xmm1
  divsd  %xmm1,%xmm0
  jmp    L66
L65:
  call   <log@plt>
  neg    %eax
  mov    %eax,%edi
  call   <sqrt@plt>
  movsd  D0(%rip),%xmm1
  divsd  %xmm0,%xmm1
  movapd %xmm1,%xmm0
  mulsd  D65(%rip),%xmm0
  addsd  D26(%rip),%xmm0
  mulsd  %xmm1,%xmm0
  movsd  D21(%rip),%xmm2
  divsd  %xmm1,%xmm2
  addsd  D145(%rip),%xmm2
  addsd  %xmm2,%xmm0
  movapd %xmm1,%xmm2
  addsd  D186(%rip),%xmm2
  mulsd  %xmm2,%xmm1
  addsd  D248(%rip),%xmm1
  divsd  %xmm1,%xmm0
  jmp    L66
```

tool_calls: name: retrieve_data
arguments: tag: D96
data_type: f64[2]
name: retrieve_data
arguments: tag: D79
data_type: string
name: retrieve_data
arguments: tag: D143
data_type: f64[2]
name: retrieve_data
arguments: tag: D33
data_type: byte[16]
name: retrieve_data
arguments: tag: D30
data_type: f64[2]
name: retrieve_data
arguments: tag: D1
data_type: f64
name: retrieve_data
arguments: tag: D215
data_type: byte[8]
name: retrieve_data
arguments: tag: D0
data_type: f64
name: retrieve_data
arguments: tag: D31
data_type: byte[8]
name: retrieve_data
arguments: tag: D47
data_type: f64
name: retrieve_data
arguments: tag: D136
data_type: f64
name: retrieve_data
arguments: tag: D228
data_type: f64
name: retrieve_data
arguments: tag: D234
data_type: f64
name: retrieve_data
arguments: tag: D22
data_type: f64
name: retrieve_data
arguments: tag: D116
data_type: f64
name: retrieve_data
arguments: tag: D129
data_type: f64
name: retrieve_data
arguments: tag: D65
data_type: byte[8]
name: retrieve_data
arguments: tag: D26
data_type: f64
name: retrieve_data
arguments: tag: D21
data_type: f64
name: retrieve_data
arguments: tag: D145
data_type: f64
name: retrieve_data
arguments: tag: D186
data_type: f64
name: retrieve_data
arguments: tag: D248
data_type: f64

tool: {"D96": [2.0,0.0]}

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

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

tool: {"D33": [0x30,0x05,0x8e,0xe4,0x2e,0xff,0x2b,0x2b,0x81,0x61,0x23,0xda,0x6b,0x0c,0xc5,0xbf]}

tool: {"D30": [0.0,0.0625]}

tool: D1: 1.79e+308

tool: {"D215": [0x99,0xbb,0xad,0x58,0xf1,0xdc,0xef,0xff]}

tool: D0: 1

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

tool: D47: 0.680544246825

tool: D136: 1.128081391617

tool: D228: 0.690969348887

tool: D234: 0.1550470003116

tool: D22: 1.382719649631

tool: D116: 1.385228141995

tool: D129: 0.155024849822

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

tool: D26: 0.97302949837

tool: D21: 0.00980456202915

tool: D145: 0.363667889171

tool: D186: 0.363699971544

tool: D248: 0.00980451277802

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;
}
```