#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ floats_normalize(float *, int, float *);
int sqrt(double);
void floats_mat_to_quat(const float M[16], float q[4]) {
  double T = M[0] + M[5] + M[10] + 1.0;
  double S;
  if (T > 0.0000001) {
    S = sqrt(T) * 2;
    q[0] = (float)(0.25 * S);
    q[1] = (float)((M[9] - M[6]) / S);
    q[2] = (float)((M[2] - M[8]) / S);
    q[3] = (float)((M[4] - M[1]) / S);
  } else if (M[0] > M[5] && M[0] > M[10]) {
    S = sqrt(1.0 + M[0] - M[5] - M[10]) * 2;
    q[0] = (float)((M[9] - M[6]) / S);
    q[1] = (float)(0.25 * S);
    q[2] = (float)((M[4] + M[1]) / S);
    q[3] = (float)((M[2] + M[8]) / S);
  } else if (M[5] > M[10]) {
    S = sqrt(1.0 + M[5] - M[0] - M[10]) * 2;
    q[0] = (float)((M[2] - M[8]) / S);
    q[1] = (float)((M[4] + M[1]) / S);
    q[2] = (float)(0.25 * S);
    q[3] = (float)((M[9] + M[6]) / S);
  } else {
    S = sqrt(1.0 + M[10] - M[0] - M[5]);
    q[0] = (float)((M[4] - M[1]) / S);
    q[1] = (float)((M[2] + M[8]) / S);
    q[2] = (float)((M[9] + M[6]) / S);
    q[3] = (float)(0.25 * S);
  }
  floats_normalize(q, 4, q);
}


x86 assembly (clang, -O0):
<floats_mat_to_quat>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x8(%rbp),%rax
addss  0x14(%rax),%xmm0
mov    -0x8(%rbp),%rax
addss  0x28(%rax),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xeb2(%rip),%xmm1
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x18(%rbp),%xmm0
movsd  0xe94(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1222 <floats_mat_to_quat+0x102>
movsd  -0x18(%rbp),%xmm0
call   1040 <sqrt@plt>
shl    $0x1,%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  0xe7c(%rip),%xmm0
mulsd  -0x20(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
movss  0x24(%rax),%xmm0
mov    -0x8(%rbp),%rax
subss  0x18(%rax),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  -0x20(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,0x4(%rax)
mov    -0x8(%rbp),%rax
movss  0x8(%rax),%xmm0
mov    -0x8(%rbp),%rax
subss  0x20(%rax),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  -0x20(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,0x8(%rax)
mov    -0x8(%rbp),%rax
movss  0x10(%rax),%xmm0
mov    -0x8(%rbp),%rax
subss  0x4(%rax),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  -0x20(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,0xc(%rax)
jmp    150a <floats_mat_to_quat+0x3ea>
mov    -0x8(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x8(%rbp),%rax
ucomiss 0x14(%rax),%xmm0
jbe    132f <floats_mat_to_quat+0x20f>
mov    -0x8(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x8(%rbp),%rax
ucomiss 0x28(%rax),%xmm0
jbe    132f <floats_mat_to_quat+0x20f>
mov    -0x8(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xda6(%rip),%xmm0
addsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movss  0x14(%rax),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movss  0x28(%rax),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
call   1040 <sqrt@plt>
shl    $0x1,%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movss  0x24(%rax),%xmm0
mov    -0x8(%rbp),%rax
subss  0x18(%rax),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  -0x20(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,(%rax)
movsd  0xd48(%rip),%xmm0
mulsd  -0x20(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,0x4(%rax)
mov    -0x8(%rbp),%rax
movss  0x10(%rax),%xmm0
mov    -0x8(%rbp),%rax
addss  0x4(%rax),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  -0x20(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,0x8(%rax)
mov    -0x8(%rbp),%rax
movss  0x8(%rax),%xmm0
mov    -0x8(%rbp),%rax
addss  0x20(%rax),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  -0x20(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,0xc(%rax)
jmp    1505 <floats_mat_to_quat+0x3e5>
mov    -0x8(%rbp),%rax
movss  0x14(%rax),%xmm0
mov    -0x8(%rbp),%rax
ucomiss 0x28(%rax),%xmm0
jbe    1427 <floats_mat_to_quat+0x307>
mov    -0x8(%rbp),%rax
movss  0x14(%rax),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xcad(%rip),%xmm0
addsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movss  (%rax),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movss  0x28(%rax),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
call   1040 <sqrt@plt>
shl    $0x1,%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movss  0x8(%rax),%xmm0
mov    -0x8(%rbp),%rax
subss  0x20(%rax),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  -0x20(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
movss  0x10(%rax),%xmm0
mov    -0x8(%rbp),%rax
addss  0x4(%rax),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  -0x20(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,0x4(%rax)
movsd  0xc28(%rip),%xmm0
mulsd  -0x20(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,0x8(%rax)
mov    -0x8(%rbp),%rax
movss  0x24(%rax),%xmm0
mov    -0x8(%rbp),%rax
addss  0x18(%rax),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  -0x20(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,0xc(%rax)
jmp    1500 <floats_mat_to_quat+0x3e0>
mov    -0x8(%rbp),%rax
movss  0x28(%rax),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xbcc(%rip),%xmm0
addsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movss  (%rax),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movss  0x14(%rax),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
call   1040 <sqrt@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x8(%rbp),%rax
movss  0x10(%rax),%xmm0
mov    -0x8(%rbp),%rax
subss  0x4(%rax),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  -0x20(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rax
movss  0x8(%rax),%xmm0
mov    -0x8(%rbp),%rax
addss  0x20(%rax),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  -0x20(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,0x4(%rax)
mov    -0x8(%rbp),%rax
movss  0x24(%rax),%xmm0
mov    -0x8(%rbp),%rax
addss  0x18(%rax),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  -0x20(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,0x8(%rax)
movsd  0xb22(%rip),%xmm0
mulsd  -0x20(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,0xc(%rax)
jmp    1505 <floats_mat_to_quat+0x3e5>
jmp    150a <floats_mat_to_quat+0x3ea>
mov    -0x10(%rbp),%rdi
mov    -0x10(%rbp),%rdx
mov    $0x4,%esi
call   1030 <floats_normalize@plt>
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<floats_mat_to_quat>:
push   %r14
push   %rbx
push   %rax
mov    %rdi,%rbx
movss  (%rdi),%xmm3
movss  0x14(%rdi),%xmm1
movaps %xmm3,%xmm0
addss  %xmm1,%xmm0
movss  0x28(%rdi),%xmm2
addss  %xmm2,%xmm0
cvtss2sd %xmm0,%xmm0
addsd  0xeb4(%rip),%xmm0
mov    %rsi,%r14
ucomisd 0xeb1(%rip),%xmm0
jbe    11c3 <floats_mat_to_quat+0xa3>
call   1040 <sqrt@plt>
add    %eax,%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
movsd  0xea1(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%r14)
movss  0x24(%rbx),%xmm0
subss  0x18(%rbx),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,0x4(%r14)
movss  0x8(%rbx),%xmm0
subss  0x20(%rbx),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,0x8(%r14)
movss  0x10(%rbx),%xmm0
subss  0x4(%rbx),%xmm0
jmp    12f4 <floats_mat_to_quat+0x1d4>
ucomiss %xmm1,%xmm3
jbe    1261 <floats_mat_to_quat+0x141>
ucomiss %xmm2,%xmm3
jbe    1261 <floats_mat_to_quat+0x141>
xorps  %xmm0,%xmm0
cvtss2sd %xmm3,%xmm0
addsd  0xe1c(%rip),%xmm0
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
xorps  %xmm1,%xmm1
cvtss2sd %xmm2,%xmm1
subsd  %xmm1,%xmm0
call   1040 <sqrt@plt>
add    %eax,%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
movss  0x24(%rbx),%xmm0
subss  0x18(%rbx),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%r14)
movsd  0xde8(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,0x4(%r14)
movss  0x10(%rbx),%xmm0
addss  0x4(%rbx),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,0x8(%r14)
movss  0x8(%rbx),%xmm0
addss  0x20(%rbx),%xmm0
jmp    12f4 <floats_mat_to_quat+0x1d4>
ucomiss %xmm2,%xmm1
jbe    131d <floats_mat_to_quat+0x1fd>
xorps  %xmm0,%xmm0
cvtss2sd %xmm1,%xmm0
addsd  0xd87(%rip),%xmm0
xorps  %xmm1,%xmm1
cvtss2sd %xmm3,%xmm1
subsd  %xmm1,%xmm0
xorps  %xmm1,%xmm1
cvtss2sd %xmm2,%xmm1
subsd  %xmm1,%xmm0
call   1040 <sqrt@plt>
add    %eax,%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
movss  0x8(%rbx),%xmm0
subss  0x20(%rbx),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%r14)
movss  0x10(%rbx),%xmm0
addss  0x4(%rbx),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,0x4(%r14)
movsd  0xd34(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,0x8(%r14)
movss  0x24(%rbx),%xmm0
addss  0x18(%rbx),%xmm0
cvtss2sd %xmm0,%xmm0
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,0xc(%r14)
mov    %r14,%rdi
mov    $0x4,%esi
mov    %r14,%rdx
add    $0x8,%rsp
pop    %rbx
pop    %r14
jmp    1030 <floats_normalize@plt>
xorps  %xmm0,%xmm0
cvtss2sd %xmm2,%xmm0
addsd  0xcd4(%rip),%xmm0
xorps  %xmm2,%xmm2
cvtss2sd %xmm3,%xmm2
subsd  %xmm2,%xmm0
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
call   1040 <sqrt@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movss  0x10(%rbx),%xmm1
subss  0x4(%rbx),%xmm1
cvtss2sd %xmm1,%xmm1
divsd  %xmm0,%xmm1
cvtsd2ss %xmm1,%xmm1
movss  %xmm1,(%r14)
movss  0x8(%rbx),%xmm1
addss  0x20(%rbx),%xmm1
cvtss2sd %xmm1,%xmm1
divsd  %xmm0,%xmm1
cvtsd2ss %xmm1,%xmm1
movss  %xmm1,0x4(%r14)
movss  0x24(%rbx),%xmm1
addss  0x18(%rbx),%xmm1
cvtss2sd %xmm1,%xmm1
divsd  %xmm0,%xmm1
cvtsd2ss %xmm1,%xmm1
movss  %xmm1,0x8(%r14)
mulsd  0xc6a(%rip),%xmm0
jmp    12fc <floats_mat_to_quat+0x1dc>

LLVM IR (-O0):
define void @floats_mat_to_quat(float* %0, float* %1) {
%3 = alloca float*
%4 = alloca float*
%5 = alloca double
%6 = alloca double
store float* %0, float** %3
store float* %1, float** %4
%7 = load float*, float** %3
%8 = getelementptr inbounds float, float* %7, i64 0
%9 = load float, float* %8
%10 = load float*, float** %3
%11 = getelementptr inbounds float, float* %10, i64 5
%12 = load float, float* %11
%13 = fadd float %9, %12
%14 = load float*, float** %3
%15 = getelementptr inbounds float, float* %14, i64 10
%16 = load float, float* %15
%17 = fadd float %13, %16
%18 = fpext float %17 to double
%19 = fadd double %18, 1.000000e+00
store double %19, double* %5
%20 = load double, double* %5
%21 = fcmp ogt double %20, 0x3E7AD7F29ABCAF48
br i1 %21, label %22, label %71
22: ; preds = %2
%23 = load double, double* %5
%24 = call i32 @sqrt(double %23)
%25 = mul nsw i32 %24, 2
%26 = sitofp i32 %25 to double
store double %26, double* %6
%27 = load double, double* %6
%28 = fmul double 2.500000e-01, %27
%29 = fptrunc double %28 to float
%30 = load float*, float** %4
%31 = getelementptr inbounds float, float* %30, i64 0
store float %29, float* %31
%32 = load float*, float** %3
%33 = getelementptr inbounds float, float* %32, i64 9
%34 = load float, float* %33
%35 = load float*, float** %3
%36 = getelementptr inbounds float, float* %35, i64 6
%37 = load float, float* %36
%38 = fsub float %34, %37
%39 = fpext float %38 to double
%40 = load double, double* %6
%41 = fdiv double %39, %40
%42 = fptrunc double %41 to float
%43 = load float*, float** %4
%44 = getelementptr inbounds float, float* %43, i64 1
store float %42, float* %44
%45 = load float*, float** %3
%46 = getelementptr inbounds float, float* %45, i64 2
%47 = load float, float* %46
%48 = load float*, float** %3
%49 = getelementptr inbounds float, float* %48, i64 8
%50 = load float, float* %49
%51 = fsub float %47, %50
%52 = fpext float %51 to double
%53 = load double, double* %6
%54 = fdiv double %52, %53
%55 = fptrunc double %54 to float
%56 = load float*, float** %4
%57 = getelementptr inbounds float, float* %56, i64 2
store float %55, float* %57
%58 = load float*, float** %3
%59 = getelementptr inbounds float, float* %58, i64 4
%60 = load float, float* %59
%61 = load float*, float** %3
%62 = getelementptr inbounds float, float* %61, i64 1
%63 = load float, float* %62
%64 = fsub float %60, %63
%65 = fpext float %64 to double
%66 = load double, double* %6
%67 = fdiv double %65, %66
%68 = fptrunc double %67 to float
%69 = load float*, float** %4
%70 = getelementptr inbounds float, float* %69, i64 3
store float %68, float* %70
br label %285
71: ; preds = %2
%72 = load float*, float** %3
%73 = getelementptr inbounds float, float* %72, i64 0
%74 = load float, float* %73
%75 = load float*, float** %3
%76 = getelementptr inbounds float, float* %75, i64 5
%77 = load float, float* %76
%78 = fcmp ogt float %74, %77
br i1 %78, label %79, label %150
79: ; preds = %71
%80 = load float*, float** %3
%81 = getelementptr inbounds float, float* %80, i64 0
%82 = load float, float* %81
%83 = load float*, float** %3
%84 = getelementptr inbounds float, float* %83, i64 10
%85 = load float, float* %84
%86 = fcmp ogt float %82, %85
br i1 %86, label %87, label %150
87: ; preds = %79
%88 = load float*, float** %3
%89 = getelementptr inbounds float, float* %88, i64 0
%90 = load float, float* %89
%91 = fpext float %90 to double
%92 = fadd double 1.000000e+00, %91
%93 = load float*, float** %3
%94 = getelementptr inbounds float, float* %93, i64 5
%95 = load float, float* %94
%96 = fpext float %95 to double
%97 = fsub double %92, %96
%98 = load float*, float** %3
%99 = getelementptr inbounds float, float* %98, i64 10
%100 = load float, float* %99
%101 = fpext float %100 to double
%102 = fsub double %97, %101
%103 = call i32 @sqrt(double %102)
%104 = mul nsw i32 %103, 2
%105 = sitofp i32 %104 to double
store double %105, double* %6
%106 = load float*, float** %3
%107 = getelementptr inbounds float, float* %106, i64 9
%108 = load float, float* %107
%109 = load float*, float** %3
%110 = getelementptr inbounds float, float* %109, i64 6
%111 = load float, float* %110
%112 = fsub float %108, %111
%113 = fpext float %112 to double
%114 = load double, double* %6
%115 = fdiv double %113, %114
%116 = fptrunc double %115 to float
%117 = load float*, float** %4
%118 = getelementptr inbounds float, float* %117, i64 0
store float %116, float* %118
%119 = load double, double* %6
%120 = fmul double 2.500000e-01, %119
%121 = fptrunc double %120 to float
%122 = load float*, float** %4
%123 = getelementptr inbounds float, float* %122, i64 1
store float %121, float* %123
%124 = load float*, float** %3
%125 = getelementptr inbounds float, float* %124, i64 4
%126 = load float, float* %125
%127 = load float*, float** %3
%128 = getelementptr inbounds float, float* %127, i64 1
%129 = load float, float* %128
%130 = fadd float %126, %129
%131 = fpext float %130 to double
%132 = load double, double* %6
%133 = fdiv double %131, %132
%134 = fptrunc double %133 to float
%135 = load float*, float** %4
%136 = getelementptr inbounds float, float* %135, i64 2
store float %134, float* %136
%137 = load float*, float** %3
%138 = getelementptr inbounds float, float* %137, i64 2
%139 = load float, float* %138
%140 = load float*, float** %3
%141 = getelementptr inbounds float, float* %140, i64 8
%142 = load float, float* %141
%143 = fadd float %139, %142
%144 = fpext float %143 to double
%145 = load double, double* %6
%146 = fdiv double %144, %145
%147 = fptrunc double %146 to float
%148 = load float*, float** %4
%149 = getelementptr inbounds float, float* %148, i64 3
store float %147, float* %149
br label %284
150: ; preds = %79, %71
%151 = load float*, float** %3
%152 = getelementptr inbounds float, float* %151, i64 5
%153 = load float, float* %152
%154 = load float*, float** %3
%155 = getelementptr inbounds float, float* %154, i64 10
%156 = load float, float* %155
%157 = fcmp ogt float %153, %156
br i1 %157, label %158, label %221
158: ; preds = %150
%159 = load float*, float** %3
%160 = getelementptr inbounds float, float* %159, i64 5
%161 = load float, float* %160
%162 = fpext float %161 to double
%163 = fadd double 1.000000e+00, %162
%164 = load float*, float** %3
%165 = getelementptr inbounds float, float* %164, i64 0
%166 = load float, float* %165
%167 = fpext float %166 to double
%168 = fsub double %163, %167
%169 = load float*, float** %3
%170 = getelementptr inbounds float, float* %169, i64 10
%171 = load float, float* %170
%172 = fpext float %171 to double
%173 = fsub double %168, %172
%174 = call i32 @sqrt(double %173)
%175 = mul nsw i32 %174, 2
%176 = sitofp i32 %175 to double
store double %176, double* %6
%177 = load float*, float** %3
%178 = getelementptr inbounds float, float* %177, i64 2
%179 = load float, float* %178
%180 = load float*, float** %3
%181 = getelementptr inbounds float, float* %180, i64 8
%182 = load float, float* %181
%183 = fsub float %179, %182
%184 = fpext float %183 to double
%185 = load double, double* %6
%186 = fdiv double %184, %185
%187 = fptrunc double %186 to float
%188 = load float*, float** %4
%189 = getelementptr inbounds float, float* %188, i64 0
store float %187, float* %189
%190 = load float*, float** %3
%191 = getelementptr inbounds float, float* %190, i64 4
%192 = load float, float* %191
%193 = load float*, float** %3
%194 = getelementptr inbounds float, float* %193, i64 1
%195 = load float, float* %194
%196 = fadd float %192, %195
%197 = fpext float %196 to double
%198 = load double, double* %6
%199 = fdiv double %197, %198
%200 = fptrunc double %199 to float
%201 = load float*, float** %4
%202 = getelementptr inbounds float, float* %201, i64 1
store float %200, float* %202
%203 = load double, double* %6
%204 = fmul double 2.500000e-01, %203
%205 = fptrunc double %204 to float
%206 = load float*, float** %4
%207 = getelementptr inbounds float, float* %206, i64 2
store float %205, float* %207
%208 = load float*, float** %3
%209 = getelementptr inbounds float, float* %208, i64 9
%210 = load float, float* %209
%211 = load float*, float** %3
%212 = getelementptr inbounds float, float* %211, i64 6
%213 = load float, float* %212
%214 = fadd float %210, %213
%215 = fpext float %214 to double
%216 = load double, double* %6
%217 = fdiv double %215, %216
%218 = fptrunc double %217 to float
%219 = load float*, float** %4
%220 = getelementptr inbounds float, float* %219, i64 3
store float %218, float* %220
br label %283
221: ; preds = %150
%222 = load float*, float** %3
%223 = getelementptr inbounds float, float* %222, i64 10
%224 = load float, float* %223
%225 = fpext float %224 to double
%226 = fadd double 1.000000e+00, %225
%227 = load float*, float** %3
%228 = getelementptr inbounds float, float* %227, i64 0
%229 = load float, float* %228
%230 = fpext float %229 to double
%231 = fsub double %226, %230
%232 = load float*, float** %3
%233 = getelementptr inbounds float, float* %232, i64 5
%234 = load float, float* %233
%235 = fpext float %234 to double
%236 = fsub double %231, %235
%237 = call i32 @sqrt(double %236)
%238 = sitofp i32 %237 to double
store double %238, double* %6
%239 = load float*, float** %3
%240 = getelementptr inbounds float, float* %239, i64 4
%241 = load float, float* %240
%242 = load float*, float** %3
%243 = getelementptr inbounds float, float* %242, i64 1
%244 = load float, float* %243
%245 = fsub float %241, %244
%246 = fpext float %245 to double
%247 = load double, double* %6
%248 = fdiv double %246, %247
%249 = fptrunc double %248 to float
%250 = load float*, float** %4
%251 = getelementptr inbounds float, float* %250, i64 0
store float %249, float* %251
%252 = load float*, float** %3
%253 = getelementptr inbounds float, float* %252, i64 2
%254 = load float, float* %253
%255 = load float*, float** %3
%256 = getelementptr inbounds float, float* %255, i64 8
%257 = load float, float* %256
%258 = fadd float %254, %257
%259 = fpext float %258 to double
%260 = load double, double* %6
%261 = fdiv double %259, %260
%262 = fptrunc double %261 to float
%263 = load float*, float** %4
%264 = getelementptr inbounds float, float* %263, i64 1
store float %262, float* %264
%265 = load float*, float** %3
%266 = getelementptr inbounds float, float* %265, i64 9
%267 = load float, float* %266
%268 = load float*, float** %3
%269 = getelementptr inbounds float, float* %268, i64 6
%270 = load float, float* %269
%271 = fadd float %267, %270
%272 = fpext float %271 to double
%273 = load double, double* %6
%274 = fdiv double %272, %273
%275 = fptrunc double %274 to float
%276 = load float*, float** %4
%277 = getelementptr inbounds float, float* %276, i64 2
store float %275, float* %277
%278 = load double, double* %6
%279 = fmul double 2.500000e-01, %278
%280 = fptrunc double %279 to float
%281 = load float*, float** %4
%282 = getelementptr inbounds float, float* %281, i64 3
store float %280, float* %282
br label %283
283: ; preds = %221, %158
br label %284
284: ; preds = %283, %87
br label %285
285: ; preds = %284, %22
%286 = load float*, float** %4
%287 = load float*, float** %4
%288 = call i32 @floats_normalize(float* %286, i32 4, float* %287)
ret void
}

LLVM IR (-O2):
define void @floats_mat_to_quat(float* %0, float* %1) {
%3 = load float, float* %0
%4 = getelementptr inbounds float, float* %0, i64 5
%5 = load float, float* %4
%6 = fadd float %3, %5
%7 = getelementptr inbounds float, float* %0, i64 10
%8 = load float, float* %7
%9 = fadd float %6, %8
%10 = fpext float %9 to double
%11 = fadd double %10, 1.000000e+00
%12 = fcmp ogt double %11, 0x3E7AD7F29ABCAF48
br i1 %12, label %13, label %44
13: ; preds = %2
%14 = tail call i32 @sqrt(double %11)
%15 = shl nsw i32 %14, 1
%16 = sitofp i32 %15 to double
%17 = fmul double %16, 2.500000e-01
%18 = fptrunc double %17 to float
store float %18, float* %1
%19 = getelementptr inbounds float, float* %0, i64 9
%20 = load float, float* %19
%21 = getelementptr inbounds float, float* %0, i64 6
%22 = load float, float* %21
%23 = fsub float %20, %22
%24 = fpext float %23 to double
%25 = fdiv double %24, %16
%26 = fptrunc double %25 to float
%27 = getelementptr inbounds float, float* %1, i64 1
store float %26, float* %27
%28 = getelementptr inbounds float, float* %0, i64 2
%29 = load float, float* %28
%30 = getelementptr inbounds float, float* %0, i64 8
%31 = load float, float* %30
%32 = fsub float %29, %31
%33 = fpext float %32 to double
%34 = fdiv double %33, %16
%35 = fptrunc double %34 to float
%36 = getelementptr inbounds float, float* %1, i64 2
store float %35, float* %36
%37 = getelementptr inbounds float, float* %0, i64 4
%38 = load float, float* %37
%39 = getelementptr inbounds float, float* %0, i64 1
%40 = load float, float* %39
%41 = fsub float %38, %40
%42 = fpext float %41 to double
%43 = fdiv double %42, %16
br label %160
44: ; preds = %2
%45 = fcmp ogt float %3, %5
%46 = fcmp ogt float %3, %8
%47 = select i1 %45, i1 %46, i1 false
br i1 %47, label %48, label %85
48: ; preds = %44
%49 = fpext float %3 to double
%50 = fadd double %49, 1.000000e+00
%51 = fpext float %5 to double
%52 = fsub double %50, %51
%53 = fpext float %8 to double
%54 = fsub double %52, %53
%55 = tail call i32 @sqrt(double %54)
%56 = shl nsw i32 %55, 1
%57 = sitofp i32 %56 to double
%58 = getelementptr inbounds float, float* %0, i64 9
%59 = load float, float* %58
%60 = getelementptr inbounds float, float* %0, i64 6
%61 = load float, float* %60
%62 = fsub float %59, %61
%63 = fpext float %62 to double
%64 = fdiv double %63, %57
%65 = fptrunc double %64 to float
store float %65, float* %1
%66 = fmul double %57, 2.500000e-01
%67 = fptrunc double %66 to float
%68 = getelementptr inbounds float, float* %1, i64 1
store float %67, float* %68
%69 = getelementptr inbounds float, float* %0, i64 4
%70 = load float, float* %69
%71 = getelementptr inbounds float, float* %0, i64 1
%72 = load float, float* %71
%73 = fadd float %70, %72
%74 = fpext float %73 to double
%75 = fdiv double %74, %57
%76 = fptrunc double %75 to float
%77 = getelementptr inbounds float, float* %1, i64 2
store float %76, float* %77
%78 = getelementptr inbounds float, float* %0, i64 2
%79 = load float, float* %78
%80 = getelementptr inbounds float, float* %0, i64 8
%81 = load float, float* %80
%82 = fadd float %79, %81
%83 = fpext float %82 to double
%84 = fdiv double %83, %57
br label %160
85: ; preds = %44
%86 = fcmp ogt float %5, %8
br i1 %86, label %87, label %124
87: ; preds = %85
%88 = fpext float %5 to double
%89 = fadd double %88, 1.000000e+00
%90 = fpext float %3 to double
%91 = fsub double %89, %90
%92 = fpext float %8 to double
%93 = fsub double %91, %92
%94 = tail call i32 @sqrt(double %93)
%95 = shl nsw i32 %94, 1
%96 = sitofp i32 %95 to double
%97 = getelementptr inbounds float, float* %0, i64 2
%98 = load float, float* %97
%99 = getelementptr inbounds float, float* %0, i64 8
%100 = load float, float* %99
%101 = fsub float %98, %100
%102 = fpext float %101 to double
%103 = fdiv double %102, %96
%104 = fptrunc double %103 to float
store float %104, float* %1
%105 = getelementptr inbounds float, float* %0, i64 4
%106 = load float, float* %105
%107 = getelementptr inbounds float, float* %0, i64 1
%108 = load float, float* %107
%109 = fadd float %106, %108
%110 = fpext float %109 to double
%111 = fdiv double %110, %96
%112 = fptrunc double %111 to float
%113 = getelementptr inbounds float, float* %1, i64 1
store float %112, float* %113
%114 = fmul double %96, 2.500000e-01
%115 = fptrunc double %114 to float
%116 = getelementptr inbounds float, float* %1, i64 2
store float %115, float* %116
%117 = getelementptr inbounds float, float* %0, i64 9
%118 = load float, float* %117
%119 = getelementptr inbounds float, float* %0, i64 6
%120 = load float, float* %119
%121 = fadd float %118, %120
%122 = fpext float %121 to double
%123 = fdiv double %122, %96
br label %160
124: ; preds = %85
%125 = fpext float %8 to double
%126 = fadd double %125, 1.000000e+00
%127 = fpext float %3 to double
%128 = fsub double %126, %127
%129 = fpext float %5 to double
%130 = fsub double %128, %129
%131 = tail call i32 @sqrt(double %130)
%132 = sitofp i32 %131 to double
%133 = getelementptr inbounds float, float* %0, i64 4
%134 = load float, float* %133
%135 = getelementptr inbounds float, float* %0, i64 1
%136 = load float, float* %135
%137 = fsub float %134, %136
%138 = fpext float %137 to double
%139 = fdiv double %138, %132
%140 = fptrunc double %139 to float
store float %140, float* %1
%141 = getelementptr inbounds float, float* %0, i64 2
%142 = load float, float* %141
%143 = getelementptr inbounds float, float* %0, i64 8
%144 = load float, float* %143
%145 = fadd float %142, %144
%146 = fpext float %145 to double
%147 = fdiv double %146, %132
%148 = fptrunc double %147 to float
%149 = getelementptr inbounds float, float* %1, i64 1
store float %148, float* %149
%150 = getelementptr inbounds float, float* %0, i64 9
%151 = load float, float* %150
%152 = getelementptr inbounds float, float* %0, i64 6
%153 = load float, float* %152
%154 = fadd float %151, %153
%155 = fpext float %154 to double
%156 = fdiv double %155, %132
%157 = fptrunc double %156 to float
%158 = getelementptr inbounds float, float* %1, i64 2
store float %157, float* %158
%159 = fmul double %132, 2.500000e-01
br label %160
160: ; preds = %48, %124, %87, %13
%161 = phi double [ %84, %48 ], [ %159, %124 ], [ %123, %87 ], [ %43, %13 ]
%162 = fptrunc double %161 to float
%163 = getelementptr inbounds float, float* %1, i64 3
store float %162, float* %163
%164 = tail call i32 @floats_normalize(float* %1, i32 4, float* %1)
ret void
}