user: 请显示与下面列出的汇编代码相匹配的C语言实现：

```asm
<cdflib_rexp>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x20,%rsp
  mov    %rdi,-0x18(%rbp)
  mov    -0x18(%rbp),%rax
  movsd  (%rax),%xmm0
  movq   D104(%rip),%xmm1
  andpd  %xmm1,%xmm0
  comisd D59(%rip),%xmm0
  ja     L20
  mov    -0x18(%rbp),%rax
  movsd  (%rax),%xmm1
  mov    -0x18(%rbp),%rax
  movsd  (%rax),%xmm2
  movsd  D135(%rip),%xmm0
  mulsd  %xmm0,%xmm2
  movsd  D70(%rip),%xmm0
  addsd  %xmm0,%xmm2
  mov    -0x18(%rbp),%rax
  movsd  (%rax),%xmm0
  mulsd  %xmm0,%xmm2
  movsd  D101(%rip),%xmm0
  addsd  %xmm2,%xmm0
  mov    -0x18(%rbp),%rax
  movsd  (%rax),%xmm3
  movsd  D73(%rip),%xmm2
  mulsd  %xmm2,%xmm3
  movsd  D21(%rip),%xmm2
  addsd  %xmm2,%xmm3
  mov    -0x18(%rbp),%rax
  movsd  (%rax),%xmm2
  mulsd  %xmm2,%xmm3
  movsd  D41(%rip),%xmm2
  addsd  %xmm2,%xmm3
  mov    -0x18(%rbp),%rax
  movsd  (%rax),%xmm2
  mulsd  %xmm2,%xmm3
  movsd  D63(%rip),%xmm2
  addsd  %xmm2,%xmm3
  mov    -0x18(%rbp),%rax
  movsd  (%rax),%xmm2
  mulsd  %xmm2,%xmm3
  movsd  D101(%rip),%xmm2
  addsd  %xmm3,%xmm2
  divsd  %xmm2,%xmm0
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm0
  jmp    L14
L20:
  nop
  mov    -0x18(%rbp),%rax
  mov    (%rax),%rax
  movq   %rax,%xmm0
  call   <exp@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x8(%rbp)
  mov    -0x18(%rbp),%rax
  movsd  (%rax),%xmm0
  pxor   %xmm1,%xmm1
  comisd %xmm1,%xmm0
  ja     L2
  movsd  -0x8(%rbp),%xmm0
  movsd  D100(%rip),%xmm1
  subsd  %xmm1,%xmm0
  movsd  D100(%rip),%xmm1
  subsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm0
  jmp    L14
L2:
  nop
  movsd  D101(%rip),%xmm0
  movapd %xmm0,%xmm2
  divsd  -0x8(%rbp),%xmm2
  movsd  D100(%rip),%xmm0
  movapd %xmm0,%xmm1
  subsd  %xmm2,%xmm1
  movsd  D100(%rip),%xmm0
  addsd  %xmm1,%xmm0
  movsd  -0x8(%rbp),%xmm1
  mulsd  %xmm1,%xmm0
  movsd  %xmm0,-0x10(%rbp)
  movsd  -0x10(%rbp),%xmm0
L14:
  movq   %xmm0,%rax
  movq   %rax,%xmm0
  leave
  ret
```

tool_calls: name: unpack_data
arguments: data_tag: D104
data_type: qword
name: unpack_data
arguments: data_tag: D59
data_type: f64[2]
name: unpack_data
arguments: data_tag: D135
data_type: byte[8]
name: unpack_data
arguments: data_tag: D70
data_type: byte[8]
name: unpack_data
arguments: data_tag: D101
data_type: f64
name: unpack_data
arguments: data_tag: D73
data_type: byte[8]
name: unpack_data
arguments: data_tag: D21
data_type: byte[8]
name: unpack_data
arguments: data_tag: D41
data_type: byte[8]
name: unpack_data
arguments: data_tag: D63
data_type: byte[8]
name: unpack_data
arguments: data_tag: D100
data_type: f64

tool: D104: 9223372036854775807

tool: {"D59": [0.15,1.0]}

tool: {"D135": [0xf6,0xb3,0xc6,0xad,0x2f,0x61,0x98,0x3f]}

tool: {"D70": [0x77,0x8d,0xda,0x69,0xff,0x67,0x0f,0x3e]}

tool: D101: 1

tool: {"D73": [0x1c,0x14,0xd8,0xaf,0x51,0x80,0x43,0x3f]}

tool: {"D21": [0xe2,0xf4,0x28,0xab,0x2f,0x61,0x88,0xbf]}

tool: {"D41": [0xea,0x61,0xd0,0x3e,0xa1,0x6d,0xbb,0x3f]}

tool: {"D63": [0x03,0xc0,0x04,0xff,0xff,0xff,0xdf,0xbf]}

tool: D100: 0.5

assistant: ```c
double cdflib_rexp(double *x) {
  static const double p1 = .914041914819518e-09;
  static const double p2 = .238082361044469e-01;
  static const double q1 = -.499999999085958e+00;
  static const double q2 = .107141568980644e+00;
  static const double q3 = -.119041179760821e-01;
  static const double q4 = .595130811860248e-03;
  double rexp, w;
  if (fabs(*x) > 0.15e0) {
    goto S10;
  }
  rexp = *x * (((p2 * *x + p1) * *x + 1.0e0) / ((((q4 * *x + q3) * *x + q2) * *x + q1) * *x + 1.0e0));
  return rexp;
S10:
  w = exp(*x);
  if (*x > 0.0e0) {
    goto S20;
  }
  rexp = w - 0.5e0 - 0.5e0;
  return rexp;
S20:
  rexp = w * (0.5e0 + (0.5e0 - 1.0e0 / w));
  return rexp;
}
```