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

```asm
<collide>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  push   %r12
  push   %rbx
  sub    $0x40,%rsp
  movss  %xmm0,-0x24(%rbp)
  movss  %xmm1,-0x28(%rbp)
  movss  %xmm2,-0x2c(%rbp)
  movss  %xmm3,-0x30(%rbp)
  movss  %xmm4,-0x34(%rbp)
  movss  %xmm5,-0x38(%rbp)
  movss  %xmm6,-0x3c(%rbp)
  movss  %xmm7,-0x40(%rbp)
  mov    %rdi,-0x48(%rbp)
  movss  -0x28(%rbp),%xmm0
  movaps %xmm0,%xmm3
  subss  -0x3c(%rbp),%xmm3
  movss  -0x24(%rbp),%xmm0
  movaps %xmm0,%xmm2
  subss  -0x38(%rbp),%xmm2
  movss  -0x30(%rbp),%xmm0
  movaps %xmm0,%xmm1
  subss  0x10(%rbp),%xmm1
  movss  -0x2c(%rbp),%xmm0
  subss  -0x40(%rbp),%xmm0
  movd   %xmm0,%eax
  movd   %eax,%xmm0
  call   <dot@plt>
  movd   %xmm0,%eax
  movsd  D23(%rip),%xmm0
  movapd %xmm0,%xmm1
  movd   %eax,%xmm0
  call   <pow@plt>
  movd   %xmm0,%ebx
  movss  -0x30(%rbp),%xmm0
  movaps %xmm0,%xmm3
  subss  0x10(%rbp),%xmm3
  movss  -0x2c(%rbp),%xmm0
  movaps %xmm0,%xmm2
  subss  -0x40(%rbp),%xmm2
  movss  -0x30(%rbp),%xmm0
  movaps %xmm0,%xmm1
  subss  0x10(%rbp),%xmm1
  movss  -0x2c(%rbp),%xmm0
  subss  -0x40(%rbp),%xmm0
  movd   %xmm0,%eax
  movd   %eax,%xmm0
  call   <dot@plt>
  movss  %xmm0,-0x4c(%rbp)
  movss  -0x28(%rbp),%xmm0
  movaps %xmm0,%xmm3
  subss  -0x3c(%rbp),%xmm3
  movss  -0x24(%rbp),%xmm0
  movaps %xmm0,%xmm2
  subss  -0x38(%rbp),%xmm2
  movss  -0x28(%rbp),%xmm0
  movaps %xmm0,%xmm1
  subss  -0x3c(%rbp),%xmm1
  movss  -0x24(%rbp),%xmm0
  movaps %xmm0,%xmm4
  subss  -0x38(%rbp),%xmm4
  movd   %xmm4,%eax
  movd   %eax,%xmm0
  call   <dot@plt>
  movd   %xmm0,%r12d
  movss  -0x34(%rbp),%xmm0
  movaps %xmm0,%xmm5
  addss  0x18(%rbp),%xmm5
  movd   %xmm5,%eax
  movsd  D23(%rip),%xmm0
  movapd %xmm0,%xmm1
  movd   %eax,%xmm0
  call   <pow@plt>
  movd   %r12d,%xmm1
  subss  %xmm0,%xmm1
  mulss  -0x4c(%rbp),%xmm1
  movd   %ebx,%xmm0
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x14(%rbp)
  movss  -0x28(%rbp),%xmm0
  movaps %xmm0,%xmm3
  subss  -0x3c(%rbp),%xmm3
  movss  -0x24(%rbp),%xmm0
  movaps %xmm0,%xmm2
  subss  -0x38(%rbp),%xmm2
  movss  -0x30(%rbp),%xmm0
  movaps %xmm0,%xmm1
  subss  0x10(%rbp),%xmm1
  movss  -0x2c(%rbp),%xmm0
  subss  -0x40(%rbp),%xmm0
  movd   %xmm0,%eax
  movd   %eax,%xmm0
  call   <dot@plt>
  movd   %xmm0,%eax
  pxor   %xmm0,%xmm0
  movd   %eax,%xmm7
  comiss %xmm0,%xmm7
  jae    L21
  pxor   %xmm0,%xmm0
  comiss -0x14(%rbp),%xmm0
  jbe    L23
L21:
  mov    $0x0,%eax
  jmp    L26
L23:
  movss  -0x28(%rbp),%xmm0
  movaps %xmm0,%xmm3
  subss  -0x3c(%rbp),%xmm3
  movss  -0x24(%rbp),%xmm0
  movaps %xmm0,%xmm2
  subss  -0x38(%rbp),%xmm2
  movss  -0x30(%rbp),%xmm0
  movaps %xmm0,%xmm1
  subss  0x10(%rbp),%xmm1
  movss  -0x2c(%rbp),%xmm0
  subss  -0x40(%rbp),%xmm0
  movd   %xmm0,%eax
  movd   %eax,%xmm0
  call   <dot@plt>
  movss  %xmm0,-0x4c(%rbp)
  movsd  D29(%rip),%xmm0
  mov    -0x14(%rbp),%eax
  movapd %xmm0,%xmm1
  movd   %eax,%xmm0
  call   <pow@plt>
  addss  -0x4c(%rbp),%xmm0
  movss  D22(%rip),%xmm1
  xorps  %xmm1,%xmm0
  movss  %xmm0,-0x4c(%rbp)
  movss  -0x30(%rbp),%xmm0
  movaps %xmm0,%xmm3
  subss  0x10(%rbp),%xmm3
  movss  -0x2c(%rbp),%xmm0
  movaps %xmm0,%xmm2
  subss  -0x40(%rbp),%xmm2
  movss  -0x30(%rbp),%xmm0
  movaps %xmm0,%xmm1
  subss  0x10(%rbp),%xmm1
  movss  -0x2c(%rbp),%xmm0
  movaps %xmm0,%xmm6
  subss  -0x40(%rbp),%xmm6
  movd   %xmm6,%eax
  movd   %eax,%xmm0
  call   <dot@plt>
  movaps %xmm0,%xmm1
  movss  -0x4c(%rbp),%xmm0
  divss  %xmm1,%xmm0
  mov    -0x48(%rbp),%rax
  movss  %xmm0,(%rax)
  mov    $0x1,%eax
L26:
  add    $0x40,%rsp
  pop    %rbx
  pop    %r12
  pop    %rbp
  ret
```

tool_calls: name: parse_data
arguments: tag: D23
type_infered: byte[8]
name: parse_data
arguments: tag: D29
type_infered: f64
name: parse_data
arguments: tag: D22
type_infered: byte[4]

tool: {"D23": [0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x40]}

tool: D29: 0.5

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

assistant: ```c
int collide(float rx1, float ry1, float vx1, float vy1, float rad1, float rx2, float ry2, float vx2, float vy2, float rad2, float *t) {
  float d;
  d = pow(dot(vx1 - vx2, vy1 - vy2, rx1 - rx2, ry1 - ry2), 2) - dot(vx1 - vx2, vy1 - vy2, vx1 - vx2, vy1 - vy2) * (dot(rx1 - rx2, ry1 - ry2, rx1 - rx2, ry1 - ry2) - pow(rad1 + rad2, 2));
  if (dot(vx1 - vx2, vy1 - vy2, rx1 - rx2, ry1 - ry2) >= 0 || d < 0)
    return 0;
  else {
    *t = -(dot(vx1 - vx2, vy1 - vy2, rx1 - rx2, ry1 - ry2) + pow(d, 0.5)) / (dot(vx1 - vx2, vy1 - vy2, vx1 - vx2, vy1 - vy2));
    return 1;
  }
}
```