void bloscbank(float *S, float *O, int D, float iD, float *lf, float *la,
               float *index, float *tab, int len, float synt, int lo, int hi) {
  int amp, freq, chan, i;
  float a, ainc, f, finc, address;
  for (chan = lo; chan < hi; chan++) {
    freq = (amp = (chan << 1)) + 1;
    if (S[amp] > synt) {
      finc = (S[freq] - (f = lf[chan])) * iD;
      ainc = (S[amp] - (a = la[chan])) * iD;
      address = index[chan];
      for (i = 0; i < D; i++) {
        O[i] += a * tab[(int)address];
        address += f;
        while (address >= len)
          address -= len;
        while (address < 0)
          address += len;
        a += ainc;
        f += finc;
      }
      lf[chan] = S[freq];
      la[chan] = S[amp];
      index[chan] = address;
    }
  }
}


x86 assembly (clang, -O0):
<bloscbank>:
push   %rbp
mov    %rsp,%rbp
mov    0x28(%rbp),%eax
mov    0x20(%rbp),%eax
mov    0x18(%rbp),%eax
mov    0x10(%rbp),%rax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
movss  %xmm0,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
movss  %xmm1,-0x34(%rbp)
mov    0x20(%rbp),%eax
mov    %eax,-0x40(%rbp)
mov    -0x40(%rbp),%eax
cmp    0x28(%rbp),%eax
jge    12fe <bloscbank+0x1fe>
mov    -0x40(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x38(%rbp)
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
ucomiss -0x34(%rbp),%xmm0
jbe    12eb <bloscbank+0x1eb>
mov    -0x8(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x40(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
movss  %xmm1,-0x50(%rbp)
subss  %xmm1,%xmm0
mulss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x54(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x40(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
movss  %xmm1,-0x48(%rbp)
subss  %xmm1,%xmm0
mulss  -0x18(%rbp),%xmm0
movss  %xmm0,-0x4c(%rbp)
mov    -0x30(%rbp),%rax
movslq -0x40(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x58(%rbp)
movl   $0x0,-0x44(%rbp)
mov    -0x44(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    12a5 <bloscbank+0x1a5>
movss  -0x48(%rbp),%xmm0
mov    0x10(%rbp),%rax
cvttss2si -0x58(%rbp),%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm2
mov    -0x10(%rbp),%rax
movslq -0x44(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,(%rax,%rcx,4)
movss  -0x50(%rbp),%xmm0
addss  -0x58(%rbp),%xmm0
movss  %xmm0,-0x58(%rbp)
movss  -0x58(%rbp),%xmm0
cvtsi2ssl 0x18(%rbp),%xmm1
ucomiss %xmm1,%xmm0
jb     1253 <bloscbank+0x153>
cvtsi2ssl 0x18(%rbp),%xmm1
movss  -0x58(%rbp),%xmm0
subss  %xmm1,%xmm0
movss  %xmm0,-0x58(%rbp)
jmp    1228 <bloscbank+0x128>
jmp    1258 <bloscbank+0x158>
xorps  %xmm0,%xmm0
ucomiss -0x58(%rbp),%xmm0
jbe    1279 <bloscbank+0x179>
cvtsi2ssl 0x18(%rbp),%xmm0
addss  -0x58(%rbp),%xmm0
movss  %xmm0,-0x58(%rbp)
jmp    1258 <bloscbank+0x158>
movss  -0x4c(%rbp),%xmm0
addss  -0x48(%rbp),%xmm0
movss  %xmm0,-0x48(%rbp)
movss  -0x54(%rbp),%xmm0
addss  -0x50(%rbp),%xmm0
movss  %xmm0,-0x50(%rbp)
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    11dd <bloscbank+0xdd>
mov    -0x8(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x40(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x8(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x28(%rbp),%rax
movslq -0x40(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x58(%rbp),%xmm0
mov    -0x30(%rbp),%rax
movslq -0x40(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    12f0 <bloscbank+0x1f0>
mov    -0x40(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x40(%rbp)
jmp    1138 <bloscbank+0x38>
pop    %rbp
ret

x86 assembly (clang, -O2):
<bloscbank>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
mov    0x48(%rsp),%ebx
mov    0x40(%rsp),%eax
cmp    %ebx,%eax
jge    1210 <bloscbank+0x110>
mov    0x30(%rsp),%r10
cvtsi2ssl 0x38(%rsp),%xmm2
cltq
movslq %ebx,%r11
mov    %edx,%r12d
shufps $0x0,%xmm0,%xmm0
xorps  %xmm3,%xmm3
jmp    1164 <bloscbank+0x64>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movss  %xmm5,(%rcx,%rax,4)
movss  (%rdi,%r14,4),%xmm5
movss  %xmm5,(%r8,%rax,4)
movss  %xmm4,(%r9,%rax,4)
add    $0x1,%rax
cmp    %r11,%rax
je     1210 <bloscbank+0x110>
lea    (%rax,%rax,1),%ebx
movslq %ebx,%r14
movss  (%rdi,%r14,4),%xmm6
ucomiss %xmm1,%xmm6
jbe    1157 <bloscbank+0x57>
or     $0x1,%ebx
movslq %ebx,%r15
movss  (%rdi,%r15,4),%xmm5
movss  (%r9,%rax,4),%xmm4
test   %edx,%edx
jle    1140 <bloscbank+0x40>
unpcklps %xmm6,%xmm5
movss  (%r8,%rax,4),%xmm7
movss  (%rcx,%rax,4),%xmm6
unpcklps %xmm7,%xmm6
subps  %xmm6,%xmm5
mulps  %xmm0,%xmm5
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
cvttss2si %xmm4,%ebp
movslq %ebp,%rbp
movaps %xmm6,%xmm7
shufps $0x55,%xmm6,%xmm7
mulss  (%r10,%rbp,4),%xmm7
addss  (%rsi,%rbx,4),%xmm7
movss  %xmm7,(%rsi,%rbx,4)
addss  %xmm6,%xmm4
ucomiss %xmm2,%xmm4
jb     11f4 <bloscbank+0xf4>
nopw   0x0(%rax,%rax,1)
subss  %xmm2,%xmm4
ucomiss %xmm2,%xmm4
jae    11e0 <bloscbank+0xe0>
jmp    11f4 <bloscbank+0xf4>
nopl   0x0(%rax,%rax,1)
addss  %xmm2,%xmm4
ucomiss %xmm4,%xmm3
ja     11f0 <bloscbank+0xf0>
addps  %xmm5,%xmm6
add    $0x1,%rbx
cmp    %r12,%rbx
jne    11b0 <bloscbank+0xb0>
movss  (%rdi,%r15,4),%xmm5
jmp    1140 <bloscbank+0x40>
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

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

LLVM IR (-O2):
define void @bloscbank(float* nocapture %0, float* nocapture %1, i32 %2, float %3, float* nocapture %4, float* nocapture %5, float* nocapture %6, float* nocapture %7, i32 %8, float %9, i32 %10, i32 %11) {
%13 = icmp slt i32 %10, %11
br i1 %13, label %14, label %87
14: ; preds = %12
%15 = icmp sgt i32 %2, 0
%16 = sitofp i32 %8 to float
%17 = sext i32 %10 to i64
%18 = sext i32 %11 to i64
%19 = zext i32 %2 to i64
%20 = insertelement <2 x float> poison, float %3, i64 0
%21 = shufflevector <2 x float> %20, <2 x float> poison, <2 x i32> zeroinitializer
br label %22
22: ; preds = %14, %84
%23 = phi i64 [ %17, %14 ], [ %85, %84 ]
%24 = trunc i64 %23 to i32
%25 = shl i32 %24, 1
%26 = sext i32 %25 to i64
%27 = getelementptr inbounds float, float* %0, i64 %26
%28 = load float, float* %27
%29 = fcmp ogt float %28, %9
br i1 %29, label %30, label %84
30: ; preds = %22
%31 = or i32 %25, 1
%32 = sext i32 %31 to i64
%33 = getelementptr inbounds float, float* %0, i64 %32
%34 = load float, float* %33
%35 = getelementptr inbounds float, float* %4, i64 %23
%36 = load float, float* %35
%37 = getelementptr inbounds float, float* %5, i64 %23
%38 = load float, float* %37
%39 = insertelement <2 x float> poison, float %34, i64 0
%40 = insertelement <2 x float> %39, float %28, i64 1
%41 = insertelement <2 x float> poison, float %36, i64 0
%42 = insertelement <2 x float> %41, float %38, i64 1
%43 = fsub <2 x float> %40, %42
%44 = fmul <2 x float> %43, %21
%45 = getelementptr inbounds float, float* %6, i64 %23
%46 = load float, float* %45
br i1 %15, label %47, label %80
47: ; preds = %30, %73
%48 = phi i64 [ %76, %73 ], [ 0, %30 ]
%49 = phi float [ %74, %73 ], [ %46, %30 ]
%50 = phi <2 x float> [ %75, %73 ], [ %42, %30 ]
%51 = fptosi float %49 to i32
%52 = sext i32 %51 to i64
%53 = getelementptr inbounds float, float* %7, i64 %52
%54 = load float, float* %53
%55 = getelementptr inbounds float, float* %1, i64 %48
%56 = load float, float* %55
%57 = extractelement <2 x float> %50, i64 1
%58 = tail call float @llvm.fmuladd.f32(float %57, float %54, float %56)
store float %58, float* %55
%59 = extractelement <2 x float> %50, i64 0
%60 = fadd float %59, %49
%61 = fcmp ult float %60, %16
br i1 %61, label %62, label %65
62: ; preds = %65, %47
%63 = phi float [ %60, %47 ], [ %67, %65 ]
%64 = fcmp olt float %63, 0.000000e+00
br i1 %64, label %69, label %73
65: ; preds = %47, %65
%66 = phi float [ %67, %65 ], [ %60, %47 ]
%67 = fsub float %66, %16
%68 = fcmp ult float %67, %16
br i1 %68, label %62, label %65
69: ; preds = %62, %69
%70 = phi float [ %71, %69 ], [ %63, %62 ]
%71 = fadd float %70, %16
%72 = fcmp olt float %71, 0.000000e+00
br i1 %72, label %69, label %73
73: ; preds = %69, %62
%74 = phi float [ %63, %62 ], [ %71, %69 ]
%75 = fadd <2 x float> %44, %50
%76 = add nuw nsw i64 %48, 1
%77 = icmp eq i64 %76, %19
br i1 %77, label %78, label %47
78: ; preds = %73
%79 = load float, float* %33
br label %80
80: ; preds = %78, %30
%81 = phi float [ %34, %30 ], [ %79, %78 ]
%82 = phi float [ %46, %30 ], [ %74, %78 ]
store float %81, float* %35
%83 = load float, float* %27
store float %83, float* %37
store float %82, float* %45
br label %84
84: ; preds = %22, %80
%85 = add nsw i64 %23, 1
%86 = icmp eq i64 %85, %18
br i1 %86, label %87, label %22
87: ; preds = %84, %12
ret void
}