void calc_loop_gains(float bw, float zeta, float k, float loop_freq, float *b0,
                     float *b1) {
  float T = 1 / loop_freq;
  float omega_n = 8.f * bw * zeta / (4.f * zeta * zeta + 1.f);
  float tau_1 = k / (omega_n * omega_n);
  float tau_2 = 2 * zeta / omega_n;
  *b0 = (2 * tau_2 + T) / (2 * tau_1);
  *b1 = (T - 2 * tau_2) / (2 * tau_1);
}


x86 assembly (clang, -O0):
<calc_loop_gains>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
movss  %xmm1,-0x8(%rbp)
movss  %xmm2,-0xc(%rbp)
movss  %xmm3,-0x10(%rbp)
mov    %rdi,-0x18(%rbp)
mov    %rsi,-0x20(%rbp)
movss  0xedc(%rip),%xmm0
divss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
movss  0xed2(%rip),%xmm0
mulss  -0x4(%rbp),%xmm0
mulss  -0x8(%rbp),%xmm0
movss  0xebc(%rip),%xmm1
mulss  -0x8(%rbp),%xmm1
movss  -0x8(%rbp),%xmm2
mulss  %xmm2,%xmm1
movss  0xea2(%rip),%xmm2
addss  %xmm2,%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x28(%rbp)
movss  -0xc(%rbp),%xmm0
movss  -0x28(%rbp),%xmm1
mulss  -0x28(%rbp),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x2c(%rbp)
movss  0xe71(%rip),%xmm0
mulss  -0x8(%rbp),%xmm0
divss  -0x28(%rbp),%xmm0
movss  %xmm0,-0x30(%rbp)
movss  -0x30(%rbp),%xmm0
movss  -0x24(%rbp),%xmm1
addss  %xmm0,%xmm0
addss  %xmm1,%xmm0
movss  0xe48(%rip),%xmm1
mulss  -0x2c(%rbp),%xmm1
divss  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x24(%rbp),%xmm0
movss  -0x30(%rbp),%xmm1
addss  %xmm1,%xmm1
subss  %xmm1,%xmm0
movss  0xe1d(%rip),%xmm1
mulss  -0x2c(%rbp),%xmm1
divss  %xmm1,%xmm0
mov    -0x20(%rbp),%rax
movss  %xmm0,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<calc_loop_gains>:
mulss  0xefc(%rip),%xmm0
movss  0xef0(%rip),%xmm4
mulss  %xmm1,%xmm0
movss  0xeec(%rip),%xmm5
mulss  %xmm1,%xmm5
mulss  %xmm1,%xmm5
addss  %xmm4,%xmm5
divss  %xmm3,%xmm4
divss  %xmm5,%xmm0
addss  %xmm1,%xmm1
divss  %xmm0,%xmm1
mulss  %xmm0,%xmm0
divss  %xmm0,%xmm2
addss  %xmm1,%xmm1
movaps %xmm1,%xmm0
addss  %xmm4,%xmm0
addss  %xmm2,%xmm2
divss  %xmm2,%xmm0
movss  %xmm0,(%rdi)
subss  %xmm1,%xmm4
divss  %xmm2,%xmm4
movss  %xmm4,(%rsi)
ret

LLVM IR (-O0):
define void @calc_loop_gains(float %0, float %1, float %2, float %3, float* %4, float* %5) {
%7 = alloca float
%8 = alloca float
%9 = alloca float
%10 = alloca float
%11 = alloca float*
%12 = alloca float*
%13 = alloca float
%14 = alloca float
%15 = alloca float
%16 = alloca float
store float %0, float* %7
store float %1, float* %8
store float %2, float* %9
store float %3, float* %10
store float* %4, float** %11
store float* %5, float** %12
%17 = load float, float* %10
%18 = fdiv float 1.000000e+00, %17
store float %18, float* %13
%19 = load float, float* %7
%20 = fmul float 8.000000e+00, %19
%21 = load float, float* %8
%22 = fmul float %20, %21
%23 = load float, float* %8
%24 = fmul float 4.000000e+00, %23
%25 = load float, float* %8
%26 = call float @llvm.fmuladd.f32(float %24, float %25, float 1.000000e+00)
%27 = fdiv float %22, %26
store float %27, float* %14
%28 = load float, float* %9
%29 = load float, float* %14
%30 = load float, float* %14
%31 = fmul float %29, %30
%32 = fdiv float %28, %31
store float %32, float* %15
%33 = load float, float* %8
%34 = fmul float 2.000000e+00, %33
%35 = load float, float* %14
%36 = fdiv float %34, %35
store float %36, float* %16
%37 = load float, float* %16
%38 = load float, float* %13
%39 = call float @llvm.fmuladd.f32(float 2.000000e+00, float %37, float %38)
%40 = load float, float* %15
%41 = fmul float 2.000000e+00, %40
%42 = fdiv float %39, %41
%43 = load float*, float** %11
store float %42, float* %43
%44 = load float, float* %13
%45 = load float, float* %16
%46 = call float @llvm.fmuladd.f32(float -2.000000e+00, float %45, float %44)
%47 = load float, float* %15
%48 = fmul float 2.000000e+00, %47
%49 = fdiv float %46, %48
%50 = load float*, float** %12
store float %49, float* %50
ret void
}

LLVM IR (-O2):
define void @calc_loop_gains(float %0, float %1, float %2, float %3, float* nocapture writeonly %4, float* nocapture writeonly %5) {
%7 = fdiv float 1.000000e+00, %3
%8 = fmul float %0, 8.000000e+00
%9 = fmul float %8, %1
%10 = fmul float %1, 4.000000e+00
%11 = tail call float @llvm.fmuladd.f32(float %10, float %1, float 1.000000e+00)
%12 = fdiv float %9, %11
%13 = fmul float %12, %12
%14 = fdiv float %2, %13
%15 = fmul float %1, 2.000000e+00
%16 = fdiv float %15, %12
%17 = tail call float @llvm.fmuladd.f32(float %16, float 2.000000e+00, float %7)
%18 = fmul float %14, 2.000000e+00
%19 = fdiv float %17, %18
store float %19, float* %4
%20 = tail call float @llvm.fmuladd.f32(float %16, float -2.000000e+00, float %7)
%21 = fdiv float %20, %18
store float %21, float* %5
ret void
}