user: Demonstrate the C code that generates the assembly output below:

```asm
<hex_to_double>:
  endbr64
  movabs $0xfffffffeffffe9ff,%rcx
  push   %r14
  push   %r13
  push   %r12
  push   %rbp
  push   %rbx
  mov    %rdi,%rbx
  sub    $0x10,%rsp
  nopl   (%rax)
L3:
  mov    %rbx,%rdx
  movzbl (%rbx),%eax
  add    $0x1,%rbx
  cmp    $0x20,%al
  jbe    L48
L76:
  movsd  D16(%rip),%xmm2
  movsd  %xmm2,0x8(%rsp)
  cmp    $0x2d,%al
  jne    L103
  movsd  D19(%rip),%xmm5
  movzbl 0x1(%rdx),%eax
  lea    0x2(%rdx),%rbx
  movsd  %xmm5,0x8(%rsp)
L103:
  cmp    $0x2e,%al
  je     L46
  movsd  0x8(%rsp),%xmm0
  mulsd  D15(%rip),%xmm0
  add    $0x10,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
  nopl   (%rax)
L48:
  cmp    $0xb,%al
  je     L3
  bt     %rax,%rcx
  jae    L3
  jmp    L76
  nopl   0x0(%rax)
L46:
  mov    %rbx,%rbp
  nopl   0x0(%rax,%rax,1)
L86:
  mov    %rbp,%r13
  movsbl 0x0(%rbp),%edi
  add    $0x1,%rbp
  mov    %edi,%r14d
  call   <hexdig@plt>
  test   %eax,%eax
  jns    L86
  cmp    %r13,%rbx
  jae    L42
  pxor   %xmm4,%xmm4
  mov    %r13,%r12
  movsd  %xmm4,(%rsp)
  nopl   0x0(%rax)
L98:
  movsbl -0x1(%r12),%edi
  sub    $0x1,%r12
  call   <hexdig@plt>
  pxor   %xmm0,%xmm0
  cvtsi2sd %eax,%xmm0
  addsd  (%rsp),%xmm0
  mulsd  D12(%rip),%xmm0
  movsd  %xmm0,(%rsp)
  cmp    %r12,%rbx
  jne    L98
L118:
  and    $0xffffffdf,%r14d
  xor    %edi,%edi
  cmp    $0x58,%r14b
  jne    L131
  movsbl 0x0(%rbp),%edi
  cmp    $0x2d,%dil
  je     L45
  add    $0x2,%r13
  mov    $0x1,%r12d
L139:
  xor    %ebp,%ebp
  jmp    L10
  nopw   0x0(%rax,%rax,1)
L1:
  shl    $0x4,%ebp
  movsbl 0x0(%r13),%edi
  add    $0x1,%r13
  add    %eax,%ebp
L10:
  call   <hexdig@plt>
  test   %eax,%eax
  jns    L1
  mov    %ebp,%edi
  imul   %r12d,%edi
L131:
  movsd  (%rsp),%xmm0
  call   <ldexp@plt>
  mulsd  0x8(%rsp),%xmm0
  add    $0x10,%rsp
  pop    %rbx
  pop    %rbp
  pop    %r12
  pop    %r13
  pop    %r14
  ret
L45:
  movsbl 0x1(%rbp),%edi
  lea    0x2(%rbp),%r13
  mov    $0xffffffff,%r12d
  jmp    L139
L42:
  pxor   %xmm6,%xmm6
  movsd  %xmm6,(%rsp)
  jmp    L118
```

tool_calls: name: parse_data
arguments: tag: D16
type_infered: f64
name: parse_data
arguments: tag: D19
type_infered: f32[2]
name: parse_data
arguments: tag: D15
type_infered: f32[2]
name: parse_data
arguments: tag: D12
type_infered: f64

tool: D16: 1

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

tool: {"D15": [0.0,0.0]}

tool: D12: 0.0625

assistant: ```c
double hex_to_double(char *s) {
  char c;
  char *p1;
  char *p2;
  int digit;
  int expon;
  int esign;
  double msign;
  double mant;
  double value;
  for (;;) {
    c = *s++;
    if (c == ' ')
      continue;
    if (c == '\n')
      continue;
    if (c == '\t')
      continue;
    if (c == '\f')
      continue;
    if (c != '\v')
      break;
  }
  msign = 1.0;
  if (c == '-') {
    msign = -1.0;
    c = *s++;
  }
  mant = 0.0;
  if (c != '.')
    return (msign * mant);
  p1 = s;
  for (;;) {
    c = *s++;
    digit = hexdig(c);
    if (digit < 0)
      break;
  }
  for (p2 = s - 1; p2 > p1;) {
    digit = hexdig(*--p2);
    mant += ((double)digit);
    mant *= 0.0625;
  }
  expon = 0;
  if ((c == 'x') || (c == 'X')) {
    c = *s++;
    esign = 1;
    if (c == '-') {
      esign = -1;
      c = *s++;
    }
    for (;;) {
      digit = hexdig(c);
      if (digit < 0)
        break;
      expon = (expon << 4) + digit;
      c = *s++;
    }
    expon *= esign;
  }
  value = msign * ldexp(mant, expon);
  return (value);
}
```