void q_slerp(float q[4], const float a[4], const float b[4], float t) {
  float c, r, s, u, v;
  int i = +1;
  if (t <= 0.0f) {
    do {
      (q)[0] = (a)[0];
      (q)[1] = (a)[1];
      (q)[2] = (a)[2];
      (q)[3] = (a)[3];
    } while (0);
    return;
  }
  if (1.0f <= t) {
    do {
      (q)[0] = (b)[0];
      (q)[1] = (b)[1];
      (q)[2] = (b)[2];
      (q)[3] = (b)[3];
    } while (0);
    return;
  }
  c = ((a)[0] * (b)[0] +
       (((a) + 1)[0] * ((b) + 1)[0] + ((a) + 1)[1] * ((b) + 1)[1] +
        ((a) + 1)[2] * ((b) + 1)[2]));
  if (c < 0) {
    c = -c;
    i = -1;
  }
  if (1.0f - c < 1e-5) {
    u = 1.0f - t;
    v = t;
  } else {
    r = ((float)acos((double)c));
    s = ((float)sin((double)r));
    u = ((float)sin((double)(1.0f - t) * r)) / s;
    v = ((float)sin((double)(t)*r)) / s * i;
  }
  q[0] = a[0] * u + b[0] * v;
  q[1] = a[1] * u + b[1] * v;
  q[2] = a[2] * u + b[2] * v;
  q[3] = a[3] * u + b[3] * v;
  q_nrm(q, q);
}


x86 assembly (clang, -O0):
<q_slerp>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movss  %xmm0,-0x1c(%rbp)
movl   $0x1,-0x34(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x1c(%rbp),%xmm0
jb     11ad <q_slerp+0x7d>
jmp    1162 <q_slerp+0x32>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x4(%rax)
mov    -0x10(%rbp),%rax
movss  0x8(%rax),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
movss  0xc(%rax),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0xc(%rax)
jmp    1436 <q_slerp+0x306>
movss  -0x1c(%rbp),%xmm0
movss  0xe46(%rip),%xmm1
ucomiss %xmm1,%xmm0
jb     1213 <q_slerp+0xe3>
jmp    11c8 <q_slerp+0x98>
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x18(%rbp),%rax
movss  0x4(%rax),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x4(%rax)
mov    -0x18(%rbp),%rax
movss  0x8(%rax),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x8(%rax)
mov    -0x18(%rbp),%rax
movss  0xc(%rax),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0xc(%rax)
jmp    1436 <q_slerp+0x306>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm2
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm3
mov    -0x18(%rbp),%rax
movss  0x4(%rax),%xmm4
mov    -0x10(%rbp),%rax
movss  0x8(%rax),%xmm1
mov    -0x18(%rbp),%rax
mulss  0x8(%rax),%xmm1
mulss  %xmm4,%xmm3
addss  %xmm1,%xmm3
mov    -0x10(%rbp),%rax
movss  0xc(%rax),%xmm1
mov    -0x18(%rbp),%rax
movss  0xc(%rax),%xmm4
mulss  %xmm4,%xmm1
addss  %xmm3,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x20(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x20(%rbp),%xmm0
jbe    12a1 <q_slerp+0x171>
movss  -0x20(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x20(%rbp)
movl   $0xffffffff,-0x34(%rbp)
movss  0xd57(%rip),%xmm0
subss  -0x20(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xd4e(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    12e5 <q_slerp+0x1b5>
movss  0xd34(%rip),%xmm0
subss  -0x1c(%rbp),%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  -0x1c(%rbp),%xmm0
movss  %xmm0,-0x30(%rbp)
jmp    1376 <q_slerp+0x246>
movss  -0x20(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
call   1030 <acos@plt>
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x24(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
call   1050 <sin@plt>
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x28(%rbp)
movss  0xce5(%rip),%xmm0
subss  -0x1c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x24(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm0
call   1050 <sin@plt>
cvtsd2ss %xmm0,%xmm0
divss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  -0x1c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x24(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm0
call   1050 <sin@plt>
cvtsd2ss %xmm0,%xmm0
divss  -0x28(%rbp),%xmm0
cvtsi2ssl -0x34(%rbp),%xmm1
mulss  %xmm1,%xmm0
movss  %xmm0,-0x30(%rbp)
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
movss  -0x2c(%rbp),%xmm2
mov    -0x18(%rbp),%rax
movss  (%rax),%xmm1
mulss  -0x30(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  -0x2c(%rbp),%xmm2
mov    -0x18(%rbp),%rax
movss  0x4(%rax),%xmm1
mulss  -0x30(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x4(%rax)
mov    -0x10(%rbp),%rax
movss  0x8(%rax),%xmm0
movss  -0x2c(%rbp),%xmm2
mov    -0x18(%rbp),%rax
movss  0x8(%rax),%xmm1
mulss  -0x30(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0x8(%rax)
mov    -0x10(%rbp),%rax
movss  0xc(%rax),%xmm0
movss  -0x2c(%rbp),%xmm2
mov    -0x18(%rbp),%rax
movss  0xc(%rax),%xmm1
mulss  -0x30(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,0xc(%rax)
mov    -0x8(%rbp),%rdi
mov    -0x8(%rbp),%rsi
mov    $0x0,%al
call   1040 <q_nrm@plt>
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<q_slerp>:
push   %r15
push   %r14
push   %rbx
sub    $0x30,%rsp
movaps %xmm0,%xmm5
mov    %rsi,%r14
mov    %rdi,%rbx
xorps  %xmm0,%xmm0
ucomiss %xmm5,%xmm0
jae    11ea <q_slerp+0xba>
mov    %rdx,%r15
ucomiss 0xea8(%rip),%xmm5
jae    1211 <q_slerp+0xe1>
movss  (%r14),%xmm0
movss  0x4(%r14),%xmm2
movss  (%r15),%xmm1
movss  0x8(%r14),%xmm3
mulss  0x8(%r15),%xmm3
mulss  0x4(%r15),%xmm2
addss  %xmm3,%xmm2
movss  0xc(%r14),%xmm3
mulss  0xc(%r15),%xmm3
addss  %xmm2,%xmm3
movaps %xmm0,%xmm4
mulss  %xmm1,%xmm4
addss  %xmm3,%xmm4
movaps 0xe6a(%rip),%xmm3
xorps  %xmm4,%xmm3
xorps  %xmm2,%xmm2
movaps %xmm4,%xmm7
cmpltss %xmm2,%xmm7
andps  %xmm7,%xmm3
movaps %xmm7,%xmm2
andnps %xmm4,%xmm2
orps   %xmm3,%xmm2
movss  0xe38(%rip),%xmm6
movaps %xmm6,%xmm3
subss  %xmm2,%xmm3
cvtss2sd %xmm3,%xmm3
movsd  0xe45(%rip),%xmm4
ucomisd %xmm3,%xmm4
jbe    1245 <q_slerp+0x115>
subss  %xmm5,%xmm6
jmp    12eb <q_slerp+0x1bb>
movss  (%r14),%xmm0
movss  %xmm0,(%rbx)
movss  0x4(%r14),%xmm0
movss  %xmm0,0x4(%rbx)
movss  0x8(%r14),%xmm0
movss  %xmm0,0x8(%rbx)
movss  0xc(%r14),%xmm0
jmp    1236 <q_slerp+0x106>
movss  (%r15),%xmm0
movss  %xmm0,(%rbx)
movss  0x4(%r15),%xmm0
movss  %xmm0,0x4(%rbx)
movss  0x8(%r15),%xmm0
movss  %xmm0,0x8(%rbx)
movss  0xc(%r15),%xmm0
movss  %xmm0,0xc(%rbx)
add    $0x30,%rsp
pop    %rbx
pop    %r14
pop    %r15
ret
xorps  %xmm0,%xmm0
cvtss2sd %xmm2,%xmm0
movaps %xmm5,0x10(%rsp)
movaps %xmm7,0x20(%rsp)
call   1030 <acos@plt>
cvtsd2ss %xmm0,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,0x8(%rsp)
call   1050 <sin@plt>
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%rsp)
movss  0xd81(%rip),%xmm0
subss  0x10(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
mulsd  0x8(%rsp),%xmm0
call   1050 <sin@plt>
cvtsd2ss %xmm0,%xmm0
divss  (%rsp),%xmm0
movss  %xmm0,0x4(%rsp)
movaps 0x10(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
mulsd  0x8(%rsp),%xmm0
call   1050 <sin@plt>
movss  0x4(%rsp),%xmm6
xorps  %xmm5,%xmm5
cvtsd2ss %xmm0,%xmm5
divss  (%rsp),%xmm5
movaps 0x20(%rsp),%xmm1
movaps %xmm1,%xmm0
andnps %xmm5,%xmm0
xorps  0xd35(%rip),%xmm5
andps  %xmm1,%xmm5
orps   %xmm0,%xmm5
movss  (%r14),%xmm0
movss  (%r15),%xmm1
mulss  %xmm5,%xmm1
mulss  %xmm6,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,(%rbx)
movss  0x4(%r15),%xmm0
mulss  %xmm5,%xmm0
movss  0x4(%r14),%xmm1
mulss  %xmm6,%xmm1
addss  %xmm0,%xmm1
movss  %xmm1,0x4(%rbx)
movss  0x8(%r15),%xmm0
mulss  %xmm5,%xmm0
movss  0x8(%r14),%xmm1
mulss  %xmm6,%xmm1
addss  %xmm0,%xmm1
movss  %xmm1,0x8(%rbx)
mulss  0xc(%r15),%xmm5
mulss  0xc(%r14),%xmm6
addss  %xmm5,%xmm6
movss  %xmm6,0xc(%rbx)
mov    %rbx,%rdi
mov    %rbx,%rsi
xor    %eax,%eax
add    $0x30,%rsp
pop    %rbx
pop    %r14
pop    %r15
jmp    1040 <q_nrm@plt>

LLVM IR (-O0):
define void @q_slerp(float* %0, float* %1, float* %2, float %3) {
%5 = alloca float*
%6 = alloca float*
%7 = alloca float*
%8 = alloca float
%9 = alloca float
%10 = alloca float
%11 = alloca float
%12 = alloca float
%13 = alloca float
%14 = alloca i32
store float* %0, float** %5
store float* %1, float** %6
store float* %2, float** %7
store float %3, float* %8
store i32 1, i32* %14
%15 = load float, float* %8
%16 = fcmp ole float %15, 0.000000e+00
br i1 %16, label %17, label %40
17: ; preds = %4
br label %18
18: ; preds = %17
%19 = load float*, float** %6
%20 = getelementptr inbounds float, float* %19, i64 0
%21 = load float, float* %20
%22 = load float*, float** %5
%23 = getelementptr inbounds float, float* %22, i64 0
store float %21, float* %23
%24 = load float*, float** %6
%25 = getelementptr inbounds float, float* %24, i64 1
%26 = load float, float* %25
%27 = load float*, float** %5
%28 = getelementptr inbounds float, float* %27, i64 1
store float %26, float* %28
%29 = load float*, float** %6
%30 = getelementptr inbounds float, float* %29, i64 2
%31 = load float, float* %30
%32 = load float*, float** %5
%33 = getelementptr inbounds float, float* %32, i64 2
store float %31, float* %33
%34 = load float*, float** %6
%35 = getelementptr inbounds float, float* %34, i64 3
%36 = load float, float* %35
%37 = load float*, float** %5
%38 = getelementptr inbounds float, float* %37, i64 3
store float %36, float* %38
br label %39
39: ; preds = %18
br label %198
40: ; preds = %4
%41 = load float, float* %8
%42 = fcmp ole float 1.000000e+00, %41
br i1 %42, label %43, label %66
43: ; preds = %40
br label %44
44: ; preds = %43
%45 = load float*, float** %7
%46 = getelementptr inbounds float, float* %45, i64 0
%47 = load float, float* %46
%48 = load float*, float** %5
%49 = getelementptr inbounds float, float* %48, i64 0
store float %47, float* %49
%50 = load float*, float** %7
%51 = getelementptr inbounds float, float* %50, i64 1
%52 = load float, float* %51
%53 = load float*, float** %5
%54 = getelementptr inbounds float, float* %53, i64 1
store float %52, float* %54
%55 = load float*, float** %7
%56 = getelementptr inbounds float, float* %55, i64 2
%57 = load float, float* %56
%58 = load float*, float** %5
%59 = getelementptr inbounds float, float* %58, i64 2
store float %57, float* %59
%60 = load float*, float** %7
%61 = getelementptr inbounds float, float* %60, i64 3
%62 = load float, float* %61
%63 = load float*, float** %5
%64 = getelementptr inbounds float, float* %63, i64 3
store float %62, float* %64
br label %65
65: ; preds = %44
br label %198
66: ; preds = %40
%67 = load float*, float** %6
%68 = getelementptr inbounds float, float* %67, i64 0
%69 = load float, float* %68
%70 = load float*, float** %7
%71 = getelementptr inbounds float, float* %70, i64 0
%72 = load float, float* %71
%73 = load float*, float** %6
%74 = getelementptr inbounds float, float* %73, i64 1
%75 = getelementptr inbounds float, float* %74, i64 0
%76 = load float, float* %75
%77 = load float*, float** %7
%78 = getelementptr inbounds float, float* %77, i64 1
%79 = getelementptr inbounds float, float* %78, i64 0
%80 = load float, float* %79
%81 = load float*, float** %6
%82 = getelementptr inbounds float, float* %81, i64 1
%83 = getelementptr inbounds float, float* %82, i64 1
%84 = load float, float* %83
%85 = load float*, float** %7
%86 = getelementptr inbounds float, float* %85, i64 1
%87 = getelementptr inbounds float, float* %86, i64 1
%88 = load float, float* %87
%89 = fmul float %84, %88
%90 = call float @llvm.fmuladd.f32(float %76, float %80, float %89)
%91 = load float*, float** %6
%92 = getelementptr inbounds float, float* %91, i64 1
%93 = getelementptr inbounds float, float* %92, i64 2
%94 = load float, float* %93
%95 = load float*, float** %7
%96 = getelementptr inbounds float, float* %95, i64 1
%97 = getelementptr inbounds float, float* %96, i64 2
%98 = load float, float* %97
%99 = call float @llvm.fmuladd.f32(float %94, float %98, float %90)
%100 = call float @llvm.fmuladd.f32(float %69, float %72, float %99)
store float %100, float* %9
%101 = load float, float* %9
%102 = fcmp olt float %101, 0.000000e+00
br i1 %102, label %103, label %106
103: ; preds = %66
%104 = load float, float* %9
%105 = fneg float %104
store float %105, float* %9
store i32 -1, i32* %14
br label %106
106: ; preds = %103, %66
%107 = load float, float* %9
%108 = fsub float 1.000000e+00, %107
%109 = fpext float %108 to double
%110 = fcmp olt double %109, 1.000000e-05
br i1 %110, label %111, label %115
111: ; preds = %106
%112 = load float, float* %8
%113 = fsub float 1.000000e+00, %112
store float %113, float* %12
%114 = load float, float* %8
store float %114, float* %13
br label %146
115: ; preds = %106
%116 = load float, float* %9
%117 = fpext float %116 to double
%118 = call double @acos(double %117)
%119 = fptrunc double %118 to float
store float %119, float* %10
%120 = load float, float* %10
%121 = fpext float %120 to double
%122 = call double @sin(double %121)
%123 = fptrunc double %122 to float
store float %123, float* %11
%124 = load float, float* %8
%125 = fsub float 1.000000e+00, %124
%126 = fpext float %125 to double
%127 = load float, float* %10
%128 = fpext float %127 to double
%129 = fmul double %126, %128
%130 = call double @sin(double %129)
%131 = fptrunc double %130 to float
%132 = load float, float* %11
%133 = fdiv float %131, %132
store float %133, float* %12
%134 = load float, float* %8
%135 = fpext float %134 to double
%136 = load float, float* %10
%137 = fpext float %136 to double
%138 = fmul double %135, %137
%139 = call double @sin(double %138)
%140 = fptrunc double %139 to float
%141 = load float, float* %11
%142 = fdiv float %140, %141
%143 = load i32, i32* %14
%144 = sitofp i32 %143 to float
%145 = fmul float %142, %144
store float %145, float* %13
br label %146
146: ; preds = %115, %111
%147 = load float*, float** %6
%148 = getelementptr inbounds float, float* %147, i64 0
%149 = load float, float* %148
%150 = load float, float* %12
%151 = load float*, float** %7
%152 = getelementptr inbounds float, float* %151, i64 0
%153 = load float, float* %152
%154 = load float, float* %13
%155 = fmul float %153, %154
%156 = call float @llvm.fmuladd.f32(float %149, float %150, float %155)
%157 = load float*, float** %5
%158 = getelementptr inbounds float, float* %157, i64 0
store float %156, float* %158
%159 = load float*, float** %6
%160 = getelementptr inbounds float, float* %159, i64 1
%161 = load float, float* %160
%162 = load float, float* %12
%163 = load float*, float** %7
%164 = getelementptr inbounds float, float* %163, i64 1
%165 = load float, float* %164
%166 = load float, float* %13
%167 = fmul float %165, %166
%168 = call float @llvm.fmuladd.f32(float %161, float %162, float %167)
%169 = load float*, float** %5
%170 = getelementptr inbounds float, float* %169, i64 1
store float %168, float* %170
%171 = load float*, float** %6
%172 = getelementptr inbounds float, float* %171, i64 2
%173 = load float, float* %172
%174 = load float, float* %12
%175 = load float*, float** %7
%176 = getelementptr inbounds float, float* %175, i64 2
%177 = load float, float* %176
%178 = load float, float* %13
%179 = fmul float %177, %178
%180 = call float @llvm.fmuladd.f32(float %173, float %174, float %179)
%181 = load float*, float** %5
%182 = getelementptr inbounds float, float* %181, i64 2
store float %180, float* %182
%183 = load float*, float** %6
%184 = getelementptr inbounds float, float* %183, i64 3
%185 = load float, float* %184
%186 = load float, float* %12
%187 = load float*, float** %7
%188 = getelementptr inbounds float, float* %187, i64 3
%189 = load float, float* %188
%190 = load float, float* %13
%191 = fmul float %189, %190
%192 = call float @llvm.fmuladd.f32(float %185, float %186, float %191)
%193 = load float*, float** %5
%194 = getelementptr inbounds float, float* %193, i64 3
store float %192, float* %194
%195 = load float*, float** %5
%196 = load float*, float** %5
%197 = call i32 (float*, float*, ...) bitcast (i32 (...)* @q_nrm to i32 (float*, float*, ...)*)(float* %195, float* %196)
br label %198
198: ; preds = %146, %65, %39
ret void
}

LLVM IR (-O2):
define void @q_slerp(float* %0, float* nocapture %1, float* nocapture %2, float %3) {
%5 = fcmp ugt float %3, 0.000000e+00
br i1 %5, label %17, label %6
6: ; preds = %4
%7 = load float, float* %1
store float %7, float* %0
%8 = getelementptr inbounds float, float* %1, i64 1
%9 = load float, float* %8
%10 = getelementptr inbounds float, float* %0, i64 1
store float %9, float* %10
%11 = getelementptr inbounds float, float* %1, i64 2
%12 = load float, float* %11
%13 = getelementptr inbounds float, float* %0, i64 2
store float %12, float* %13
%14 = getelementptr inbounds float, float* %1, i64 3
%15 = load float, float* %14
%16 = getelementptr inbounds float, float* %0, i64 3
store float %15, float* %16
br label %102
17: ; preds = %4
%18 = fcmp ult float %3, 1.000000e+00
br i1 %18, label %30, label %19
19: ; preds = %17
%20 = load float, float* %2
store float %20, float* %0
%21 = getelementptr inbounds float, float* %2, i64 1
%22 = load float, float* %21
%23 = getelementptr inbounds float, float* %0, i64 1
store float %22, float* %23
%24 = getelementptr inbounds float, float* %2, i64 2
%25 = load float, float* %24
%26 = getelementptr inbounds float, float* %0, i64 2
store float %25, float* %26
%27 = getelementptr inbounds float, float* %2, i64 3
%28 = load float, float* %27
%29 = getelementptr inbounds float, float* %0, i64 3
store float %28, float* %29
br label %102
30: ; preds = %17
%31 = load float, float* %1
%32 = load float, float* %2
%33 = getelementptr inbounds float, float* %1, i64 1
%34 = load float, float* %33
%35 = getelementptr inbounds float, float* %2, i64 1
%36 = load float, float* %35
%37 = getelementptr inbounds float, float* %1, i64 2
%38 = load float, float* %37
%39 = getelementptr inbounds float, float* %2, i64 2
%40 = load float, float* %39
%41 = fmul float %38, %40
%42 = tail call float @llvm.fmuladd.f32(float %34, float %36, float %41)
%43 = getelementptr inbounds float, float* %1, i64 3
%44 = load float, float* %43
%45 = getelementptr inbounds float, float* %2, i64 3
%46 = load float, float* %45
%47 = tail call float @llvm.fmuladd.f32(float %44, float %46, float %42)
%48 = tail call float @llvm.fmuladd.f32(float %31, float %32, float %47)
%49 = fcmp olt float %48, 0.000000e+00
%50 = fneg float %48
%51 = select i1 %49, float %50, float %48
%52 = fsub float 1.000000e+00, %51
%53 = fpext float %52 to double
%54 = fcmp olt double %53, 1.000000e-05
br i1 %54, label %55, label %57
55: ; preds = %30
%56 = fsub float 1.000000e+00, %3
br label %79
57: ; preds = %30
%58 = fpext float %51 to double
%59 = tail call double @acos(double %58)
%60 = fptrunc double %59 to float
%61 = fpext float %60 to double
%62 = tail call double @sin(double %61)
%63 = fptrunc double %62 to float
%64 = fsub float 1.000000e+00, %3
%65 = fpext float %64 to double
%66 = fmul double %65, %61
%67 = tail call double @sin(double %66)
%68 = fptrunc double %67 to float
%69 = fdiv float %68, %63
%70 = fpext float %3 to double
%71 = fmul double %70, %61
%72 = tail call double @sin(double %71)
%73 = fptrunc double %72 to float
%74 = fdiv float %73, %63
%75 = fneg float %74
%76 = select i1 %49, float %75, float %74
%77 = load float, float* %1
%78 = load float, float* %2
br label %79
79: ; preds = %57, %55
%80 = phi float [ %32, %55 ], [ %78, %57 ]
%81 = phi float [ %31, %55 ], [ %77, %57 ]
%82 = phi float [ %56, %55 ], [ %69, %57 ]
%83 = phi float [ %3, %55 ], [ %76, %57 ]
%84 = fmul float %83, %80
%85 = tail call float @llvm.fmuladd.f32(float %81, float %82, float %84)
store float %85, float* %0
%86 = load float, float* %33
%87 = load float, float* %35
%88 = fmul float %83, %87
%89 = tail call float @llvm.fmuladd.f32(float %86, float %82, float %88)
%90 = getelementptr inbounds float, float* %0, i64 1
store float %89, float* %90
%91 = load float, float* %37
%92 = load float, float* %39
%93 = fmul float %83, %92
%94 = tail call float @llvm.fmuladd.f32(float %91, float %82, float %93)
%95 = getelementptr inbounds float, float* %0, i64 2
store float %94, float* %95
%96 = load float, float* %43
%97 = load float, float* %45
%98 = fmul float %83, %97
%99 = tail call float @llvm.fmuladd.f32(float %96, float %82, float %98)
%100 = getelementptr inbounds float, float* %0, i64 3
store float %99, float* %100
%101 = tail call i32 (float*, float*, ...) bitcast (i32 (...)* @q_nrm to i32 (float*, float*, ...)*)(float* %0, float* %0)
br label %102
102: ; preds = %79, %19, %6
ret void
}