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

```asm
<IntegrateEuler>:
  endbr64
  push   %rbp
  mov    %rsp,%rbp
  sub    $0x40,%rsp
  mov    %rdi,-0x28(%rbp)
  mov    %rsi,-0x30(%rbp)
  movss  %xmm0,-0x34(%rbp)
  mov    %rdx,-0x40(%rbp)
  mov    %fs:0x28,%rax
  mov    %rax,-0x8(%rbp)
  xor    %eax,%eax
  pxor   %xmm0,%xmm0
  movss  %xmm0,-0x20(%rbp)
  mov    -0x30(%rbp),%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x1c(%rbp)
  mov    -0x30(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x18(%rbp)
  mov    -0x30(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  movss  %xmm0,-0x14(%rbp)
  mov    -0x40(%rbp),%rdx
  lea    -0x20(%rbp),%rcx
  mov    -0x28(%rbp),%rax
  mov    %rcx,%rsi
  mov    %rax,%rdi
  call   <QuatMultiply@plt>
  mov    -0x28(%rbp),%rax
  movss  (%rax),%xmm0
  pxor   %xmm1,%xmm1
  cvtss2sd %xmm0,%xmm1
  pxor   %xmm2,%xmm2
  cvtss2sd -0x34(%rbp),%xmm2
  movsd  D0(%rip),%xmm0
  mulsd  %xmm0,%xmm2
  mov    -0x40(%rbp),%rax
  movss  (%rax),%xmm0
  cvtss2sd %xmm0,%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  cvtsd2ss %xmm0,%xmm0
  mov    -0x40(%rbp),%rax
  movss  %xmm0,(%rax)
  mov    -0x28(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  pxor   %xmm1,%xmm1
  cvtss2sd %xmm0,%xmm1
  pxor   %xmm2,%xmm2
  cvtss2sd -0x34(%rbp),%xmm2
  movsd  D0(%rip),%xmm0
  mulsd  %xmm0,%xmm2
  mov    -0x40(%rbp),%rax
  add    $0x4,%rax
  movss  (%rax),%xmm0
  cvtss2sd %xmm0,%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  mov    -0x40(%rbp),%rax
  add    $0x4,%rax
  cvtsd2ss %xmm0,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x28(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  pxor   %xmm1,%xmm1
  cvtss2sd %xmm0,%xmm1
  pxor   %xmm2,%xmm2
  cvtss2sd -0x34(%rbp),%xmm2
  movsd  D0(%rip),%xmm0
  mulsd  %xmm0,%xmm2
  mov    -0x40(%rbp),%rax
  add    $0x8,%rax
  movss  (%rax),%xmm0
  cvtss2sd %xmm0,%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  mov    -0x40(%rbp),%rax
  add    $0x8,%rax
  cvtsd2ss %xmm0,%xmm0
  movss  %xmm0,(%rax)
  mov    -0x28(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  pxor   %xmm1,%xmm1
  cvtss2sd %xmm0,%xmm1
  pxor   %xmm2,%xmm2
  cvtss2sd -0x34(%rbp),%xmm2
  movsd  D0(%rip),%xmm0
  mulsd  %xmm0,%xmm2
  mov    -0x40(%rbp),%rax
  add    $0xc,%rax
  movss  (%rax),%xmm0
  cvtss2sd %xmm0,%xmm0
  mulsd  %xmm2,%xmm0
  addsd  %xmm1,%xmm0
  mov    -0x40(%rbp),%rax
  add    $0xc,%rax
  cvtsd2ss %xmm0,%xmm0
  movss  %xmm0,(%rax)
  nop
  mov    -0x8(%rbp),%rax
  sub    %fs:0x28,%rax
  je     L3
  call   <__stack_chk_fail@plt>
L3:
  leave
  ret
```

tool_calls: name: disassemble_data
arguments: data_tag: D0
type_infered: f64

tool: D0: 0.5

assistant: ```c
void IntegrateEuler(const float *quat_prv, const float *omega, const float dt, float *quat_updated) {
  float omega_quat[4][1] = {{0.0}, {*(omega)}, {*(omega + 1)}, {*(omega + 2)}};
  QuatMultiply((float *)quat_prv, (float *)omega_quat, (float *)quat_updated);
  *(quat_updated) = *(quat_prv) + 0.5 * dt * (*(quat_updated));
  *(quat_updated + 1) = *(quat_prv + 1) + 0.5 * dt * (*(quat_updated + 1));
  *(quat_updated + 2) = *(quat_prv + 2) + 0.5 * dt * (*(quat_updated + 2));
  *(quat_updated + 3) = *(quat_prv + 3) + 0.5 * dt * (*(quat_updated + 3));
}
```