user: Demonstrate the C code that generates the assembly output below:

```asm
<fromToRotation>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x90,%rsp
  mov    %rdi,-0x78(%rbp)
  mov    %rsi,-0x80(%rbp)
  mov    %rdx,-0x88(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  mov    -0x78(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  mov    -0x80(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  mov    -0x78(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm2
  mov    -0x80(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x38(%rbp)
  mov    -0x78(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  mov    -0x80(%rbp),%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  mov    -0x78(%rbp),%rax
  movss  (%rax),%xmm2
  mov    -0x80(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x34(%rbp)
  mov    -0x78(%rbp),%rax
  movss  (%rax),%xmm1
  mov    -0x80(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  mulss  %xmm1,%xmm0
  mov    -0x78(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm2
  mov    -0x80(%rbp),%rax
  movss  (%rax),%xmm1
  mulss  %xmm2,%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x30(%rbp)
  mov    -0x78(%rbp),%rax
  movss  (%rax),%xmm1
  mov    -0x80(%rbp),%rax
  movss  (%rax),%xmm0
  mulss  %xmm0,%xmm1
  mov    -0x78(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm2
  mov    -0x80(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  mov    -0x78(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm2
  mov    -0x80(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm1,%xmm0
  movss  %xmm0,-0x64(%rbp)
  pxor   %xmm0,%xmm0
  comiss -0x64(%rbp),%xmm0
  jbe    L178
  movss  -0x64(%rbp),%xmm0
  movss  D92(%rip),%xmm1
  xorps  %xmm1,%xmm0
  jmp    L88
L178:
  movss  -0x64(%rbp),%xmm0
L88:
  movss  %xmm0,-0x60(%rbp)
  pxor   %xmm0,%xmm0
  cvtss2sd -0x60(%rbp),%xmm0
  comisd D69(%rip),%xmm0
  jbe    L54
  mov    -0x78(%rbp),%rax
  movss  (%rax),%xmm0
  pxor   %xmm1,%xmm1
  comiss %xmm1,%xmm0
  jbe    L67
  mov    -0x78(%rbp),%rax
  movss  (%rax),%xmm0
  jmp    L37
L67:
  mov    -0x78(%rbp),%rax
  movss  (%rax),%xmm0
  movss  D92(%rip),%xmm1
  xorps  %xmm1,%xmm0
L37:
  movss  %xmm0,-0x14(%rbp)
  mov    -0x78(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  pxor   %xmm1,%xmm1
  comiss %xmm1,%xmm0
  jbe    L197
  mov    -0x78(%rbp),%rax
  movss  0x4(%rax),%xmm0
  jmp    L62
L197:
  mov    -0x78(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  movss  D92(%rip),%xmm1
  xorps  %xmm1,%xmm0
L62:
  movss  %xmm0,-0x10(%rbp)
  mov    -0x78(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  pxor   %xmm1,%xmm1
  comiss %xmm1,%xmm0
  jbe    L9
  mov    -0x78(%rbp),%rax
  movss  0x8(%rax),%xmm0
  jmp    L69
L9:
  mov    -0x78(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  movss  D92(%rip),%xmm1
  xorps  %xmm1,%xmm0
L69:
  movss  %xmm0,-0xc(%rbp)
  movss  -0x14(%rbp),%xmm1
  movss  -0x10(%rbp),%xmm0
  comiss %xmm1,%xmm0
  jbe    L35
  movss  -0x14(%rbp),%xmm1
  movss  -0xc(%rbp),%xmm0
  comiss %xmm1,%xmm0
  jbe    L153
  movss  D90(%rip),%xmm0
  movss  %xmm0,-0x14(%rbp)
  pxor   %xmm0,%xmm0
  movss  %xmm0,-0xc(%rbp)
  movss  -0xc(%rbp),%xmm0
  movss  %xmm0,-0x10(%rbp)
  jmp    L113
L153:
  movss  D90(%rip),%xmm0
  movss  %xmm0,-0xc(%rbp)
  pxor   %xmm0,%xmm0
  movss  %xmm0,-0x10(%rbp)
  movss  -0x10(%rbp),%xmm0
  movss  %xmm0,-0x14(%rbp)
  jmp    L113
L35:
  movss  -0x10(%rbp),%xmm1
  movss  -0xc(%rbp),%xmm0
  comiss %xmm1,%xmm0
  jbe    L84
  movss  D90(%rip),%xmm0
  movss  %xmm0,-0x10(%rbp)
  pxor   %xmm0,%xmm0
  movss  %xmm0,-0xc(%rbp)
  movss  -0xc(%rbp),%xmm0
  movss  %xmm0,-0x14(%rbp)
  jmp    L113
L84:
  movss  D90(%rip),%xmm0
  movss  %xmm0,-0xc(%rbp)
  pxor   %xmm0,%xmm0
  movss  %xmm0,-0x10(%rbp)
  movss  -0x10(%rbp),%xmm0
  movss  %xmm0,-0x14(%rbp)
L113:
  movss  -0x14(%rbp),%xmm0
  mov    -0x78(%rbp),%rax
  movss  (%rax),%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x2c(%rbp)
  movss  -0x10(%rbp),%xmm0
  mov    -0x78(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x28(%rbp)
  movss  -0xc(%rbp),%xmm0
  mov    -0x78(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x24(%rbp)
  movss  -0x14(%rbp),%xmm0
  mov    -0x80(%rbp),%rax
  movss  (%rax),%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x20(%rbp)
  movss  -0x10(%rbp),%xmm0
  mov    -0x80(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x1c(%rbp)
  movss  -0xc(%rbp),%xmm0
  mov    -0x80(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm1
  subss  %xmm1,%xmm0
  movss  %xmm0,-0x18(%rbp)
  movss  -0x2c(%rbp),%xmm1
  movss  -0x2c(%rbp),%xmm0
  mulss  %xmm0,%xmm1
  movss  -0x28(%rbp),%xmm2
  movss  -0x28(%rbp),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  movss  -0x24(%rbp),%xmm2
  movss  -0x24(%rbp),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  movss  D87(%rip),%xmm0
  divss  %xmm1,%xmm0
  movss  %xmm0,-0x44(%rbp)
  movss  -0x20(%rbp),%xmm1
  movss  -0x20(%rbp),%xmm0
  mulss  %xmm0,%xmm1
  movss  -0x1c(%rbp),%xmm2
  movss  -0x1c(%rbp),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  movss  -0x18(%rbp),%xmm2
  movss  -0x18(%rbp),%xmm0
  mulss  %xmm2,%xmm0
  addss  %xmm0,%xmm1
  movss  D87(%rip),%xmm0
  divss  %xmm1,%xmm0
  movss  %xmm0,-0x40(%rbp)
  movss  -0x44(%rbp),%xmm0
  movaps %xmm0,%xmm1
  mulss  -0x40(%rbp),%xmm1
  movss  -0x2c(%rbp),%xmm2
  movss  -0x20(%rbp),%xmm0
  mulss  %xmm0,%xmm2
  movss  -0x28(%rbp),%xmm3
  movss  -0x1c(%rbp),%xmm0
  mulss  %xmm3,%xmm0
  addss  %xmm0,%xmm2
  movss  -0x24(%rbp),%xmm3
  movss  -0x18(%rbp),%xmm0
  mulss  %xmm3,%xmm0
  addss  %xmm2,%xmm0
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x3c(%rbp)
  movl   $0x0,-0x6c(%rbp)
  jmp    L177
L118:
  movl   $0x0,-0x68(%rbp)
  jmp    L0
L148:
  movss  -0x44(%rbp),%xmm0
  movss  D92(%rip),%xmm1
  xorps  %xmm0,%xmm1
  mov    -0x6c(%rbp),%eax
  cltq
  movss  -0x2c(%rbp,%rax,4),%xmm0
  mulss  %xmm0,%xmm1
  mov    -0x68(%rbp),%eax
  cltq
  movss  -0x2c(%rbp,%rax,4),%xmm0
  mulss  %xmm1,%xmm0
  mov    -0x6c(%rbp),%eax
  cltq
  movss  -0x20(%rbp,%rax,4),%xmm1
  movaps %xmm1,%xmm2
  mulss  -0x40(%rbp),%xmm2
  mov    -0x68(%rbp),%eax
  cltq
  movss  -0x20(%rbp,%rax,4),%xmm1
  mulss  %xmm1,%xmm2
  movaps %xmm0,%xmm1
  subss  %xmm2,%xmm1
  mov    -0x6c(%rbp),%eax
  cltq
  movss  -0x20(%rbp,%rax,4),%xmm0
  movaps %xmm0,%xmm2
  mulss  -0x3c(%rbp),%xmm2
  mov    -0x68(%rbp),%eax
  cltq
  movss  -0x2c(%rbp,%rax,4),%xmm0
  mulss  %xmm2,%xmm0
  mov    -0x6c(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  shl    $0x2,%rax
  mov    %rax,%rdx
  mov    -0x88(%rbp),%rax
  add    %rax,%rdx
  addss  %xmm1,%xmm0
  mov    -0x68(%rbp),%eax
  cltq
  movss  %xmm0,(%rdx,%rax,4)
  addl   $0x1,-0x68(%rbp)
L0:
  cmpl   $0x2,-0x68(%rbp)
  jle    L148
  mov    -0x6c(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  shl    $0x2,%rax
  mov    %rax,%rdx
  mov    -0x88(%rbp),%rax
  add    %rax,%rdx
  mov    -0x6c(%rbp),%eax
  cltq
  movss  (%rdx,%rax,4),%xmm1
  mov    -0x6c(%rbp),%eax
  movslq %eax,%rdx
  mov    %rdx,%rax
  add    %rax,%rax
  add    %rdx,%rax
  shl    $0x2,%rax
  mov    %rax,%rdx
  mov    -0x88(%rbp),%rax
  add    %rax,%rdx
  movss  D90(%rip),%xmm0
  addss  %xmm1,%xmm0
  mov    -0x6c(%rbp),%eax
  cltq
  movss  %xmm0,(%rdx,%rax,4)
  addl   $0x1,-0x6c(%rbp)
L177:
  cmpl   $0x2,-0x6c(%rbp)
  jle    L118
  jmp    L119
L54:
  pxor   %xmm1,%xmm1
  cvtss2sd -0x64(%rbp),%xmm1
  movsd  D45(%rip),%xmm0
  addsd  %xmm0,%xmm1
  movsd  D45(%rip),%xmm0
  divsd  %xmm1,%xmm0
  cvtsd2ss %xmm0,%xmm0
  movss  %xmm0,-0x5c(%rbp)
  movss  -0x38(%rbp),%xmm0
  movss  -0x5c(%rbp),%xmm1
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x58(%rbp)
  movss  -0x30(%rbp),%xmm0
  movss  -0x5c(%rbp),%xmm1
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x54(%rbp)
  movss  -0x34(%rbp),%xmm0
  movss  -0x58(%rbp),%xmm1
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x50(%rbp)
  movss  -0x30(%rbp),%xmm0
  movss  -0x58(%rbp),%xmm1
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x4c(%rbp)
  movss  -0x34(%rbp),%xmm0
  movss  -0x54(%rbp),%xmm1
  mulss  %xmm1,%xmm0
  movss  %xmm0,-0x48(%rbp)
  movss  -0x38(%rbp),%xmm0
  mulss  -0x58(%rbp),%xmm0
  addss  -0x64(%rbp),%xmm0
  mov    -0x88(%rbp),%rax
  movss  %xmm0,(%rax)
  movss  -0x30(%rbp),%xmm1
  movss  -0x50(%rbp),%xmm0
  subss  %xmm1,%xmm0
  mov    -0x88(%rbp),%rax
  movss  %xmm0,0x4(%rax)
  movss  -0x34(%rbp),%xmm0
  addss  -0x4c(%rbp),%xmm0
  mov    -0x88(%rbp),%rax
  movss  %xmm0,0x8(%rax)
  movss  -0x30(%rbp),%xmm0
  mov    -0x88(%rbp),%rax
  add    $0xc,%rax
  addss  -0x50(%rbp),%xmm0
  movss  %xmm0,(%rax)
  movss  -0x34(%rbp),%xmm0
  movaps %xmm0,%xmm1
  mulss  -0x5c(%rbp),%xmm1
  movss  -0x34(%rbp),%xmm0
  mulss  %xmm1,%xmm0
  mov    -0x88(%rbp),%rax
  add    $0xc,%rax
  addss  -0x64(%rbp),%xmm0
  movss  %xmm0,0x4(%rax)
  movss  -0x38(%rbp),%xmm1
  mov    -0x88(%rbp),%rax
  add    $0xc,%rax
  movss  -0x48(%rbp),%xmm0
  subss  %xmm1,%xmm0
  movss  %xmm0,0x8(%rax)
  movss  -0x34(%rbp),%xmm1
  mov    -0x88(%rbp),%rax
  add    $0x18,%rax
  movss  -0x4c(%rbp),%xmm0
  subss  %xmm1,%xmm0
  movss  %xmm0,(%rax)
  movss  -0x38(%rbp),%xmm0
  mov    -0x88(%rbp),%rax
  add    $0x18,%rax
  addss  -0x48(%rbp),%xmm0
  movss  %xmm0,0x4(%rax)
  movss  -0x30(%rbp),%xmm0
  mulss  -0x54(%rbp),%xmm0
  mov    -0x88(%rbp),%rax
  add    $0x18,%rax
  addss  -0x64(%rbp),%xmm0
  movss  %xmm0,0x8(%rax)
L119:
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L173
  call   <__stack_chk_fail@plt>
L173:
  leave
  ret
```

tool_calls: name: retrieve_data
arguments: label: D92
type_infered: byte[4]
name: retrieve_data
arguments: label: D69
type_infered: byte[16]
name: retrieve_data
arguments: label: D90
type_infered: f32
name: retrieve_data
arguments: label: D87
type_infered: f32
name: retrieve_data
arguments: label: D45
type_infered: f32[2]

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

tool: {"D69": [0xe9,0x0b,0x21,0xe7,0xfd,0xff,0xef,0x3f,0x00,0x00,0x80,0x3f,0x00,0x00,0x00,0x40]}

tool: D90: 1

tool: D87: 2

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

assistant: ```c
void fromToRotation(float from[3], float to[3], float mtx[3][3]) {
  float v[3];
  float e, h, f;
  {
    v[0] = from[1] * to[2] - from[2] * to[1];
    v[1] = from[2] * to[0] - from[0] * to[2];
    v[2] = from[0] * to[1] - from[1] * to[0];
  };
  e = (from[0] * to[0] + from[1] * to[1] + from[2] * to[2]);
  f = (e < 0) ? -e : e;
  if (f > 1.0 - 0.000001) {
    float u[3], v[3];
    float x[3];
    float c1, c2, c3;
    int i, j;
    x[0] = (from[0] > 0.0) ? from[0] : -from[0];
    x[1] = (from[1] > 0.0) ? from[1] : -from[1];
    x[2] = (from[2] > 0.0) ? from[2] : -from[2];
    if (x[0] < x[1]) {
      if (x[0] < x[2]) {
        x[0] = 1.0;
        x[1] = x[2] = 0.0;
      } else {
        x[2] = 1.0;
        x[0] = x[1] = 0.0;
      }
    } else {
      if (x[1] < x[2]) {
        x[1] = 1.0;
        x[0] = x[2] = 0.0;
      } else {
        x[2] = 1.0;
        x[0] = x[1] = 0.0;
      }
    }
    u[0] = x[0] - from[0];
    u[1] = x[1] - from[1];
    u[2] = x[2] - from[2];
    v[0] = x[0] - to[0];
    v[1] = x[1] - to[1];
    v[2] = x[2] - to[2];
    c1 = 2.0 / (u[0] * u[0] + u[1] * u[1] + u[2] * u[2]);
    c2 = 2.0 / (v[0] * v[0] + v[1] * v[1] + v[2] * v[2]);
    c3 = c1 * c2 * (u[0] * v[0] + u[1] * v[1] + u[2] * v[2]);
    for (i = 0; i < 3; i++) {
      for (j = 0; j < 3; j++) {
        mtx[i][j] = -c1 * u[i] * u[j] - c2 * v[i] * v[j] + c3 * v[i] * u[j];
      }
      mtx[i][i] += 1.0;
    }
  } else {
    float hvx, hvz, hvxy, hvxz, hvyz;
    h = 1.0 / (1.0 + e);
    hvx = h * v[0];
    hvz = h * v[2];
    hvxy = hvx * v[1];
    hvxz = hvx * v[2];
    hvyz = hvz * v[1];
    mtx[0][0] = e + hvx * v[0];
    mtx[0][1] = hvxy - v[2];
    mtx[0][2] = hvxz + v[1];
    mtx[1][0] = hvxy + v[2];
    mtx[1][1] = e + h * v[1] * v[1];
    mtx[1][2] = hvyz - v[0];
    mtx[2][0] = hvxz - v[1];
    mtx[2][1] = hvyz + v[0];
    mtx[2][2] = e + hvz * v[2];
  }
}
```