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

```asm
<__gen_ocl_internal_log10>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  movss  %xmm0,-0x34(%rbp)
  pxor   %xmm0,%xmm0
  movss  %xmm0,-0x28(%rbp)
  movss  D3(%rip),%xmm0
  movss  %xmm0,-0x24(%rbp)
  movss  D52(%rip),%xmm0
  movss  %xmm0,-0x20(%rbp)
  movss  D24(%rip),%xmm0
  movss  %xmm0,-0x1c(%rbp)
  movss  D48(%rip),%xmm0
  movss  %xmm0,-0x18(%rbp)
  movss  -0x34(%rbp),%xmm0
  movss  %xmm0,-0x2c(%rbp)
  mov    -0x2c(%rbp),%eax
  mov    %eax,-0x14(%rbp)
  movl   $0x0,-0x10(%rbp)
  cmpl   $0x7fffff,-0x14(%rbp)
  jg     L6
  mov    -0x14(%rbp),%eax
  and    $0x7fffffff,%eax
  test   %eax,%eax
  jne    L44
  movss  -0x24(%rbp),%xmm0
  movss  D20(%rip),%xmm1
  xorps  %xmm1,%xmm0
  divss  -0x28(%rbp),%xmm0
  jmp    L32
L44:
  cmpl   $0x0,-0x14(%rbp)
  jns    L25
  mov    $0x0,%eax
  call   <__ocl_nanf@plt>
  jmp    L32
L25:
  mov    $0x0,%eax
  call   <__ocl_inff@plt>
  movd   %xmm0,%eax
  movss  D20(%rip),%xmm0
  movd   %eax,%xmm2
  xorps  %xmm0,%xmm2
  movaps %xmm2,%xmm0
  jmp    L32
L6:
  cmpl   $0x7f7fffff,-0x14(%rbp)
  jle    L65
  movss  -0x34(%rbp),%xmm0
  addss  %xmm0,%xmm0
  jmp    L32
L65:
  mov    -0x14(%rbp),%eax
  sar    $0x17,%eax
  sub    $0x7f,%eax
  add    %eax,-0x10(%rbp)
  mov    -0x10(%rbp),%eax
  shr    $0x1f,%eax
  mov    %eax,-0xc(%rbp)
  mov    -0x14(%rbp),%eax
  and    $0x7fffff,%eax
  mov    %eax,%edx
  mov    $0x7f,%eax
  sub    -0xc(%rbp),%eax
  shl    $0x17,%eax
  or     %edx,%eax
  mov    %eax,-0x14(%rbp)
  mov    -0x10(%rbp),%edx
  mov    -0xc(%rbp),%eax
  add    %edx,%eax
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  movss  %xmm0,-0x8(%rbp)
  mov    -0x14(%rbp),%eax
  mov    %eax,-0x2c(%rbp)
  movss  -0x2c(%rbp),%xmm0
  movss  %xmm0,-0x34(%rbp)
  movss  -0x8(%rbp),%xmm0
  mulss  -0x18(%rbp),%xmm0
  movss  %xmm0,-0x38(%rbp)
  mov    -0x34(%rbp),%eax
  movd   %eax,%xmm0
  call   <__gen_ocl_internal_log@plt>
  movd   %xmm0,%eax
  movd   %eax,%xmm4
  mulss  -0x20(%rbp),%xmm4
  movaps %xmm4,%xmm0
  addss  -0x38(%rbp),%xmm0
  movss  %xmm0,-0x4(%rbp)
  movss  -0x8(%rbp),%xmm0
  mulss  -0x1c(%rbp),%xmm0
  addss  -0x4(%rbp),%xmm0
L32:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_label: D3
type_infered: byte[4]
name: disassemble_data
arguments: data_label: D52
type_infered: byte[4]
name: disassemble_data
arguments: data_label: D24
type_infered: byte[4]
name: disassemble_data
arguments: data_label: D48
type_infered: byte[4]
name: disassemble_data
arguments: data_label: D20
type_infered: byte[4]

tool: {"D3": [0x00,0x00,0x00,0x4c]}

tool: {"D52": [0xd9,0x5b,0xde,0x3e]}

tool: {"D24": [0x80,0x20,0x9a,0x3e]}

tool: {"D48": [0xdb,0x27,0x54,0x35]}

tool: {"D20": [0x00,0x00,0x00,0x80]}

assistant: ```c
__attribute__((overloadable, always_)) float __gen_ocl_internal_log10(float x) {
  union {
    float f;
    unsigned i;
  } u;
  const float zero = 0.0, two25 = 3.3554432000e+07, ivln10 = 4.3429449201e-01, log10_2hi = 3.0102920532e-01, log10_2lo = 7.9034151668e-07;
  float y, z;
  int i, k, hx;
  u.f = x;
  hx = u.i;
  k = 0;
  if (hx < 0x00800000) {
    if ((hx & 0x7fffffff) == 0)
      return -two25 / zero;
    if (hx < 0)
      return (__ocl_nanf());
    return -(__ocl_inff());
  }
  if (hx >= 0x7f800000)
    return x + x;
  k += (hx >> 23) - 127;
  i = ((unsigned)k & 0x80000000) >> 31;
  hx = (hx & 0x007fffff) | ((0x7f - i) << 23);
  y = (float)(k + i);
  u.i = hx;
  x = u.f;
  z = y * log10_2lo + ivln10 * __gen_ocl_internal_log(x);
  return z + y * log10_2hi;
}
```