user: Translate the below assembly code into C programming language:

```asm
<fastBounceIn>:
  endbr64
  push   %rbx
  sub    $0x20,%rsp
  movss  %xmm0,0xc(%rsp)
  movss  %xmm1,0x14(%rsp)
  movss  %xmm2,0x18(%rsp)
  movss  %xmm3,0x8(%rsp)
  movss  %xmm4,0x1c(%rsp)
  ucomiss D86(%rip),%xmm0
  setnp  %al
  mov    $0x0,%edx
  cmovne %edx,%eax
  test   %al,%al
  jne    L69
  mov    %edi,%ebx
  ucomiss D86(%rip),%xmm2
  setnp  %al
  cmovne %edx,%eax
  test   %al,%al
  jne    L69
  ucomiss D37(%rip),%xmm0
  jp     L150
  je     L122
L150:
  movss  0x8(%rsp),%xmm3
  ucomiss D37(%rip),%xmm3
  jp     L8
  jne    L8
  pxor   %xmm1,%xmm1
  cvtsi2sd %ebx,%xmm1
  addsd  D86(%rip),%xmm1
  movsd  D42(%rip),%xmm0
  divsd  %xmm1,%xmm0
  pxor   %xmm1,%xmm1
  cvtsd2ss %xmm0,%xmm1
  movss  %xmm1,(%rsp)
L157:
  test   %ebx,%ebx
  js     L51
  mov    $0x0,%eax
  pxor   %xmm7,%xmm7
  movss  %xmm7,0x4(%rsp)
  jmp    L10
L122:
  movaps %xmm2,%xmm0
  addss  0x14(%rsp),%xmm0
  jmp    L112
L8:
  pxor   %xmm0,%xmm0
  cvtsi2ss %ebx,%xmm0
  cvttss2si 0x8(%rsp),%edi
  call   <pow@plt>
  movss  D37(%rip),%xmm2
  movaps %xmm0,%xmm1
  subss  %xmm2,%xmm1
  movss  0x8(%rsp),%xmm3
  subss  %xmm2,%xmm3
  divss  %xmm3,%xmm1
  mulss  D45(%rip),%xmm0
  addss  %xmm1,%xmm0
  divss  %xmm0,%xmm2
  movss  %xmm2,(%rsp)
  jmp    L157
L118:
  movss  (%rsp),%xmm7
  mulss  0x8(%rsp),%xmm7
  movss  %xmm7,(%rsp)
  add    $0x1,%eax
  cmp    %eax,%ebx
  jl     L44
L10:
  movss  0x4(%rsp),%xmm6
  movaps %xmm6,%xmm5
  movss  %xmm6,0x10(%rsp)
  addss  (%rsp),%xmm6
  movss  %xmm6,0x4(%rsp)
  movss  0xc(%rsp),%xmm4
  comiss %xmm5,%xmm4
  jb     L118
  comiss %xmm4,%xmm6
  jbe    L118
  sub    %eax,%ebx
  pxor   %xmm0,%xmm0
  cvtsi2ss %ebx,%xmm0
  mulss  0x1c(%rsp),%xmm0
  mov    $0x2,%edi
  call   <pow@plt>
  movaps %xmm0,%xmm3
  movss  0x4(%rsp),%xmm0
  addss  0x10(%rsp),%xmm0
  movss  D20(%rip),%xmm2
  mulss  %xmm2,%xmm0
  movss  0xc(%rsp),%xmm1
  subss  %xmm0,%xmm1
  movss  (%rsp),%xmm0
  mulss  %xmm2,%xmm0
  divss  %xmm0,%xmm1
  mulss  %xmm1,%xmm1
  movss  D37(%rip),%xmm2
  subss  %xmm1,%xmm2
  pxor   %xmm0,%xmm0
  cvtss2sd 0x18(%rsp),%xmm0
  divsd  D3(%rip),%xmm0
  pxor   %xmm1,%xmm1
  cvtss2sd %xmm3,%xmm1
  divsd  %xmm1,%xmm0
  cvtsd2ss %xmm0,%xmm0
  mulss  %xmm0,%xmm2
  movss  0x14(%rsp),%xmm0
  addss  %xmm2,%xmm0
  jmp    L112
L44:
  pxor   %xmm0,%xmm0
  jmp    L112
L69:
  movss  0x14(%rsp),%xmm0
L112:
  add    $0x20,%rsp
  pop    %rbx
  ret
L51:
  pxor   %xmm0,%xmm0
  jmp    L112
```

tool_calls: name: extract_symbolic_data
arguments: data_label: D86
type_infered: f64
name: extract_symbolic_data
arguments: data_label: D37
type_infered: f32
name: extract_symbolic_data
arguments: data_label: D42
type_infered: f32[2]
name: extract_symbolic_data
arguments: data_label: D45
type_infered: byte[4]
name: extract_symbolic_data
arguments: data_label: D20
type_infered: byte[4]
name: extract_symbolic_data
arguments: data_label: D3
type_infered: f64

tool: D86: 0.25

tool: D37: 1

tool: {"D42": [0.0,1.875]}

tool: {"D45": [0x00,0x00,0x80,0x3e]}

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

tool: D3: 0.75

assistant: ```c
float fastBounceIn(float fraction, float start, float delta, int bounces, float growth, float damping) {
  if (fraction == 0 || delta == 0)
    return start;
  if (fraction == 1)
    return start + delta;
  float w0;
  if (growth == 1.0)
    w0 = 1 / (bounces + 0.25);
  else {
    float gN = pow(growth, bounces);
    w0 = 1 / ((gN - 1) / (growth - 1) + gN / 4);
  }
  float bounceStart = 0;
  int i;
  float w = w0;
  for (i = 0; i <= bounces; i++) {
    float bounceEnd = bounceStart + w;
    if (fraction >= bounceStart && fraction < bounceEnd) {
      float half = (bounceEnd + bounceStart) / 2;
      float top = delta / 0.75 / pow(2, damping * ((bounces - i)));
      fraction -= half;
      fraction /= (w / 2);
      return (1 - fraction * fraction) * top + start;
    }
    bounceStart = bounceEnd;
    w = w * growth;
  }
  return 0;
}
```