float IIRFilter(const float in, const float coeff[], float states[]) {
  float accu1, accu2;
  float out;
  ;
  ;
  accu1 = coeff[1] * in;
  accu2 = coeff[1] * states[0];
  ;
  accu1 = accu1 - accu2;
  ;
  accu2 = coeff[0] * states[1];
  ;
  accu1 = accu1 - accu2;
  ;
  out = accu1;
  states[0] = in;
  states[1] = out;
  ;
  return out;
}


x86 assembly (clang, -O0):
<IIRFilter>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x4(%rbp)
mov    %rdi,-0x10(%rbp)
mov    %rsi,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
mulss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movss  0x4(%rax),%xmm0
mov    -0x18(%rbp),%rax
mulss  (%rax),%xmm0
movss  %xmm0,-0x20(%rbp)
movss  -0x1c(%rbp),%xmm0
subss  -0x20(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x18(%rbp),%rax
mulss  0x4(%rax),%xmm0
movss  %xmm0,-0x20(%rbp)
movss  -0x1c(%rbp),%xmm0
subss  -0x20(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x1c(%rbp),%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x4(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x24(%rbp),%xmm0
mov    -0x18(%rbp),%rax
movss  %xmm0,0x4(%rax)
movss  -0x24(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<IIRFilter>:
movsd  (%rdi),%xmm1
movaps %xmm1,%xmm2
shufps $0xe1,%xmm1,%xmm2
shufps $0x55,%xmm1,%xmm1
mulss  %xmm0,%xmm1
movsd  (%rsi),%xmm3
mulps  %xmm2,%xmm3
subss  %xmm3,%xmm1
shufps $0x55,%xmm3,%xmm3
subss  %xmm3,%xmm1
movss  %xmm0,(%rsi)
movss  %xmm1,0x4(%rsi)
movaps %xmm1,%xmm0
ret

LLVM IR (-O0):
define float @IIRFilter(float %0, float* %1, float* %2) {
%4 = alloca float
%5 = alloca float*
%6 = alloca float*
%7 = alloca float
%8 = alloca float
%9 = alloca float
store float %0, float* %4
store float* %1, float** %5
store float* %2, float** %6
%10 = load float*, float** %5
%11 = getelementptr inbounds float, float* %10, i64 1
%12 = load float, float* %11
%13 = load float, float* %4
%14 = fmul float %12, %13
store float %14, float* %7
%15 = load float*, float** %5
%16 = getelementptr inbounds float, float* %15, i64 1
%17 = load float, float* %16
%18 = load float*, float** %6
%19 = getelementptr inbounds float, float* %18, i64 0
%20 = load float, float* %19
%21 = fmul float %17, %20
store float %21, float* %8
%22 = load float, float* %7
%23 = load float, float* %8
%24 = fsub float %22, %23
store float %24, float* %7
%25 = load float*, float** %5
%26 = getelementptr inbounds float, float* %25, i64 0
%27 = load float, float* %26
%28 = load float*, float** %6
%29 = getelementptr inbounds float, float* %28, i64 1
%30 = load float, float* %29
%31 = fmul float %27, %30
store float %31, float* %8
%32 = load float, float* %7
%33 = load float, float* %8
%34 = fsub float %32, %33
store float %34, float* %7
%35 = load float, float* %7
store float %35, float* %9
%36 = load float, float* %4
%37 = load float*, float** %6
%38 = getelementptr inbounds float, float* %37, i64 0
store float %36, float* %38
%39 = load float, float* %9
%40 = load float*, float** %6
%41 = getelementptr inbounds float, float* %40, i64 1
store float %39, float* %41
%42 = load float, float* %9
ret float %42
}

LLVM IR (-O2):
define float @IIRFilter(float %0, float* nocapture %1, float* nocapture %2) {
%4 = bitcast float* %1 to <2 x float>*
%5 = load <2 x float>, <2 x float>* %4
%6 = shufflevector <2 x float> %5, <2 x float> poison, <2 x i32> <i32 1, i32 0>
%7 = extractelement <2 x float> %5, i64 1
%8 = fmul float %7, %0
%9 = getelementptr inbounds float, float* %2, i64 1
%10 = bitcast float* %2 to <2 x float>*
%11 = load <2 x float>, <2 x float>* %10
%12 = fmul <2 x float> %6, %11
%13 = extractelement <2 x float> %12, i64 0
%14 = fsub float %8, %13
%15 = extractelement <2 x float> %12, i64 1
%16 = fsub float %14, %15
store float %0, float* %2
store float %16, float* %9
ret float %16
}