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

```asm
<FastAsin>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x30,%rsp
  movss  %xmm0,-0x24(%rbp)
  movss  D108(%rip),%xmm0
  movss  %xmm0,-0x14(%rbp)
  movss  -0x24(%rbp),%xmm0
  movss  %xmm0,-0x20(%rbp)
  pxor   %xmm0,%xmm0
  comiss -0x20(%rbp),%xmm0
  jbe    L48
  movss  -0x20(%rbp),%xmm0
  movss  D2(%rip),%xmm1
  xorps  %xmm1,%xmm0
  movss  %xmm0,-0x20(%rbp)
  movss  -0x14(%rbp),%xmm0
  movss  D2(%rip),%xmm1
  xorps  %xmm1,%xmm0
  movss  %xmm0,-0x14(%rbp)
L48:
  movss  -0x20(%rbp),%xmm0
  comiss D164(%rip),%xmm0
  jbe    L43
  movq   $0x1,-0x8(%rbp)
  movss  -0x20(%rbp),%xmm0
  movss  D108(%rip),%xmm1
  comiss %xmm1,%xmm0
  jbe    L97
  pxor   %xmm0,%xmm0
  movss  %xmm0,-0x18(%rbp)
  movss  -0x18(%rbp),%xmm0
  jmp    L73
L97:
  movss  D108(%rip),%xmm0
  movaps %xmm0,%xmm1
  subss  -0x20(%rbp),%xmm1
  movss  D164(%rip),%xmm0
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x1c(%rbp)
  mov    -0x1c(%rbp),%eax
  movd   %eax,%xmm0
  call   <FastSqrt@plt>
  movss  D62(%rip),%xmm1
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x20(%rbp)
  jmp    L76
L43:
  movq   $0x0,-0x8(%rbp)
  movss  D22(%rip),%xmm0
  comiss -0x20(%rbp),%xmm0
  jbe    L61
  movss  -0x20(%rbp),%xmm0
  movss  %xmm0,-0x18(%rbp)
  pxor   %xmm0,%xmm0
  comiss -0x14(%rbp),%xmm0
  jbe    L45
  movss  -0x18(%rbp),%xmm0
  movss  D2(%rip),%xmm1
  xorps  %xmm1,%xmm0
  movss  %xmm0,-0x18(%rbp)
L45:
  movss  -0x18(%rbp),%xmm0
  jmp    L73
L61:
  movss  -0x20(%rbp),%xmm0
  mulss  %xmm0,%xmm0
  movss  %xmm0,-0x1c(%rbp)
L76:
  movss  -0x1c(%rbp),%xmm1
  movss  D9(%rip),%xmm0
  mulss  %xmm0,%xmm1
  movss  D11(%rip),%xmm0
  addss  %xmm1,%xmm0
  mulss  -0x1c(%rbp),%xmm0
  movss  D28(%rip),%xmm1
  subss  %xmm1,%xmm0
  movss  -0x1c(%rbp),%xmm1
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x10(%rbp)
  movss  -0x1c(%rbp),%xmm0
  movss  D59(%rip),%xmm1
  subss  %xmm1,%xmm0
  movaps %xmm0,%xmm1
  mulss  -0x1c(%rbp),%xmm1
  movss  D134(%rip),%xmm0
  addss  %xmm1,%xmm0
  mulss  -0x1c(%rbp),%xmm0
  movss  D81(%rip),%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0xc(%rbp)
  movss  -0x10(%rbp),%xmm0
  divss  -0xc(%rbp),%xmm0
  movss  %xmm0,-0x18(%rbp)
  movss  -0x18(%rbp),%xmm0
  mulss  -0x20(%rbp),%xmm0
  movss  -0x20(%rbp),%xmm1
  addss  %xmm1,%xmm0
  movss  %xmm0,-0x18(%rbp)
  cmpq   $0x1,-0x8(%rbp)
  jne    L19
  movss  -0x18(%rbp),%xmm1
  movss  D49(%rip),%xmm0
  addss  %xmm1,%xmm0
  movss  %xmm0,-0x18(%rbp)
L19:
  pxor   %xmm0,%xmm0
  comiss -0x14(%rbp),%xmm0
  jbe    L34
  movss  -0x18(%rbp),%xmm0
  movss  D2(%rip),%xmm1
  xorps  %xmm1,%xmm0
  movss  %xmm0,-0x18(%rbp)
L34:
  movss  -0x18(%rbp),%xmm0
L73:
  leave
  ret
```

tool_calls: name: unpack_data
arguments: tag: D108
datatype: f32
name: unpack_data
arguments: tag: D2
datatype: byte[4]
name: unpack_data
arguments: tag: D164
datatype: f32
name: unpack_data
arguments: tag: D62
datatype: byte[4]
name: unpack_data
arguments: tag: D22
datatype: byte[4]
name: unpack_data
arguments: tag: D9
datatype: byte[4]
name: unpack_data
arguments: tag: D11
datatype: byte[4]
name: unpack_data
arguments: tag: D28
datatype: byte[4]
name: unpack_data
arguments: tag: D59
datatype: byte[4]
name: unpack_data
arguments: tag: D134
datatype: byte[4]
name: unpack_data
arguments: tag: D81
datatype: byte[4]
name: unpack_data
arguments: tag: D49
datatype: byte[4]

tool: D108: 1

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

tool: D164: 0.5

tool: {"D62": [0x00,0x00,0x00,0xc0]}

tool: {"D22": [0xf3,0x04,0xb5,0x39]}

tool: {"D9": [0x3f,0x31,0x18,0xbf]}

tool: {"D11": [0xe0,0xf9,0x39,0x40]}

tool: {"D28": [0x20,0x1b,0x30,0x40]}

tool: {"D59": [0x85,0x57,0x25,0x41]}

tool: {"D134": [0xf7,0xea,0xc6,0x41]}

tool: {"D81": [0x58,0x14,0x84,0x41]}

tool: {"D49": [0xdb,0x0f,0xc9,0x3f]}

assistant: ```c
float FastAsin(float x) {
  float y, g;
  float num, den, result;
  long i;
  float sign = 1.0;
  y = x;
  if (y < (float)0.0) {
    y = -y;
    sign = -sign;
  }
  if (y > (float)0.5) {
    i = 1;
    if (y > (float)1.0) {
      result = 0.0;
      return result;
    }
    g = (1.0f - y) * 0.5f;
    y = -2.0f * FastSqrt(g);
  } else {
    i = 0;
    if (y < (float)(+3.452669830012e-4f)) {
      result = y;
      if (sign < (float)0.0) {
        result = -result;
      }
      return result;
    }
    g = y * y;
  }
  num = (((-5.9450144193246e-1f) * g + (+2.9058762374859f)) * g + (-2.7516555290596f)) * g;
  den = ((g + (-1.0333867072113e+1f)) * g + (+2.4864728969164e+1f)) * g + (-1.6509933202424e+1f);
  result = num / den;
  result = result * y + y;
  if (i == 1) {
    result = result + (float)(1.5707963267948966192313216916398f);
  }
  if (sign < (float)0.0) {
    result = -result;
  }
  return result;
}
```