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

```asm
<dd_exp>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x1b0,%rsp
  mov    %rdi,-0x1a8(%rbp)
  mov    %rsi,-0x1b0(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  movsd  D252(%rip),%xmm0
  movsd  %xmm0,-0x190(%rbp)
  movsd  D417(%rip),%xmm0
  divsd  -0x190(%rbp),%xmm0
  movsd  %xmm0,-0x188(%rbp)
  movsd  D148(%rip),%xmm0
  movsd  %xmm0,-0x180(%rbp)
  movsd  D333(%rip),%xmm0
  movsd  %xmm0,-0x178(%rbp)
  movsd  D5(%rip),%xmm0
  movsd  %xmm0,-0x170(%rbp)
  movsd  D438(%rip),%xmm0
  movsd  %xmm0,-0x168(%rbp)
  movsd  D425(%rip),%xmm0
  movsd  %xmm0,-0x160(%rbp)
  movsd  D108(%rip),%xmm0
  movsd  %xmm0,-0x100(%rbp)
  movsd  D30(%rip),%xmm0
  movsd  %xmm0,-0xf8(%rbp)
  movsd  D102(%rip),%xmm0
  movsd  %xmm0,-0xf0(%rbp)
  movsd  D40(%rip),%xmm0
  movsd  %xmm0,-0xe8(%rbp)
  movsd  D124(%rip),%xmm0
  movsd  %xmm0,-0xe0(%rbp)
  movsd  D123(%rip),%xmm0
  movsd  %xmm0,-0xd8(%rbp)
  movsd  D9(%rip),%xmm0
  movsd  %xmm0,-0xd0(%rbp)
  movsd  D194(%rip),%xmm0
  movsd  %xmm0,-0xc8(%rbp)
  movsd  D338(%rip),%xmm0
  movsd  %xmm0,-0xc0(%rbp)
  movsd  D381(%rip),%xmm0
  movsd  %xmm0,-0xb8(%rbp)
  movsd  D352(%rip),%xmm0
  movsd  %xmm0,-0xb0(%rbp)
  movsd  D335(%rip),%xmm0
  movsd  %xmm0,-0xa8(%rbp)
  movsd  D113(%rip),%xmm0
  movsd  %xmm0,-0xa0(%rbp)
  movsd  D35(%rip),%xmm0
  movsd  %xmm0,-0x98(%rbp)
  movsd  D454(%rip),%xmm0
  movsd  %xmm0,-0x90(%rbp)
  movsd  D307(%rip),%xmm0
  movsd  %xmm0,-0x88(%rbp)
  movsd  D60(%rip),%xmm0
  movsd  %xmm0,-0x80(%rbp)
  movsd  D281(%rip),%xmm0
  movsd  %xmm0,-0x78(%rbp)
  movsd  D156(%rip),%xmm0
  movsd  %xmm0,-0x70(%rbp)
  movsd  D133(%rip),%xmm0
  movsd  %xmm0,-0x68(%rbp)
  movsd  D65(%rip),%xmm0
  movsd  %xmm0,-0x60(%rbp)
  movsd  D240(%rip),%xmm0
  movsd  %xmm0,-0x58(%rbp)
  movsd  D310(%rip),%xmm0
  movsd  %xmm0,-0x50(%rbp)
  movsd  D68(%rip),%xmm0
  movsd  %xmm0,-0x48(%rbp)
  movsd  D157(%rip),%xmm0
  movsd  %xmm0,-0x40(%rbp)
  movsd  D303(%rip),%xmm0
  movsd  %xmm0,-0x38(%rbp)
  movsd  D88(%rip),%xmm0
  movsd  %xmm0,-0x30(%rbp)
  movsd  D8(%rip),%xmm0
  movsd  %xmm0,-0x28(%rbp)
  movsd  D385(%rip),%xmm0
  movsd  %xmm0,-0x20(%rbp)
  movsd  D79(%rip),%xmm0
  movsd  %xmm0,-0x18(%rbp)
  mov    -0x1a8(%rbp),%rax
  movsd  (%rax),%xmm1
  movsd  D20(%rip),%xmm0
  comisd %xmm1,%xmm0
  jb     L27
  mov    -0x1b0(%rbp),%rax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x1b0(%rbp),%rax
  add    $0x8,%rax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,(%rax)
  jmp    L32
L27:
  mov    -0x1a8(%rbp),%rax
  movsd  (%rax),%xmm0
  comisd D354(%rip),%xmm0
  jb     L58
  mov    -0x1b0(%rbp),%rax
  movsd  D342(%rip),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x1b0(%rbp),%rax
  add    $0x8,%rax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,(%rax)
  jmp    L32
L58:
  mov    -0x1a8(%rbp),%rax
  mov    %rax,%rdi
  call   <dd_is_zero@plt>
  cmp    $0x1,%eax
  jne    L22
  mov    -0x1b0(%rbp),%rax
  movsd  D417(%rip),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x1b0(%rbp),%rax
  add    $0x8,%rax
  pxor   %xmm0,%xmm0
  movsd  %xmm0,(%rax)
  jmp    L32
L22:
  mov    -0x1a8(%rbp),%rax
  mov    %rax,%rdi
  call   <dd_is_one@plt>
  cmp    $0x1,%eax
  jne    L39
  mov    -0x1b0(%rbp),%rax
  movsd  -0x180(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  mov    -0x1b0(%rbp),%rax
  add    $0x8,%rax
  movsd  -0x178(%rbp),%xmm0
  movsd  %xmm0,(%rax)
  jmp    L32
L39:
  mov    -0x1a8(%rbp),%rax
  movsd  (%rax),%xmm0
  movapd %xmm0,%xmm1
  divsd  -0x170(%rbp),%xmm1
  movsd  D80(%rip),%xmm0
  addsd  %xmm0,%xmm1
  movq   %xmm1,%rax
  movq   %rax,%xmm0
  call   <floor@plt>
  movq   %xmm0,%rax
  mov    %rax,-0x158(%rbp)
  movsd  -0x170(%rbp),%xmm0
  movsd  %xmm0,-0x140(%rbp)
  movsd  -0x168(%rbp),%xmm0
  movsd  %xmm0,-0x138(%rbp)
  mov    -0x158(%rbp),%rdx
  lea    -0x140(%rbp),%rax
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <dd_mlt_d@plt>
  lea    -0x140(%rbp),%rdx
  lea    -0x140(%rbp),%rcx
  mov    -0x1a8(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <dd_sub@plt>
  lea    -0x140(%rbp),%rcx
  mov    -0x188(%rbp),%rdx
  lea    -0x140(%rbp),%rax
  mov    %rcx,%rsi
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <dd_mul_pwr2@plt>
  lea    -0x110(%rbp),%rdx
  lea    -0x140(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <dd_sqr@plt>
  lea    -0x130(%rbp),%rcx
  mov    D80(%rip),%rdx
  lea    -0x110(%rbp),%rax
  mov    %rcx,%rsi
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <dd_mul_pwr2@plt>
  lea    -0x140(%rbp),%rdx
  lea    -0x130(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <dd_inc@plt>
  lea    -0x140(%rbp),%rdx
  lea    -0x110(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <dd_mlt@plt>
  lea    -0x100(%rbp),%rax
  mov    %rax,-0x150(%rbp)
  lea    -0x120(%rbp),%rdx
  mov    -0x150(%rbp),%rcx
  lea    -0x110(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <dd_mul@plt>
  movl   $0x0,-0x194(%rbp)
  movsd  -0x188(%rbp),%xmm0
  mulsd  -0x160(%rbp),%xmm0
  movsd  %xmm0,-0x148(%rbp)
L83:
  lea    -0x120(%rbp),%rdx
  lea    -0x130(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <dd_inc@plt>
  lea    -0x140(%rbp),%rdx
  lea    -0x110(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <dd_mlt@plt>
  addl   $0x1,-0x194(%rbp)
  mov    -0x194(%rbp),%eax
  add    %eax,%eax
  lea    -0x100(%rbp),%rdx
  cltq
  shl    $0x3,%rax
  add    %rdx,%rax
  mov    %rax,-0x150(%rbp)
  lea    -0x120(%rbp),%rdx
  mov    -0x150(%rbp),%rcx
  lea    -0x110(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <dd_mul@plt>
  movsd  -0x120(%rbp),%xmm0
  movq   D249(%rip),%xmm1
  andpd  %xmm1,%xmm0
  comisd -0x148(%rbp),%xmm0
  jbe    L45
  cmpl   $0x4,-0x194(%rbp)
  jle    L83
L45:
  lea    -0x120(%rbp),%rdx
  lea    -0x130(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <dd_inc@plt>
  movl   $0x0,-0x194(%rbp)
  jmp    L70
L51:
  lea    -0x110(%rbp),%rcx
  mov    D410(%rip),%rdx
  lea    -0x130(%rbp),%rax
  mov    %rcx,%rsi
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <dd_mul_pwr2@plt>
  lea    -0x120(%rbp),%rdx
  lea    -0x130(%rbp),%rax
  mov    %rdx,%rsi
  mov    %rax,%rdi
  call   <dd_sqr@plt>
  lea    -0x130(%rbp),%rdx
  lea    -0x120(%rbp),%rcx
  lea    -0x110(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <dd_add@plt>
  addl   $0x1,-0x194(%rbp)
L70:
  cmpl   $0x8,-0x194(%rbp)
  jle    L51
  mov    -0x1b0(%rbp),%rcx
  mov    D417(%rip),%rdx
  lea    -0x130(%rbp),%rax
  mov    %rcx,%rsi
  movq   %rdx,%xmm0
  mov    %rax,%rdi
  call   <dd_add_dd_d@plt>
  movsd  -0x158(%rbp),%xmm0
  cvttsd2si %xmm0,%eax
  mov    %eax,-0x194(%rbp)
  mov    -0x194(%rbp),%edx
  mov    -0x1b0(%rbp),%rax
  mov    %edx,%esi
  mov    %rax,%rdi
  call   <dd_ldexp@plt>
L32:
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L117
  call   <__stack_chk_fail@plt>
L117:
  leave
  ret
```

tool_calls: name: read_data
arguments: tag: D252
data_type: f64
name: read_data
arguments: tag: D417
data_type: f64
name: read_data
arguments: tag: D148
data_type: byte[8]
name: read_data
arguments: tag: D333
data_type: byte[8]
name: read_data
arguments: tag: D5
data_type: byte[8]
name: read_data
arguments: tag: D438
data_type: byte[8]
name: read_data
arguments: tag: D425
data_type: byte[8]
name: read_data
arguments: tag: D108
data_type: byte[8]
name: read_data
arguments: tag: D30
data_type: byte[8]
name: read_data
arguments: tag: D102
data_type: byte[8]
name: read_data
arguments: tag: D40
data_type: byte[8]
name: read_data
arguments: tag: D124
data_type: byte[8]
name: read_data
arguments: tag: D123
data_type: byte[8]
name: read_data
arguments: tag: D9
data_type: byte[8]
name: read_data
arguments: tag: D194
data_type: byte[8]
name: read_data
arguments: tag: D338
data_type: byte[8]
name: read_data
arguments: tag: D381
data_type: byte[8]
name: read_data
arguments: tag: D352
data_type: byte[8]
name: read_data
arguments: tag: D335
data_type: byte[8]
name: read_data
arguments: tag: D113
data_type: byte[8]
name: read_data
arguments: tag: D35
data_type: byte[8]
name: read_data
arguments: tag: D454
data_type: byte[8]
name: read_data
arguments: tag: D307
data_type: byte[8]
name: read_data
arguments: tag: D60
data_type: byte[8]
name: read_data
arguments: tag: D281
data_type: byte[8]
name: read_data
arguments: tag: D156
data_type: byte[8]
name: read_data
arguments: tag: D133
data_type: byte[8]
name: read_data
arguments: tag: D65
data_type: byte[8]
name: read_data
arguments: tag: D240
data_type: byte[8]
name: read_data
arguments: tag: D310
data_type: byte[8]
name: read_data
arguments: tag: D68
data_type: byte[8]
name: read_data
arguments: tag: D157
data_type: byte[8]
name: read_data
arguments: tag: D303
data_type: byte[8]
name: read_data
arguments: tag: D88
data_type: byte[8]
name: read_data
arguments: tag: D8
data_type: byte[8]
name: read_data
arguments: tag: D385
data_type: byte[8]
name: read_data
arguments: tag: D79
data_type: byte[8]
name: read_data
arguments: tag: D20
data_type: f32[2]
name: read_data
arguments: tag: D354
data_type: f64[2]
name: read_data
arguments: tag: D342
data_type: f32[2]
name: read_data
arguments: tag: D80
data_type: f64
name: read_data
arguments: tag: D249
data_type: qword
name: read_data
arguments: tag: D410
data_type: f64

tool: D252: 512

tool: D417: 1

tool: {"D148": [0x69,0x57,0x14,0x8b,0x0a,0xbf,0x05,0x40]}

tool: {"D333": [0x3a,0x01,0xb1,0xe2,0x7e,0xd5,0xa4,0x3c]}

tool: {"D5": [0xef,0x39,0xfa,0xfe,0x42,0x2e,0xe6,0x3f]}

tool: {"D438": [0x3f,0x80,0x39,0x3b,0x9e,0xbc,0x7a,0x3c]}

tool: {"D425": [0xf9,0xff,0xff,0xff,0xff,0xff,0x6f,0x39]}

tool: {"D108": [0x55,0x55,0x55,0x55,0x55,0x55,0xc5,0x3f]}

tool: {"D30": [0x55,0x55,0x55,0x55,0x55,0x55,0x65,0x3c]}

tool: {"D102": [0x55,0x55,0x55,0x55,0x55,0x55,0xa5,0x3f]}

tool: {"D40": [0x55,0x55,0x55,0x55,0x55,0x55,0x45,0x3c]}

tool: {"D124": [0x11,0x11,0x11,0x11,0x11,0x11,0x81,0x3f]}

tool: {"D123": [0x11,0x11,0x11,0x11,0x11,0x11,0x01,0x3c]}

tool: {"D9": [0x17,0x6c,0xc1,0x16,0x6c,0xc1,0x56,0x3f]}

tool: {"D194": [0x9f,0xf4,0x49,0x9f,0xf4,0x49,0xef,0xbb]}

tool: {"D338": [0x1a,0xa0,0x01,0x1a,0xa0,0x01,0x2a,0x3f]}

tool: {"D381": [0x1a,0xa0,0x01,0x1a,0xa0,0x01,0x6a,0x3b]}

tool: {"D352": [0x1a,0xa0,0x01,0x1a,0xa0,0x01,0xfa,0x3e]}

tool: {"D335": [0x1a,0xa0,0x01,0x1a,0xa0,0x01,0x3a,0x3b]}

tool: {"D113": [0x34,0xc7,0x56,0xa5,0xe3,0x1d,0xc7,0x3e]}

tool: {"D35": [0x00,0x6c,0xdc,0x8d,0x4f,0x15,0x6c,0xbb]}

tool: {"D454": [0x5c,0x9f,0x78,0xb7,0x4f,0x7e,0x92,0x3e]}

tool: {"D307": [0x9a,0xa9,0x4f,0x5b,0xc0,0xbb,0x3c,0x3b]}

tool: {"D60": [0xe4,0x44,0xf5,0x67,0x45,0xe6,0x5a,0x3e]}

tool: {"D281": [0x09,0xf2,0xd1,0x06,0x2e,0x06,0xfc,0xba]}

tool: {"D156": [0x98,0xd8,0xf8,0xef,0xd8,0xee,0x21,0x3e]}

tool: {"D133": [0x06,0x4c,0xe1,0x59,0xc9,0xae,0xc2,0xba]}

tool: {"D65": [0x09,0x6d,0xa8,0x13,0x46,0x12,0xe6,0x3d]}

tool: {"D240": [0xbe,0x8e,0x74,0xcc,0xe0,0x28,0x8f,0x3a]}

tool: {"D310": [0x9d,0x7c,0xc0,0xa8,0x74,0x39,0xa9,0x3d]}

tool: {"D68": [0x1f,0xfd,0x2e,0x8a,0x6f,0x5d,0x30,0x3a]}

tool: {"D157": [0x1f,0xb8,0x33,0xe7,0xf3,0xe7,0x6a,0x3d]}

tool: {"D303": [0xcb,0xe8,0x0e,0x6b,0x65,0xd8,0xe1,0x39]}

tool: {"D88": [0x1f,0xb8,0x33,0xe7,0xf3,0xe7,0x2a,0x3d]}

tool: {"D8": [0xcb,0xe8,0x0e,0x6b,0x65,0xd8,0xa1,0x39]}

tool: {"D385": [0x4a,0xad,0x30,0x70,0xc7,0x52,0xe9,0x3c]}

tool: {"D79": [0x6c,0xdc,0x5d,0x46,0x81,0xc9,0x8a,0x39]}

tool: {"D20": [0.0,-4.1923828125]}

tool: {"D354": [709.0,-1.0]}

tool: {"D342": [0.0,-1.875]}

tool: D80: 0.5

tool: D249: 9223372036854775807

tool: D410: 2

assistant: ```c
void dd_exp(const double *a, double *b) {
  const double k = 512.0;
  const double inv_k = 1.0 / k;
  const double exp1hi = 2.718281828459045091e+00;
  const double exp1lo = 1.445646891729250158e-16;
  const double log2hi = 6.931471805599452862e-01;
  const double log2lo = 2.319046813846299558e-17;
  const double dd_eps = 4.93038065763132e-32;
  double m, tol;
  double r[2];
  double s[2];
  double t[2];
  double p[2];
  int i;
  double *inv_fac;
  double i_fac[30];
  i_fac[0] = 1.66666666666666657e-01;
  i_fac[1] = 9.25185853854297066e-18;
  i_fac[2] = 4.16666666666666644e-02;
  i_fac[3] = 2.31296463463574266e-18;
  i_fac[4] = 8.33333333333333322e-03;
  i_fac[5] = 1.15648231731787138e-19;
  i_fac[6] = 1.38888888888888894e-03;
  i_fac[7] = -5.30054395437357706e-20;
  i_fac[8] = 1.98412698412698413e-04;
  i_fac[9] = 1.72095582934207053e-22;
  i_fac[10] = 2.48015873015873016e-05;
  i_fac[11] = 2.15119478667758816e-23;
  i_fac[12] = 2.75573192239858925e-06;
  i_fac[13] = -1.85839327404647208e-22;
  i_fac[14] = 2.75573192239858883e-07;
  i_fac[15] = 2.37677146222502973e-23;
  i_fac[16] = 2.50521083854417202e-08;
  i_fac[17] = -1.44881407093591197e-24;
  i_fac[18] = 2.08767569878681002e-09;
  i_fac[19] = -1.20734505911325997e-25;
  i_fac[20] = 1.60590438368216133e-10;
  i_fac[21] = 1.25852945887520981e-26;
  i_fac[22] = 1.14707455977297245e-11;
  i_fac[23] = 2.06555127528307454e-28;
  i_fac[24] = 7.64716373181981641e-13;
  i_fac[25] = 7.03872877733453001e-30;
  i_fac[26] = 4.77947733238738525e-14;
  i_fac[27] = 4.39920548583408126e-31;
  i_fac[28] = 2.81145725434552060e-15;
  i_fac[29] = 1.65088427308614326e-31;
  if (a[0] <= -709.0) {
    b[0] = 0.0;
    b[1] = 0.0;
    return;
  }
  if (a[0] >= 709.0) {
    b[0] = -1.0;
    b[1] = 0.0;
    return;
  }
  if (dd_is_zero(a) == 1) {
    b[0] = 1.0;
    b[1] = 0.0;
    return;
  }
  if (dd_is_one(a) == 1) {
    b[0] = exp1hi;
    b[1] = exp1lo;
    return;
  }
  m = floor(a[0] / log2hi + 0.5);
  r[0] = log2hi;
  r[1] = log2lo;
  dd_mlt_d(r, m);
  dd_sub(a, r, r);
  dd_mul_pwr2(r, inv_k, r);
  dd_sqr(r, p);
  dd_mul_pwr2(p, 0.5, s);
  dd_inc(s, r);
  dd_mlt(p, r);
  inv_fac = &i_fac[0];
  dd_mul(p, inv_fac, t);
  i = 0;
  tol = inv_k * dd_eps;
  do {
    dd_inc(s, t);
    dd_mlt(p, r);
    inv_fac = &i_fac[2 * (++i)];
    dd_mul(p, inv_fac, t);
  } while (fabs(t[0]) > tol && i < 5);
  dd_inc(s, t);
  for (i = 0; i < 9; i++) {
    dd_mul_pwr2(s, 2.0, p);
    dd_sqr(s, t);
    dd_add(p, t, s);
  }
  dd_add_dd_d(s, 1.0, b);
  i = (int)m;
  dd_ldexp(b, i);
}
```