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

```asm
<FP_Log>:
  endbr64
  push   %rbx
  sub    $0x10,%rsp
  movss  %xmm0,(%rsp)
  pxor   %xmm2,%xmm2
  movss  %xmm2,0x4(%rsp)
  jmp    L7
L45:
  movsd  D77(%rip),%xmm1
  movss  (%rsp),%xmm0
  call   <__mulsf3@plt>
  movss  %xmm0,(%rsp)
  movss  D26(%rip),%xmm1
  movss  0x4(%rsp),%xmm0
  call   <__addsf3@plt>
  movss  %xmm0,0x4(%rsp)
L7:
  mov    D76(%rip),%rax
  movq   %rax,%xmm1
  movss  (%rsp),%xmm0
  call   <FP_Cmp@plt>
  test   %rax,%rax
  jg     L45
  jmp    L62
L6:
  movsd  D17(%rip),%xmm1
  movss  (%rsp),%xmm0
  call   <__mulsf3@plt>
  movss  %xmm0,(%rsp)
  movss  D71(%rip),%xmm1
  movss  0x4(%rsp),%xmm0
  call   <__addsf3@plt>
  movss  %xmm0,0x4(%rsp)
L62:
  mov    D95(%rip),%rax
  movq   %rax,%xmm1
  movss  (%rsp),%xmm0
  call   <FP_Cmp@plt>
  test   %rax,%rax
  jg     L6
  jmp    L36
L37:
  movsd  D43(%rip),%xmm1
  movss  (%rsp),%xmm0
  call   <__mulsf3@plt>
  movss  %xmm0,(%rsp)
  movss  D71(%rip),%xmm1
  movss  0x4(%rsp),%xmm0
  call   <__subsf3@plt>
  movss  %xmm0,0x4(%rsp)
L36:
  mov    D17(%rip),%rax
  movq   %rax,%xmm1
  movss  (%rsp),%xmm0
  call   <FP_Cmp@plt>
  test   %rax,%rax
  js     L37
  movss  D63(%rip),%xmm1
  movss  (%rsp),%xmm0
  call   <__subsf3@plt>
  movss  %xmm0,0xc(%rsp)
  movss  D81(%rip),%xmm3
  movss  %xmm3,(%rsp)
  pxor   %xmm4,%xmm4
  movss  %xmm4,0x8(%rsp)
  mov    $0x1,%ebx
L31:
  movss  0xc(%rsp),%xmm0
  call   <__negsf2@plt>
  movapd %xmm0,%xmm1
  movss  (%rsp),%xmm0
  call   <__mulsf3@plt>
  movss  %xmm0,(%rsp)
  mov    %ebx,%edi
  call   <__floatsisf@plt>
  mov    %eax,%edi
  movss  (%rsp),%xmm0
  call   <__divsf3@plt>
  movaps %xmm0,%xmm1
  movss  0x8(%rsp),%xmm0
  call   <__addsf3@plt>
  movss  %xmm0,0x8(%rsp)
  add    $0x1,%ebx
  cmp    $0xe,%ebx
  jne    L31
  movss  0x4(%rsp),%xmm1
  call   <__addsf3@plt>
  add    $0x10,%rsp
  pop    %rbx
  ret
```

tool_calls: name: retrieve_data
arguments: tag: D77
type: f64
name: retrieve_data
arguments: tag: D26
type: byte[4]
name: retrieve_data
arguments: tag: D76
type: f64
name: retrieve_data
arguments: tag: D17
type: f64
name: retrieve_data
arguments: tag: D71
type: f32
name: retrieve_data
arguments: tag: D95
type: f64
name: retrieve_data
arguments: tag: D43
type: f64
name: retrieve_data
arguments: tag: D63
type: f32
name: retrieve_data
arguments: tag: D81
type: byte[4]

tool: D77: 0.0625

tool: {"D26": [0x18,0x72,0x31,0x40]}

tool: D76: 16

tool: D17: 0.5

tool: D71: 0.69314718

tool: D95: 1.5

tool: D43: 2

tool: D63: 1

tool: {"D81": [0x00,0x00,0x80,0xbf]}

assistant: ```c
float FP_Log(float x) {
  const float log_2 = (float)0.69314718;
  int n;
  float answer, top, add;
  add = 0.0;
  while (FP_Cmp(x, 16.0) > 0) {
    x = __mulsf3(x, (float)0.0625);
    add = __addsf3(add, (float)(log_2 * 4));
  }
  while (FP_Cmp(x, 1.5) > 0) {
    x = __mulsf3(x, 0.5);
    add = __addsf3(add, log_2);
  }
  while (FP_Cmp(x, 0.5) < 0) {
    x = __mulsf3(x, 2.0);
    add = __subsf3(add, log_2);
  }
  x = __subsf3(x, 1.0);
  answer = 0.0;
  top = -1.0;
  for (n = 1; n < 14; ++n) {
    top = __mulsf3(top, __negsf2(x));
    answer = __addsf3(answer, __divsf3(top, __floatsisf(n)));
  }
  return __addsf3(answer, add);
}
```