user: 请从给定的汇编指令推导出C源代码：

```asm
<linear_to_decibels>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x50,%rsp
  movss  %xmm0,-0x44(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  pxor   %xmm0,%xmm0
  comiss -0x44(%rbp),%xmm0
  jb     L28
  movss  D112(%rip),%xmm0
  jmp    L36
L28:
  movl   $0x0,-0x34(%rbp)
  lea    -0x34(%rbp),%rdx
  mov    -0x44(%rbp),%eax
  mov    %rdx,%rdi
  movd   %eax,%xmm0
  call   <frexpf_fast@plt>
  movd   %xmm0,%eax
  mov    %eax,-0x30(%rbp)
  mov    -0x34(%rbp),%eax
  pxor   %xmm0,%xmm0
  cvtsi2ss %eax,%xmm0
  movss  %xmm0,-0x2c(%rbp)
  movss  -0x30(%rbp),%xmm0
  comiss D93(%rip),%xmm0
  jbe    L11
  movss  -0x30(%rbp),%xmm1
  movss  D93(%rip),%xmm0
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x30(%rbp)
  movss  -0x2c(%rbp),%xmm1
  movss  D15(%rip),%xmm0
  addss  %xmm1,%xmm0
  movss  %xmm0,-0x2c(%rbp)
L11:
  movss  D113(%rip),%xmm0
  movss  %xmm0,-0x28(%rbp)
  movss  D76(%rip),%xmm0
  movss  %xmm0,-0x24(%rbp)
  movss  D40(%rip),%xmm0
  movss  %xmm0,-0x20(%rbp)
  movss  D59(%rip),%xmm0
  movss  %xmm0,-0x1c(%rbp)
  movss  D27(%rip),%xmm0
  movss  %xmm0,-0x18(%rbp)
  movss  D8(%rip),%xmm0
  movss  %xmm0,-0x14(%rbp)
  movss  -0x30(%rbp),%xmm0
  mulss  %xmm0,%xmm0
  movss  %xmm0,-0x10(%rbp)
  movss  -0x10(%rbp),%xmm0
  mulss  %xmm0,%xmm0
  movss  %xmm0,-0xc(%rbp)
  movss  -0x28(%rbp),%xmm0
  mulss  -0x30(%rbp),%xmm0
  addss  -0x24(%rbp),%xmm0
  movaps %xmm0,%xmm1
  mulss  -0xc(%rbp),%xmm1
  movss  -0x20(%rbp),%xmm0
  mulss  -0x30(%rbp),%xmm0
  addss  -0x1c(%rbp),%xmm0
  mulss  -0x10(%rbp),%xmm0
  addss  %xmm0,%xmm1
  movss  -0x18(%rbp),%xmm0
  mulss  -0x30(%rbp),%xmm0
  addss  -0x14(%rbp),%xmm0
  addss  %xmm0,%xmm1
  movss  D65(%rip),%xmm0
  mulss  %xmm0,%xmm1
  movss  -0x2c(%rbp),%xmm2
  movss  D108(%rip),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
L36:
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L5
  call   <__stack_chk_fail@plt>
L5:
  leave
  ret
```

tool_calls: name: extract_symbolic_data
arguments: tag: D112
datatype: byte[4]
name: extract_symbolic_data
arguments: tag: D93
datatype: byte[4]
name: extract_symbolic_data
arguments: tag: D15
datatype: byte[4]
name: extract_symbolic_data
arguments: tag: D113
datatype: byte[4]
name: extract_symbolic_data
arguments: tag: D76
datatype: byte[4]
name: extract_symbolic_data
arguments: tag: D40
datatype: byte[4]
name: extract_symbolic_data
arguments: tag: D59
datatype: byte[4]
name: extract_symbolic_data
arguments: tag: D27
datatype: byte[4]
name: extract_symbolic_data
arguments: tag: D8
datatype: byte[4]
name: extract_symbolic_data
arguments: tag: D65
datatype: byte[4]
name: extract_symbolic_data
arguments: tag: D108
datatype: byte[4]

tool: {"D112": [0x00,0x00,0x7a,0xc4]}

tool: {"D93": [0xf3,0x04,0x35,0x3f]}

tool: {"D15": [0x00,0x00,0x00,0x3f]}

tool: {"D113": [0x74,0xe1,0x90,0x3f]}

tool: {"D76": [0x17,0x47,0x88,0xc0]}

tool: {"D40": [0x42,0x1f,0xda,0x40]}

tool: {"D59": [0x54,0xcb,0xc3,0xc0]}

tool: {"D27": [0x3b,0xa2,0x69,0x40]}

tool: {"D8": [0xf4,0xe3,0x9b,0xbf]}

tool: {"D65": [0x00,0x00,0xa0,0x41]}

tool: {"D108": [0xc1,0xa8,0xc0,0x40]}

assistant: ```c
float linear_to_decibels(float linear) {
  if (linear <= 0)
    return -1000;
  int e = 0;
  float x = frexpf_fast(linear, &e);
  float exp = e;
  if (x > 0.707106781186548f) {
    x *= 0.707106781186548f;
    exp += 0.5f;
  }
  const float A5 = 1.131880283355712890625f;
  const float A4 = -4.258677959442138671875f;
  const float A3 = 6.81631565093994140625f;
  const float A2 = -6.1185703277587890625f;
  const float A1 = 3.6505267620086669921875f;
  const float A0 = -1.217894077301025390625f;
  float x2 = x * x;
  float x4 = x2 * x2;
  return ((A5 * x + A4) * x4 + (A3 * x + A2) * x2 + (A1 * x + A0)) * 20.0f + exp * 6.0205999132796239f;
}
```