void bgsub_mean_var(int size, float *s, float *ss, int c, float *m, float *v) {
  float inv_c_sqr = 6.25 / (c * c);
  float inv_c = 1. / c;
  int i;
  for (i = 0; i < size; ++i) {
    m[i] = s[i] * inv_c;
    v[i] = (ss[i] * c - s[i] * s[i]) * inv_c_sqr;
  }
}


x86 assembly (clang, -O0):
<bgsub_mean_var>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
mov    -0x1c(%rbp),%eax
imul   -0x1c(%rbp),%eax
cvtsi2sd %eax,%xmm1
movsd  0xedb(%rip),%xmm0
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x34(%rbp)
cvtsi2sdl -0x1c(%rbp),%xmm1
movsd  0xeb9(%rip),%xmm0
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x38(%rbp)
movl   $0x0,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x4(%rbp),%eax
jge    11e7 <bgsub_mean_var+0xe7>
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mulss  -0x38(%rbp),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x18(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtsi2ssl -0x1c(%rbp),%xmm2
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x3c(%rbp),%rcx
mulss  (%rax,%rcx,4),%xmm1
movd   %xmm1,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
mulss  -0x34(%rbp),%xmm0
mov    -0x30(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    115b <bgsub_mean_var+0x5b>
pop    %rbp
ret

x86 assembly (clang, -O2):
<bgsub_mean_var>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
test   %edi,%edi
jle    1198 <bgsub_mean_var+0x98>
mov    %ecx,%eax
imul   %ecx,%eax
cvtsi2sd %eax,%xmm0
movsd  0xedd(%rip),%xmm1
divsd  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm0
xorps  %xmm1,%xmm1
cvtsi2sd %ecx,%xmm1
movsd  0xecb(%rip),%xmm2
divsd  %xmm1,%xmm2
xorps  %xmm1,%xmm1
cvtsi2ss %ecx,%xmm1
cvtsd2ss %xmm2,%xmm2
mov    %edi,%r11d
cmp    $0x4,%edi
jae    11a3 <bgsub_mean_var+0xa3>
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
movss  (%rsi,%rcx,4),%xmm3
mulss  %xmm2,%xmm3
movss  %xmm3,(%r8,%rcx,4)
movss  (%rsi,%rcx,4),%xmm3
mulss  %xmm3,%xmm3
movss  (%rdx,%rcx,4),%xmm4
mulss  %xmm1,%xmm4
subss  %xmm3,%xmm4
mulss  %xmm0,%xmm4
movss  %xmm4,(%r9,%rcx,4)
add    $0x1,%rcx
cmp    %rcx,%r11
jne    1160 <bgsub_mean_var+0x60>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
lea    (%r9,%r11,4),%rcx
cmp    %r8,%rcx
seta   -0x1(%rsp)
lea    (%r8,%r11,4),%rbx
cmp    %r9,%rbx
seta   %r12b
lea    (%rsi,%r11,4),%rbp
cmp    %r8,%rbp
seta   %al
cmp    %rsi,%rbx
seta   %r15b
lea    (%rdx,%r11,4),%r14
cmp    %r8,%r14
seta   %dil
cmp    %rdx,%rbx
seta   %r13b
cmp    %r9,%rbp
seta   %r10b
cmp    %rsi,%rcx
seta   %bpl
cmp    %r9,%r14
seta   %bl
cmp    %rdx,%rcx
seta   %r14b
xor    %ecx,%ecx
test   %r12b,-0x1(%rsp)
jne    1160 <bgsub_mean_var+0x60>
and    %r15b,%al
jne    1160 <bgsub_mean_var+0x60>
and    %r13b,%dil
jne    1160 <bgsub_mean_var+0x60>
and    %bpl,%r10b
jne    1160 <bgsub_mean_var+0x60>
and    %r14b,%bl
jne    1160 <bgsub_mean_var+0x60>
mov    %r11d,%ecx
and    $0xfffffffc,%ecx
movaps %xmm2,%xmm5
shufps $0x0,%xmm2,%xmm5
movaps %xmm1,%xmm4
shufps $0x0,%xmm1,%xmm4
movaps %xmm0,%xmm3
shufps $0x0,%xmm0,%xmm3
lea    -0x4(%rcx),%rax
mov    %rax,%r10
shr    $0x2,%r10
add    $0x1,%r10
test   %rax,%rax
je     1302 <bgsub_mean_var+0x202>
mov    %r10,%rax
and    $0xfffffffffffffffe,%rax
xor    %edi,%edi
cs nopw 0x0(%rax,%rax,1)
nop
movups (%rsi,%rdi,4),%xmm6
mulps  %xmm5,%xmm6
movups %xmm6,(%r8,%rdi,4)
movups (%rdx,%rdi,4),%xmm6
movups (%rsi,%rdi,4),%xmm7
mulps  %xmm7,%xmm7
mulps  %xmm4,%xmm6
subps  %xmm7,%xmm6
mulps  %xmm3,%xmm6
movups %xmm6,(%r9,%rdi,4)
movups 0x10(%rsi,%rdi,4),%xmm6
mulps  %xmm5,%xmm6
movups %xmm6,0x10(%r8,%rdi,4)
movups 0x10(%rdx,%rdi,4),%xmm6
movups 0x10(%rsi,%rdi,4),%xmm7
mulps  %xmm7,%xmm7
mulps  %xmm4,%xmm6
subps  %xmm7,%xmm6
mulps  %xmm3,%xmm6
movups %xmm6,0x10(%r9,%rdi,4)
add    $0x8,%rdi
add    $0xfffffffffffffffe,%rax
jne    1270 <bgsub_mean_var+0x170>
test   $0x1,%r10b
je     12f4 <bgsub_mean_var+0x1f4>
movups (%rsi,%rdi,4),%xmm6
mulps  %xmm5,%xmm6
movups %xmm6,(%r8,%rdi,4)
movups (%rdx,%rdi,4),%xmm5
movups (%rsi,%rdi,4),%xmm6
mulps  %xmm6,%xmm6
mulps  %xmm4,%xmm5
subps  %xmm6,%xmm5
mulps  %xmm3,%xmm5
movups %xmm5,(%r9,%rdi,4)
cmp    %r11,%rcx
jne    1160 <bgsub_mean_var+0x60>
jmp    1198 <bgsub_mean_var+0x98>
xor    %edi,%edi
test   $0x1,%r10b
jne    12cf <bgsub_mean_var+0x1cf>
jmp    12f4 <bgsub_mean_var+0x1f4>

LLVM IR (-O0):
define void @bgsub_mean_var(i32 %0, float* %1, float* %2, i32 %3, float* %4, float* %5) {
%7 = alloca i32
%8 = alloca float*
%9 = alloca float*
%10 = alloca i32
%11 = alloca float*
%12 = alloca float*
%13 = alloca float
%14 = alloca float
%15 = alloca i32
store i32 %0, i32* %7
store float* %1, float** %8
store float* %2, float** %9
store i32 %3, i32* %10
store float* %4, float** %11
store float* %5, float** %12
%16 = load i32, i32* %10
%17 = load i32, i32* %10
%18 = mul nsw i32 %16, %17
%19 = sitofp i32 %18 to double
%20 = fdiv double 6.250000e+00, %19
%21 = fptrunc double %20 to float
store float %21, float* %13
%22 = load i32, i32* %10
%23 = sitofp i32 %22 to double
%24 = fdiv double 1.000000e+00, %23
%25 = fptrunc double %24 to float
store float %25, float* %14
store i32 0, i32* %15
br label %26
26: ; preds = %68, %6
%27 = load i32, i32* %15
%28 = load i32, i32* %7
%29 = icmp slt i32 %27, %28
br i1 %29, label %30, label %71
30: ; preds = %26
%31 = load float*, float** %8
%32 = load i32, i32* %15
%33 = sext i32 %32 to i64
%34 = getelementptr inbounds float, float* %31, i64 %33
%35 = load float, float* %34
%36 = load float, float* %14
%37 = fmul float %35, %36
%38 = load float*, float** %11
%39 = load i32, i32* %15
%40 = sext i32 %39 to i64
%41 = getelementptr inbounds float, float* %38, i64 %40
store float %37, float* %41
%42 = load float*, float** %9
%43 = load i32, i32* %15
%44 = sext i32 %43 to i64
%45 = getelementptr inbounds float, float* %42, i64 %44
%46 = load float, float* %45
%47 = load i32, i32* %10
%48 = sitofp i32 %47 to float
%49 = load float*, float** %8
%50 = load i32, i32* %15
%51 = sext i32 %50 to i64
%52 = getelementptr inbounds float, float* %49, i64 %51
%53 = load float, float* %52
%54 = load float*, float** %8
%55 = load i32, i32* %15
%56 = sext i32 %55 to i64
%57 = getelementptr inbounds float, float* %54, i64 %56
%58 = load float, float* %57
%59 = fmul float %53, %58
%60 = fneg float %59
%61 = call float @llvm.fmuladd.f32(float %46, float %48, float %60)
%62 = load float, float* %13
%63 = fmul float %61, %62
%64 = load float*, float** %12
%65 = load i32, i32* %15
%66 = sext i32 %65 to i64
%67 = getelementptr inbounds float, float* %64, i64 %66
store float %63, float* %67
br label %68
68: ; preds = %30
%69 = load i32, i32* %15
%70 = add nsw i32 %69, 1
store i32 %70, i32* %15
br label %26
71: ; preds = %26
ret void
}

LLVM IR (-O2):
define void @bgsub_mean_var(i32 %0, float* nocapture %1, float* nocapture %2, i32 %3, float* nocapture writeonly %4, float* nocapture writeonly %5) {
%7 = mul nsw i32 %3, %3
%8 = sitofp i32 %7 to double
%9 = fdiv double 6.250000e+00, %8
%10 = fptrunc double %9 to float
%11 = sitofp i32 %3 to double
%12 = fdiv double 1.000000e+00, %11
%13 = fptrunc double %12 to float
%14 = icmp sgt i32 %0, 0
br i1 %14, label %15, label %140
15: ; preds = %6
%16 = sitofp i32 %3 to float
%17 = zext i32 %0 to i64
%18 = icmp ult i32 %0, 4
br i1 %18, label %122, label %19
19: ; preds = %15
%20 = getelementptr float, float* %4, i64 %17
%21 = getelementptr float, float* %5, i64 %17
%22 = getelementptr float, float* %1, i64 %17
%23 = getelementptr float, float* %2, i64 %17
%24 = icmp ugt float* %21, %4
%25 = icmp ugt float* %20, %5
%26 = and i1 %24, %25
%27 = icmp ugt float* %22, %4
%28 = icmp ugt float* %20, %1
%29 = and i1 %27, %28
%30 = or i1 %26, %29
%31 = icmp ugt float* %23, %4
%32 = icmp ugt float* %20, %2
%33 = and i1 %31, %32
%34 = or i1 %30, %33
%35 = icmp ugt float* %22, %5
%36 = icmp ugt float* %21, %1
%37 = and i1 %35, %36
%38 = or i1 %34, %37
%39 = icmp ugt float* %23, %5
%40 = icmp ugt float* %21, %2
%41 = and i1 %39, %40
%42 = or i1 %38, %41
br i1 %42, label %122, label %43
43: ; preds = %19
%44 = and i64 %17, 4294967292
%45 = insertelement <4 x float> poison, float %13, i64 0
%46 = shufflevector <4 x float> %45, <4 x float> poison, <4 x i32> zeroinitializer
%47 = insertelement <4 x float> poison, float %16, i64 0
%48 = shufflevector <4 x float> %47, <4 x float> poison, <4 x i32> zeroinitializer
%49 = insertelement <4 x float> poison, float %10, i64 0
%50 = shufflevector <4 x float> %49, <4 x float> poison, <4 x i32> zeroinitializer
%51 = add nsw i64 %44, -4
%52 = lshr exact i64 %51, 2
%53 = add nuw nsw i64 %52, 1
%54 = and i64 %53, 1
%55 = icmp eq i64 %51, 0
br i1 %55, label %99, label %56
56: ; preds = %43
%57 = and i64 %53, 9223372036854775806
br label %58
58: ; preds = %58, %56
%59 = phi i64 [ 0, %56 ], [ %96, %58 ]
%60 = phi i64 [ 0, %56 ], [ %97, %58 ]
%61 = getelementptr inbounds float, float* %1, i64 %59
%62 = bitcast float* %61 to <4 x float>*
%63 = load <4 x float>, <4 x float>* %62
%64 = fmul <4 x float> %63, %46
%65 = getelementptr inbounds float, float* %4, i64 %59
%66 = bitcast float* %65 to <4 x float>*
store <4 x float> %64, <4 x float>* %66
%67 = getelementptr inbounds float, float* %2, i64 %59
%68 = bitcast float* %67 to <4 x float>*
%69 = load <4 x float>, <4 x float>* %68
%70 = bitcast float* %61 to <4 x float>*
%71 = load <4 x float>, <4 x float>* %70
%72 = fneg <4 x float> %71
%73 = fmul <4 x float> %71, %72
%74 = call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %69, <4 x float> %48, <4 x float> %73)
%75 = fmul <4 x float> %74, %50
%76 = getelementptr inbounds float, float* %5, i64 %59
%77 = bitcast float* %76 to <4 x float>*
store <4 x float> %75, <4 x float>* %77
%78 = or i64 %59, 4
%79 = getelementptr inbounds float, float* %1, i64 %78
%80 = bitcast float* %79 to <4 x float>*
%81 = load <4 x float>, <4 x float>* %80
%82 = fmul <4 x float> %81, %46
%83 = getelementptr inbounds float, float* %4, i64 %78
%84 = bitcast float* %83 to <4 x float>*
store <4 x float> %82, <4 x float>* %84
%85 = getelementptr inbounds float, float* %2, i64 %78
%86 = bitcast float* %85 to <4 x float>*
%87 = load <4 x float>, <4 x float>* %86
%88 = bitcast float* %79 to <4 x float>*
%89 = load <4 x float>, <4 x float>* %88
%90 = fneg <4 x float> %89
%91 = fmul <4 x float> %89, %90
%92 = call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %87, <4 x float> %48, <4 x float> %91)
%93 = fmul <4 x float> %92, %50
%94 = getelementptr inbounds float, float* %5, i64 %78
%95 = bitcast float* %94 to <4 x float>*
store <4 x float> %93, <4 x float>* %95
%96 = add nuw i64 %59, 8
%97 = add i64 %60, 2
%98 = icmp eq i64 %97, %57
br i1 %98, label %99, label %58
99: ; preds = %58, %43
%100 = phi i64 [ 0, %43 ], [ %96, %58 ]
%101 = icmp eq i64 %54, 0
br i1 %101, label %120, label %102
102: ; preds = %99
%103 = getelementptr inbounds float, float* %1, i64 %100
%104 = bitcast float* %103 to <4 x float>*
%105 = load <4 x float>, <4 x float>* %104
%106 = fmul <4 x float> %105, %46
%107 = getelementptr inbounds float, float* %4, i64 %100
%108 = bitcast float* %107 to <4 x float>*
store <4 x float> %106, <4 x float>* %108
%109 = getelementptr inbounds float, float* %2, i64 %100
%110 = bitcast float* %109 to <4 x float>*
%111 = load <4 x float>, <4 x float>* %110
%112 = bitcast float* %103 to <4 x float>*
%113 = load <4 x float>, <4 x float>* %112
%114 = fneg <4 x float> %113
%115 = fmul <4 x float> %113, %114
%116 = call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %111, <4 x float> %48, <4 x float> %115)
%117 = fmul <4 x float> %116, %50
%118 = getelementptr inbounds float, float* %5, i64 %100
%119 = bitcast float* %118 to <4 x float>*
store <4 x float> %117, <4 x float>* %119
br label %120
120: ; preds = %99, %102
%121 = icmp eq i64 %44, %17
br i1 %121, label %140, label %122
122: ; preds = %19, %15, %120
%123 = phi i64 [ 0, %19 ], [ 0, %15 ], [ %44, %120 ]
br label %124
124: ; preds = %122, %124
%125 = phi i64 [ %138, %124 ], [ %123, %122 ]
%126 = getelementptr inbounds float, float* %1, i64 %125
%127 = load float, float* %126
%128 = fmul float %127, %13
%129 = getelementptr inbounds float, float* %4, i64 %125
store float %128, float* %129
%130 = getelementptr inbounds float, float* %2, i64 %125
%131 = load float, float* %130
%132 = load float, float* %126
%133 = fneg float %132
%134 = fmul float %132, %133
%135 = tail call float @llvm.fmuladd.f32(float %131, float %16, float %134)
%136 = fmul float %135, %10
%137 = getelementptr inbounds float, float* %5, i64 %125
store float %136, float* %137
%138 = add nuw nsw i64 %125, 1
%139 = icmp eq i64 %138, %17
br i1 %139, label %140, label %124
140: ; preds = %124, %120, %6
ret void
}