void dcbias(long len, float *speech, float *sigout) {
  float bias;
  long i;
  bias = 0.f;
  for (i = 0; i < len; ++i) {
    bias += speech[i];
  }
  bias /= len;
  for (i = 0; i < len; ++i) {
    *sigout++ = *speech++ - bias;
  }
}


x86 assembly (clang, -O0):
<dcbias>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x1c(%rbp)
movq   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x8(%rbp),%rax
jge    1156 <dcbias+0x56>
mov    -0x10(%rbp),%rax
mov    -0x28(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
addss  -0x1c(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1120 <dcbias+0x20>
cvtsi2ssq -0x8(%rbp),%xmm1
movss  -0x1c(%rbp),%xmm0
divss  %xmm1,%xmm0
movss  %xmm0,-0x1c(%rbp)
movq   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x8(%rbp),%rax
jge    11bc <dcbias+0xbc>
mov    -0x10(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x10(%rbp)
movss  (%rax),%xmm0
subss  -0x1c(%rbp),%xmm0
mov    -0x18(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x18(%rbp)
movss  %xmm0,(%rax)
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1172 <dcbias+0x72>
pop    %rbp
ret

x86 assembly (clang, -O2):
<dcbias>:
test   %rdi,%rdi
jle    12ef <dcbias+0x1ef>
lea    -0x1(%rdi),%rax
mov    %edi,%r8d
and    $0x7,%r8d
cmp    $0x7,%rax
jae    1121 <dcbias+0x21>
xorps  %xmm0,%xmm0
xor    %ecx,%ecx
jmp    1168 <dcbias+0x68>
mov    %rdi,%rax
and    $0xfffffffffffffff8,%rax
xorps  %xmm0,%xmm0
xor    %ecx,%ecx
nopl   (%rax)
addss  (%rsi,%rcx,4),%xmm0
addss  0x4(%rsi,%rcx,4),%xmm0
addss  0x8(%rsi,%rcx,4),%xmm0
addss  0xc(%rsi,%rcx,4),%xmm0
addss  0x10(%rsi,%rcx,4),%xmm0
addss  0x14(%rsi,%rcx,4),%xmm0
addss  0x18(%rsi,%rcx,4),%xmm0
addss  0x1c(%rsi,%rcx,4),%xmm0
add    $0x8,%rcx
cmp    %rcx,%rax
jne    1130 <dcbias+0x30>
test   %r8,%r8
je     118e <dcbias+0x8e>
lea    (%rsi,%rcx,4),%rax
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
addss  (%rax,%rcx,4),%xmm0
add    $0x1,%rcx
cmp    %rcx,%r8
jne    1180 <dcbias+0x80>
test   %rdi,%rdi
jle    12ef <dcbias+0x1ef>
cvtsi2ss %rdi,%xmm1
divss  %xmm1,%xmm0
cmp    $0x8,%rdi
jb     11c0 <dcbias+0xc0>
lea    (%rsi,%rdi,4),%rax
cmp    %rdx,%rax
jbe    125c <dcbias+0x15c>
lea    (%rdx,%rdi,4),%rax
cmp    %rsi,%rax
jbe    125c <dcbias+0x15c>
xor    %r9d,%r9d
mov    %r9,%r8
not    %r8
add    %rdi,%r8
mov    %rdi,%rax
and    $0x3,%rax
je     1200 <dcbias+0x100>
neg    %rax
xor    %ecx,%ecx
nopw   0x0(%rax,%rax,1)
movss  (%rsi),%xmm1
add    $0x4,%rsi
subss  %xmm0,%xmm1
movss  %xmm1,(%rdx)
add    $0x4,%rdx
add    $0xffffffffffffffff,%rcx
cmp    %rcx,%rax
jne    11e0 <dcbias+0xe0>
sub    %rcx,%r9
cmp    $0x3,%r8
jb     12ef <dcbias+0x1ef>
sub    %r9,%rdi
xor    %eax,%eax
nop
movss  (%rsi,%rax,4),%xmm1
subss  %xmm0,%xmm1
movss  %xmm1,(%rdx,%rax,4)
movss  0x4(%rsi,%rax,4),%xmm1
subss  %xmm0,%xmm1
movss  %xmm1,0x4(%rdx,%rax,4)
movss  0x8(%rsi,%rax,4),%xmm1
subss  %xmm0,%xmm1
movss  %xmm1,0x8(%rdx,%rax,4)
movss  0xc(%rsi,%rax,4),%xmm1
subss  %xmm0,%xmm1
movss  %xmm1,0xc(%rdx,%rax,4)
add    $0x4,%rax
cmp    %rax,%rdi
jne    1210 <dcbias+0x110>
jmp    12ef <dcbias+0x1ef>
mov    %rdi,%r9
and    $0xfffffffffffffff8,%r9
movaps %xmm0,%xmm1
shufps $0x0,%xmm0,%xmm1
lea    -0x8(%r9),%rax
mov    %rax,%r8
shr    $0x3,%r8
add    $0x1,%r8
test   %rax,%rax
je     12fd <dcbias+0x1fd>
mov    %r8,%rax
and    $0xfffffffffffffffe,%rax
xor    %ecx,%ecx
nopw   0x0(%rax,%rax,1)
movups (%rsi,%rcx,4),%xmm2
movups 0x10(%rsi,%rcx,4),%xmm3
subps  %xmm1,%xmm2
subps  %xmm1,%xmm3
movups %xmm2,(%rdx,%rcx,4)
movups %xmm3,0x10(%rdx,%rcx,4)
movups 0x20(%rsi,%rcx,4),%xmm2
movups 0x30(%rsi,%rcx,4),%xmm3
subps  %xmm1,%xmm2
subps  %xmm1,%xmm3
movups %xmm2,0x20(%rdx,%rcx,4)
movups %xmm3,0x30(%rdx,%rcx,4)
add    $0x10,%rcx
add    $0xfffffffffffffffe,%rax
jne    1290 <dcbias+0x190>
test   $0x1,%r8b
je     12ea <dcbias+0x1ea>
movups (%rsi,%rcx,4),%xmm2
movups 0x10(%rsi,%rcx,4),%xmm3
subps  %xmm1,%xmm2
subps  %xmm1,%xmm3
movups %xmm2,(%rdx,%rcx,4)
movups %xmm3,0x10(%rdx,%rcx,4)
cmp    %rdi,%r9
jne    12f0 <dcbias+0x1f0>
ret
lea    (%rdx,%r9,4),%rdx
lea    (%rsi,%r9,4),%rsi
jmp    11c3 <dcbias+0xc3>
xor    %ecx,%ecx
test   $0x1,%r8b
jne    12d2 <dcbias+0x1d2>
jmp    12ea <dcbias+0x1ea>

LLVM IR (-O0):
define void @dcbias(i64 %0, float* %1, float* %2) {
%4 = alloca i64
%5 = alloca float*
%6 = alloca float*
%7 = alloca float
%8 = alloca i64
store i64 %0, i64* %4
store float* %1, float** %5
store float* %2, float** %6
store float 0.000000e+00, float* %7
store i64 0, i64* %8
br label %9
9: ; preds = %20, %3
%10 = load i64, i64* %8
%11 = load i64, i64* %4
%12 = icmp slt i64 %10, %11
br i1 %12, label %13, label %23
13: ; preds = %9
%14 = load float*, float** %5
%15 = load i64, i64* %8
%16 = getelementptr inbounds float, float* %14, i64 %15
%17 = load float, float* %16
%18 = load float, float* %7
%19 = fadd float %18, %17
store float %19, float* %7
br label %20
20: ; preds = %13
%21 = load i64, i64* %8
%22 = add nsw i64 %21, 1
store i64 %22, i64* %8
br label %9
23: ; preds = %9
%24 = load i64, i64* %4
%25 = sitofp i64 %24 to float
%26 = load float, float* %7
%27 = fdiv float %26, %25
store float %27, float* %7
store i64 0, i64* %8
br label %28
28: ; preds = %40, %23
%29 = load i64, i64* %8
%30 = load i64, i64* %4
%31 = icmp slt i64 %29, %30
br i1 %31, label %32, label %43
32: ; preds = %28
%33 = load float*, float** %5
%34 = getelementptr inbounds float, float* %33, i32 1
store float* %34, float** %5
%35 = load float, float* %33
%36 = load float, float* %7
%37 = fsub float %35, %36
%38 = load float*, float** %6
%39 = getelementptr inbounds float, float* %38, i32 1
store float* %39, float** %6
store float %37, float* %38
br label %40
40: ; preds = %32
%41 = load i64, i64* %8
%42 = add nsw i64 %41, 1
store i64 %42, i64* %8
br label %28
43: ; preds = %28
ret void
}

LLVM IR (-O2):
define void @dcbias(i64 %0, float* nocapture %1, float* nocapture writeonly %2) {
%4 = icmp sgt i64 %0, 0
br i1 %4, label %5, label %187
5: ; preds = %3
%6 = add i64 %0, -1
%7 = and i64 %0, 7
%8 = icmp ult i64 %6, 7
br i1 %8, label %49, label %9
9: ; preds = %5
%10 = and i64 %0, -8
br label %11
11: ; preds = %11, %9
%12 = phi i64 [ 0, %9 ], [ %46, %11 ]
%13 = phi float [ 0.000000e+00, %9 ], [ %45, %11 ]
%14 = phi i64 [ 0, %9 ], [ %47, %11 ]
%15 = getelementptr inbounds float, float* %1, i64 %12
%16 = load float, float* %15
%17 = fadd float %13, %16
%18 = or i64 %12, 1
%19 = getelementptr inbounds float, float* %1, i64 %18
%20 = load float, float* %19
%21 = fadd float %17, %20
%22 = or i64 %12, 2
%23 = getelementptr inbounds float, float* %1, i64 %22
%24 = load float, float* %23
%25 = fadd float %21, %24
%26 = or i64 %12, 3
%27 = getelementptr inbounds float, float* %1, i64 %26
%28 = load float, float* %27
%29 = fadd float %25, %28
%30 = or i64 %12, 4
%31 = getelementptr inbounds float, float* %1, i64 %30
%32 = load float, float* %31
%33 = fadd float %29, %32
%34 = or i64 %12, 5
%35 = getelementptr inbounds float, float* %1, i64 %34
%36 = load float, float* %35
%37 = fadd float %33, %36
%38 = or i64 %12, 6
%39 = getelementptr inbounds float, float* %1, i64 %38
%40 = load float, float* %39
%41 = fadd float %37, %40
%42 = or i64 %12, 7
%43 = getelementptr inbounds float, float* %1, i64 %42
%44 = load float, float* %43
%45 = fadd float %41, %44
%46 = add nuw nsw i64 %12, 8
%47 = add i64 %14, 8
%48 = icmp eq i64 %47, %10
br i1 %48, label %49, label %11
49: ; preds = %11, %5
%50 = phi float [ undef, %5 ], [ %45, %11 ]
%51 = phi i64 [ 0, %5 ], [ %46, %11 ]
%52 = phi float [ 0.000000e+00, %5 ], [ %45, %11 ]
%53 = icmp eq i64 %7, 0
br i1 %53, label %64, label %54
54: ; preds = %49, %54
%55 = phi i64 [ %61, %54 ], [ %51, %49 ]
%56 = phi float [ %60, %54 ], [ %52, %49 ]
%57 = phi i64 [ %62, %54 ], [ 0, %49 ]
%58 = getelementptr inbounds float, float* %1, i64 %55
%59 = load float, float* %58
%60 = fadd float %56, %59
%61 = add nuw nsw i64 %55, 1
%62 = add i64 %57, 1
%63 = icmp eq i64 %62, %7
br i1 %63, label %64, label %54
64: ; preds = %54, %49
%65 = phi float [ %50, %49 ], [ %60, %54 ]
%66 = sitofp i64 %0 to float
%67 = fdiv float %65, %66
br i1 %4, label %68, label %187
68: ; preds = %64
%69 = icmp ult i64 %0, 8
br i1 %69, label %140, label %70
70: ; preds = %68
%71 = getelementptr float, float* %2, i64 %0
%72 = getelementptr float, float* %1, i64 %0
%73 = icmp ugt float* %72, %2
%74 = icmp ugt float* %71, %1
%75 = and i1 %73, %74
br i1 %75, label %140, label %76
76: ; preds = %70
%77 = and i64 %0, -8
%78 = getelementptr float, float* %2, i64 %77
%79 = getelementptr float, float* %1, i64 %77
%80 = insertelement <4 x float> poison, float %67, i64 0
%81 = shufflevector <4 x float> %80, <4 x float> poison, <4 x i32> zeroinitializer
%82 = insertelement <4 x float> poison, float %67, i64 0
%83 = shufflevector <4 x float> %82, <4 x float> poison, <4 x i32> zeroinitializer
%84 = add i64 %77, -8
%85 = lshr exact i64 %84, 3
%86 = add nuw nsw i64 %85, 1
%87 = and i64 %86, 1
%88 = icmp eq i64 %84, 0
br i1 %88, label %122, label %89
89: ; preds = %76
%90 = and i64 %86, 4611686018427387902
br label %91
91: ; preds = %91, %89
%92 = phi i64 [ 0, %89 ], [ %119, %91 ]
%93 = phi i64 [ 0, %89 ], [ %120, %91 ]
%94 = getelementptr float, float* %2, i64 %92
%95 = getelementptr float, float* %1, i64 %92
%96 = bitcast float* %95 to <4 x float>*
%97 = load <4 x float>, <4 x float>* %96
%98 = getelementptr float, float* %95, i64 4
%99 = bitcast float* %98 to <4 x float>*
%100 = load <4 x float>, <4 x float>* %99
%101 = fsub <4 x float> %97, %81
%102 = fsub <4 x float> %100, %83
%103 = bitcast float* %94 to <4 x float>*
store <4 x float> %101, <4 x float>* %103
%104 = getelementptr float, float* %94, i64 4
%105 = bitcast float* %104 to <4 x float>*
store <4 x float> %102, <4 x float>* %105
%106 = or i64 %92, 8
%107 = getelementptr float, float* %2, i64 %106
%108 = getelementptr float, float* %1, i64 %106
%109 = bitcast float* %108 to <4 x float>*
%110 = load <4 x float>, <4 x float>* %109
%111 = getelementptr float, float* %108, i64 4
%112 = bitcast float* %111 to <4 x float>*
%113 = load <4 x float>, <4 x float>* %112
%114 = fsub <4 x float> %110, %81
%115 = fsub <4 x float> %113, %83
%116 = bitcast float* %107 to <4 x float>*
store <4 x float> %114, <4 x float>* %116
%117 = getelementptr float, float* %107, i64 4
%118 = bitcast float* %117 to <4 x float>*
store <4 x float> %115, <4 x float>* %118
%119 = add nuw i64 %92, 16
%120 = add i64 %93, 2
%121 = icmp eq i64 %120, %90
br i1 %121, label %122, label %91
122: ; preds = %91, %76
%123 = phi i64 [ 0, %76 ], [ %119, %91 ]
%124 = icmp eq i64 %87, 0
br i1 %124, label %138, label %125
125: ; preds = %122
%126 = getelementptr float, float* %2, i64 %123
%127 = getelementptr float, float* %1, i64 %123
%128 = bitcast float* %127 to <4 x float>*
%129 = load <4 x float>, <4 x float>* %128
%130 = getelementptr float, float* %127, i64 4
%131 = bitcast float* %130 to <4 x float>*
%132 = load <4 x float>, <4 x float>* %131
%133 = fsub <4 x float> %129, %81
%134 = fsub <4 x float> %132, %83
%135 = bitcast float* %126 to <4 x float>*
store <4 x float> %133, <4 x float>* %135
%136 = getelementptr float, float* %126, i64 4
%137 = bitcast float* %136 to <4 x float>*
store <4 x float> %134, <4 x float>* %137
br label %138
138: ; preds = %122, %125
%139 = icmp eq i64 %77, %0
br i1 %139, label %187, label %140
140: ; preds = %70, %68, %138
%141 = phi i64 [ 0, %70 ], [ 0, %68 ], [ %77, %138 ]
%142 = phi float* [ %2, %70 ], [ %2, %68 ], [ %78, %138 ]
%143 = phi float* [ %1, %70 ], [ %1, %68 ], [ %79, %138 ]
%144 = xor i64 %141, -1
%145 = add i64 %144, %0
%146 = and i64 %0, 3
%147 = icmp eq i64 %146, 0
br i1 %147, label %160, label %148
148: ; preds = %140, %148
%149 = phi i64 [ %157, %148 ], [ %141, %140 ]
%150 = phi float* [ %156, %148 ], [ %142, %140 ]
%151 = phi float* [ %153, %148 ], [ %143, %140 ]
%152 = phi i64 [ %158, %148 ], [ 0, %140 ]
%153 = getelementptr inbounds float, float* %151, i64 1
%154 = load float, float* %151
%155 = fsub float %154, %67
%156 = getelementptr inbounds float, float* %150, i64 1
store float %155, float* %150
%157 = add nuw nsw i64 %149, 1
%158 = add i64 %152, 1
%159 = icmp eq i64 %158, %146
br i1 %159, label %160, label %148
160: ; preds = %148, %140
%161 = phi i64 [ %141, %140 ], [ %157, %148 ]
%162 = phi float* [ %142, %140 ], [ %156, %148 ]
%163 = phi float* [ %143, %140 ], [ %153, %148 ]
%164 = icmp ult i64 %145, 3
br i1 %164, label %187, label %165
165: ; preds = %160, %165
%166 = phi i64 [ %185, %165 ], [ %161, %160 ]
%167 = phi float* [ %184, %165 ], [ %162, %160 ]
%168 = phi float* [ %181, %165 ], [ %163, %160 ]
%169 = getelementptr inbounds float, float* %168, i64 1
%170 = load float, float* %168
%171 = fsub float %170, %67
%172 = getelementptr inbounds float, float* %167, i64 1
store float %171, float* %167
%173 = getelementptr inbounds float, float* %168, i64 2
%174 = load float, float* %169
%175 = fsub float %174, %67
%176 = getelementptr inbounds float, float* %167, i64 2
store float %175, float* %172
%177 = getelementptr inbounds float, float* %168, i64 3
%178 = load float, float* %173
%179 = fsub float %178, %67
%180 = getelementptr inbounds float, float* %167, i64 3
store float %179, float* %176
%181 = getelementptr inbounds float, float* %168, i64 4
%182 = load float, float* %177
%183 = fsub float %182, %67
%184 = getelementptr inbounds float, float* %167, i64 4
store float %183, float* %180
%185 = add nuw nsw i64 %166, 4
%186 = icmp eq i64 %185, %0
br i1 %186, label %187, label %165
187: ; preds = %160, %165, %138, %3, %64
ret void
}