void mask_tophat_filter2(float *xin, float *xout, int len, int pa, int pb,
                         int size) {
  int i, k, ia, ib, ic;
  int mask;
  float t1, t2;
  mask = size - 1;
  t1 = 0;
  t2 = 0;
  ic = pa;
  for (i = 0; i < len; i++) {
    t1 += xin[2 * ic];
    t2 += xin[2 * ic + 1];
    ic = (ic + 1) & mask;
  }
  k = len / 2;
  ib = pa;
  for (i = 0; i < k; i++) {
    xout[2 * ib] = t1 / (float)len;
    xout[2 * ib + 1] = t2 / (float)len;
    ib = (ib + 1) & mask;
  }
  ia = pa;
  while (ic != pb) {
    xout[2 * ib] = t1 / (float)len;
    xout[2 * ib + 1] = t2 / (float)len;
    t1 += xin[2 * ic];
    t2 += xin[2 * ic + 1];
    ic = (ic + 1) & mask;
    t1 -= xin[2 * ia];
    t2 -= xin[2 * ia + 1];
    ib = (ib + 1) & mask;
    ia = (ia + 1) & mask;
  }
  while (ib != pb) {
    xout[2 * ib] = t1 / (float)len;
    xout[2 * ib + 1] = t2 / (float)len;
    ib = (ib + 1) & mask;
  }
}


x86 assembly (clang, -O0):
<mask_tophat_filter2>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    %r8d,-0x1c(%rbp)
mov    %r9d,-0x20(%rbp)
mov    -0x20(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x38(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x3c(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x40(%rbp)
mov    -0x18(%rbp),%eax
mov    %eax,-0x34(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    11a1 <mask_tophat_filter2+0xa1>
mov    -0x8(%rbp),%rax
mov    -0x34(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
addss  -0x3c(%rbp),%xmm0
movss  %xmm0,-0x3c(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x34(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
addss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x40(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
and    -0x38(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    1140 <mask_tophat_filter2+0x40>
mov    -0x14(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,-0x28(%rbp)
mov    -0x18(%rbp),%eax
mov    %eax,-0x30(%rbp)
movl   $0x0,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x28(%rbp),%eax
jge    1225 <mask_tophat_filter2+0x125>
movss  -0x3c(%rbp),%xmm0
cvtsi2ssl -0x14(%rbp),%xmm1
divss  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x40(%rbp),%xmm0
cvtsi2ssl -0x14(%rbp),%xmm1
divss  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
and    -0x38(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    11bc <mask_tophat_filter2+0xbc>
mov    -0x18(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x1c(%rbp),%eax
je     1321 <mask_tophat_filter2+0x221>
movss  -0x3c(%rbp),%xmm0
cvtsi2ssl -0x14(%rbp),%xmm1
divss  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x40(%rbp),%xmm0
cvtsi2ssl -0x14(%rbp),%xmm1
divss  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x8(%rbp),%rax
mov    -0x34(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
addss  -0x3c(%rbp),%xmm0
movss  %xmm0,-0x3c(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x34(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
addss  -0x40(%rbp),%xmm0
movss  %xmm0,-0x40(%rbp)
mov    -0x34(%rbp),%eax
add    $0x1,%eax
and    -0x38(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x2c(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm1
movss  -0x3c(%rbp),%xmm0
subss  %xmm1,%xmm0
movss  %xmm0,-0x3c(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x2c(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm1
movss  -0x40(%rbp),%xmm0
subss  %xmm1,%xmm0
movss  %xmm0,-0x40(%rbp)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
and    -0x38(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
and    -0x38(%rbp),%eax
mov    %eax,-0x2c(%rbp)
jmp    122b <mask_tophat_filter2+0x12b>
jmp    1326 <mask_tophat_filter2+0x226>
mov    -0x30(%rbp),%eax
cmp    -0x1c(%rbp),%eax
je     1386 <mask_tophat_filter2+0x286>
movss  -0x3c(%rbp),%xmm0
cvtsi2ssl -0x14(%rbp),%xmm1
divss  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
shl    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x40(%rbp),%xmm0
cvtsi2ssl -0x14(%rbp),%xmm1
divss  %xmm1,%xmm0
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%ecx
shl    $0x1,%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x30(%rbp),%eax
add    $0x1,%eax
and    -0x38(%rbp),%eax
mov    %eax,-0x30(%rbp)
jmp    1326 <mask_tophat_filter2+0x226>
pop    %rbp
ret

x86 assembly (clang, -O2):
<mask_tophat_filter2>:
push   %rbp
push   %rbx
add    $0xffffffff,%r9d
test   %edx,%edx
jle    1117 <mask_tophat_filter2+0x17>
cmp    $0x1,%edx
jne    1122 <mask_tophat_filter2+0x22>
xorps  %xmm0,%xmm0
mov    %ecx,%r10d
jmp    1161 <mask_tophat_filter2+0x61>
xorps  %xmm0,%xmm0
mov    %ecx,%r10d
jmp    1232 <mask_tophat_filter2+0x132>
mov    %edx,%eax
and    $0xfffffffe,%eax
xorps  %xmm0,%xmm0
mov    %ecx,%r10d
nopl   (%rax)
lea    (%r10,%r10,1),%ebx
movslq %ebx,%rbx
movsd  (%rdi,%rbx,4),%xmm1
addps  %xmm0,%xmm1
add    $0x1,%r10d
and    %r9d,%r10d
lea    (%r10,%r10,1),%ebx
movslq %ebx,%rbx
movsd  (%rdi,%rbx,4),%xmm0
addps  %xmm1,%xmm0
add    $0x1,%r10d
and    %r9d,%r10d
add    $0xfffffffe,%eax
jne    1130 <mask_tophat_filter2+0x30>
test   $0x1,%dl
je     117b <mask_tophat_filter2+0x7b>
lea    (%r10,%r10,1),%eax
cltq
movsd  (%rdi,%rax,4),%xmm1
addps  %xmm1,%xmm0
add    $0x1,%r10d
and    %r9d,%r10d
cmp    $0x2,%edx
jl     1232 <mask_tophat_filter2+0x132>
mov    %edx,%r11d
shr    $0x1f,%r11d
add    %edx,%r11d
sar    %r11d
cvtsi2ss %edx,%xmm3
movaps %xmm0,%xmm2
divss  %xmm3,%xmm2
movaps %xmm0,%xmm1
shufps $0x55,%xmm0,%xmm1
divss  %xmm3,%xmm1
mov    %edx,%ebx
and    $0xfffffffe,%ebx
mov    %ecx,%eax
cmp    $0x2,%ebx
je     1203 <mask_tophat_filter2+0x103>
mov    %r11d,%ebx
and    $0xfffffffe,%ebx
mov    %ecx,%eax
nopl   0x0(%rax,%rax,1)
lea    (%rax,%rax,1),%ebp
movslq %ebp,%rbp
movss  %xmm2,(%rsi,%rbp,4)
lea    (%rax,%rax,1),%ebp
add    $0x1,%ebp
movslq %ebp,%rbp
movss  %xmm1,(%rsi,%rbp,4)
add    $0x1,%eax
and    %r9d,%eax
lea    (%rax,%rax,1),%ebp
movslq %ebp,%rbp
movss  %xmm2,(%rsi,%rbp,4)
lea    (%rax,%rax,1),%ebp
add    $0x1,%ebp
movslq %ebp,%rbp
movss  %xmm1,(%rsi,%rbp,4)
add    $0x1,%eax
and    %r9d,%eax
add    $0xfffffffe,%ebx
jne    11c0 <mask_tophat_filter2+0xc0>
test   $0x1,%r11b
je     1228 <mask_tophat_filter2+0x128>
lea    (%rax,%rax,1),%ebx
movslq %ebx,%rbx
movss  %xmm2,(%rsi,%rbx,4)
lea    (%rax,%rax,1),%ebx
add    $0x1,%ebx
movslq %ebx,%rbx
movss  %xmm1,(%rsi,%rbx,4)
add    $0x1,%eax
and    %r9d,%eax
cmp    %r8d,%r10d
jne    1239 <mask_tophat_filter2+0x139>
movaps %xmm0,%xmm1
jmp    12a1 <mask_tophat_filter2+0x1a1>
mov    %ecx,%eax
cmp    %r8d,%r10d
je     122d <mask_tophat_filter2+0x12d>
xorps  %xmm2,%xmm2
cvtsi2ss %edx,%xmm2
movaps %xmm0,%xmm1
divss  %xmm2,%xmm1
lea    (%rax,%rax,1),%ebp
movslq %ebp,%rbp
movss  %xmm1,(%rsi,%rbp,4)
movaps %xmm0,%xmm1
shufps $0x55,%xmm0,%xmm1
divss  %xmm2,%xmm1
lea    0x1(%rax,%rax,1),%ebp
movslq %ebp,%rbp
movss  %xmm1,(%rsi,%rbp,4)
lea    (%r10,%r10,1),%ebp
movslq %ebp,%rbp
movsd  (%rdi,%rbp,4),%xmm1
addps  %xmm0,%xmm1
add    $0x1,%r10d
and    %r9d,%r10d
lea    (%rcx,%rcx,1),%ebp
movslq %ebp,%rbp
movsd  (%rdi,%rbp,4),%xmm0
subps  %xmm0,%xmm1
add    $0x1,%eax
and    %r9d,%eax
add    $0x1,%ecx
and    %r9d,%ecx
movaps %xmm1,%xmm0
cmp    %r8d,%r10d
jne    1240 <mask_tophat_filter2+0x140>
cmp    %r8d,%eax
je     12e4 <mask_tophat_filter2+0x1e4>
xorps  %xmm2,%xmm2
cvtsi2ss %edx,%xmm2
movaps %xmm1,%xmm0
divss  %xmm2,%xmm0
shufps $0x55,%xmm1,%xmm1
divss  %xmm2,%xmm1
nopl   0x0(%rax)
lea    (%rax,%rax,1),%ecx
movslq %ecx,%rcx
movss  %xmm0,(%rsi,%rcx,4)
lea    (%rax,%rax,1),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movss  %xmm1,(%rsi,%rcx,4)
add    $0x1,%eax
and    %r9d,%eax
cmp    %r8d,%eax
jne    12c0 <mask_tophat_filter2+0x1c0>
pop    %rbx
pop    %rbp
ret

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

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