float *bbuzz(amp, si, hn, f, phs, a, alen)
float amp, si, hn, *f, *phs, *a;
long alen;
{
  register i, j, k;
  float q, d, h2n, h2np1;
  float *fp = a;
  h2n = hn + hn;
  h2np1 = h2n + 1.;
  for (i = 0; i < alen; i++) {
    j = *phs;
    k = (j + 1) % 1024;
    q = (int)((*phs - (float)j) * h2np1) / h2np1;
    d = *(f + j);
    d += (*(f + k) - d) * q;
    if (!d)
      *fp++ = amp;
    else {
      k = (long)(h2np1 * *phs) % 1024;
      *fp++ = amp * (*(f + k) / d - 1.) / h2n;
    }
    *phs += si;
    while (*phs >= 1024.)
      *phs -= 1024.;
  }
  return (a);
}


x86 assembly (clang, -O0):
<bbuzz>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm2,-0x60(%rbp)
movaps %xmm0,%xmm2
movsd  -0x60(%rbp),%xmm0
cvtsd2ss %xmm2,%xmm2
cvtsd2ss %xmm1,%xmm1
cvtsd2ss %xmm0,%xmm0
movss  %xmm2,-0x4(%rbp)
movss  %xmm1,-0x8(%rbp)
movss  %xmm0,-0xc(%rbp)
mov    %rdi,-0x18(%rbp)
mov    %rsi,-0x20(%rbp)
mov    %rdx,-0x28(%rbp)
mov    %rcx,-0x30(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,-0x58(%rbp)
movss  -0xc(%rbp),%xmm0
addss  -0xc(%rbp),%xmm0
movss  %xmm0,-0x48(%rbp)
movss  -0x48(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe9c(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4c(%rbp)
movl   $0x0,-0x34(%rbp)
movslq -0x34(%rbp),%rax
cmp    -0x30(%rbp),%rax
jge    1314 <bbuzz+0x214>
mov    -0x20(%rbp),%rax
cvttss2si (%rax),%eax
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
add    $0x1,%eax
mov    $0x400,%ecx
cltd
idiv   %ecx
mov    %edx,-0x3c(%rbp)
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
cvtsi2ssl -0x38(%rbp),%xmm1
subss  %xmm1,%xmm0
mulss  -0x4c(%rbp),%xmm0
cvttss2si %xmm0,%eax
cvtsi2ss %eax,%xmm0
divss  -0x4c(%rbp),%xmm0
movss  %xmm0,-0x40(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x38(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x44(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
subss  -0x44(%rbp),%xmm0
movss  -0x40(%rbp),%xmm2
movss  -0x44(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x44(%rbp)
movss  -0x44(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    1239 <bbuzz+0x139>
jp     1239 <bbuzz+0x139>
movss  -0x4(%rbp),%xmm0
mov    -0x58(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x58(%rbp)
movss  %xmm0,(%rax)
jmp    12ad <bbuzz+0x1ad>
movss  -0x4c(%rbp),%xmm0
mov    -0x20(%rbp),%rax
mulss  (%rax),%xmm0
cvttss2si %xmm0,%rax
mov    $0x400,%ecx
cqto
idiv   %rcx
mov    %edx,%eax
mov    %eax,-0x3c(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
mov    -0x18(%rbp),%rax
movslq -0x3c(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
divss  -0x44(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xd7f(%rip),%xmm2
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movss  -0x48(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
mov    -0x58(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x58(%rbp)
movss  %xmm0,(%rax)
movss  -0x8(%rbp),%xmm0
mov    -0x20(%rbp),%rax
addss  (%rax),%xmm0
movss  %xmm0,(%rax)
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd36(%rip),%xmm1
ucomisd %xmm1,%xmm0
jb     1301 <bbuzz+0x201>
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd18(%rip),%xmm1
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%rax)
jmp    12be <bbuzz+0x1be>
jmp    1306 <bbuzz+0x206>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    1178 <bbuzz+0x78>
mov    -0x28(%rbp),%rax
pop    %rbp
ret

x86 assembly (clang, -O2):
<bbuzz>:
push   %rbx
mov    %rdx,%rax
test   %rcx,%rcx
jle    124e <bbuzz+0x14e>
cvtsd2ss %xmm0,%xmm4
cvtsd2ss %xmm1,%xmm12
cvtsd2ss %xmm2,%xmm2
addss  %xmm2,%xmm2
cvtss2sd %xmm2,%xmm10
addss  0xed5(%rip),%xmm2
cvtss2sd %xmm4,%xmm11
movss  (%rsi),%xmm5
xor    %r9d,%r9d
xorps  %xmm9,%xmm9
movabs $0x3ffffffffffffc00,%r8
ff ff 3f
movsd  0xec2(%rip),%xmm8
movss  0xeae(%rip),%xmm7
movss  0xeaa(%rip),%xmm6
mov    %rax,%r10
jmp    1185 <bbuzz+0x85>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x4,%r10
movss  %xmm5,(%rsi)
add    $0x1,%r9
cmp    %rcx,%r9
je     124e <bbuzz+0x14e>
cvttss2si %xmm5,%edx
lea    0x1(%rdx),%r11d
lea    0x400(%rdx),%ebx
test   %r11d,%r11d
cmovns %r11d,%ebx
and    $0xfffffc00,%ebx
neg    %ebx
add    %edx,%ebx
add    $0x1,%ebx
cvttps2dq %xmm5,%xmm0
cvtdq2ps %xmm0,%xmm0
movaps %xmm5,%xmm3
subss  %xmm0,%xmm3
mulss  %xmm2,%xmm3
cvttps2dq %xmm3,%xmm0
cvtdq2ps %xmm0,%xmm0
divss  %xmm2,%xmm0
movslq %edx,%rdx
movss  (%rdi,%rdx,4),%xmm1
movslq %ebx,%rdx
movss  (%rdi,%rdx,4),%xmm3
subss  %xmm1,%xmm3
mulss  %xmm0,%xmm3
addss  %xmm1,%xmm3
ucomiss %xmm9,%xmm3
movaps %xmm4,%xmm0
jne    11eb <bbuzz+0xeb>
jnp    1228 <bbuzz+0x128>
mulss  %xmm2,%xmm5
cvttss2si %xmm5,%rdx
lea    0x3ff(%rdx),%rbx
test   %rdx,%rdx
cmovns %rdx,%rbx
and    %r8,%rbx
sub    %rbx,%rdx
movss  (%rdi,%rdx,4),%xmm0
divss  %xmm3,%xmm0
cvtss2sd %xmm0,%xmm0
addsd  %xmm8,%xmm0
mulsd  %xmm11,%xmm0
divsd  %xmm10,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%r10)
movss  (%rsi),%xmm5
addss  %xmm12,%xmm5
ucomiss %xmm7,%xmm5
jb     1170 <bbuzz+0x70>
nop
addss  %xmm6,%xmm5
ucomiss %xmm7,%xmm5
jae    1240 <bbuzz+0x140>
jmp    1170 <bbuzz+0x70>
pop    %rbx
ret

LLVM IR (-O0):
define float* @bbuzz(double %0, double %1, double %2, float* %3, float* %4, float* %5, i64 %6) {
%8 = alloca float
%9 = alloca float
%10 = alloca float
%11 = alloca float*
%12 = alloca float*
%13 = alloca float*
%14 = alloca i64
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca float
%19 = alloca float
%20 = alloca float
%21 = alloca float
%22 = alloca float*
%23 = fptrunc double %0 to float
%24 = fptrunc double %1 to float
%25 = fptrunc double %2 to float
store float %23, float* %8
store float %24, float* %9
store float %25, float* %10
store float* %3, float** %11
store float* %4, float** %12
store float* %5, float** %13
store i64 %6, i64* %14
%26 = load float*, float** %13
store float* %26, float** %22
%27 = load float, float* %10
%28 = load float, float* %10
%29 = fadd float %27, %28
store float %29, float* %20
%30 = load float, float* %20
%31 = fpext float %30 to double
%32 = fadd double %31, 1.000000e+00
%33 = fptrunc double %32 to float
store float %33, float* %21
store i32 0, i32* %15
br label %34
34: ; preds = %121, %7
%35 = load i32, i32* %15
%36 = sext i32 %35 to i64
%37 = load i64, i64* %14
%38 = icmp slt i64 %36, %37
br i1 %38, label %39, label %124
39: ; preds = %34
%40 = load float*, float** %12
%41 = load float, float* %40
%42 = fptosi float %41 to i32
store i32 %42, i32* %16
%43 = load i32, i32* %16
%44 = add nsw i32 %43, 1
%45 = srem i32 %44, 1024
store i32 %45, i32* %17
%46 = load float*, float** %12
%47 = load float, float* %46
%48 = load i32, i32* %16
%49 = sitofp i32 %48 to float
%50 = fsub float %47, %49
%51 = load float, float* %21
%52 = fmul float %50, %51
%53 = fptosi float %52 to i32
%54 = sitofp i32 %53 to float
%55 = load float, float* %21
%56 = fdiv float %54, %55
store float %56, float* %18
%57 = load float*, float** %11
%58 = load i32, i32* %16
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds float, float* %57, i64 %59
%61 = load float, float* %60
store float %61, float* %19
%62 = load float*, float** %11
%63 = load i32, i32* %17
%64 = sext i32 %63 to i64
%65 = getelementptr inbounds float, float* %62, i64 %64
%66 = load float, float* %65
%67 = load float, float* %19
%68 = fsub float %66, %67
%69 = load float, float* %18
%70 = load float, float* %19
%71 = call float @llvm.fmuladd.f32(float %68, float %69, float %70)
store float %71, float* %19
%72 = load float, float* %19
%73 = fcmp une float %72, 0.000000e+00
br i1 %73, label %78, label %74
74: ; preds = %39
%75 = load float, float* %8
%76 = load float*, float** %22
%77 = getelementptr inbounds float, float* %76, i32 1
store float* %77, float** %22
store float %75, float* %76
br label %104
78: ; preds = %39
%79 = load float, float* %21
%80 = load float*, float** %12
%81 = load float, float* %80
%82 = fmul float %79, %81
%83 = fptosi float %82 to i64
%84 = srem i64 %83, 1024
%85 = trunc i64 %84 to i32
store i32 %85, i32* %17
%86 = load float, float* %8
%87 = fpext float %86 to double
%88 = load float*, float** %11
%89 = load i32, i32* %17
%90 = sext i32 %89 to i64
%91 = getelementptr inbounds float, float* %88, i64 %90
%92 = load float, float* %91
%93 = load float, float* %19
%94 = fdiv float %92, %93
%95 = fpext float %94 to double
%96 = fsub double %95, 1.000000e+00
%97 = fmul double %87, %96
%98 = load float, float* %20
%99 = fpext float %98 to double
%100 = fdiv double %97, %99
%101 = fptrunc double %100 to float
%102 = load float*, float** %22
%103 = getelementptr inbounds float, float* %102, i32 1
store float* %103, float** %22
store float %101, float* %102
br label %104
104: ; preds = %78, %74
%105 = load float, float* %9
%106 = load float*, float** %12
%107 = load float, float* %106
%108 = fadd float %107, %105
store float %108, float* %106
br label %109
109: ; preds = %114, %104
%110 = load float*, float** %12
%111 = load float, float* %110
%112 = fpext float %111 to double
%113 = fcmp oge double %112, 1.024000e+03
br i1 %113, label %114, label %120
114: ; preds = %109
%115 = load float*, float** %12
%116 = load float, float* %115
%117 = fpext float %116 to double
%118 = fsub double %117, 1.024000e+03
%119 = fptrunc double %118 to float
store float %119, float* %115
br label %109
120: ; preds = %109
br label %121
121: ; preds = %120
%122 = load i32, i32* %15
%123 = add nsw i32 %122, 1
store i32 %123, i32* %15
br label %34
124: ; preds = %34
%125 = load float*, float** %13
ret float* %125
}

LLVM IR (-O2):
define float* @bbuzz(double %0, double %1, double %2, float* nocapture %3, float* nocapture %4, float* returned writeonly %5, i64 %6) {
%8 = fptrunc double %0 to float
%9 = fptrunc double %1 to float
%10 = fptrunc double %2 to float
%11 = fadd float %10, %10
%12 = fpext float %11 to double
%13 = fadd float %11, 1.000000e+00
%14 = icmp sgt i64 %6, 0
br i1 %14, label %15, label %66
15: ; preds = %7
%16 = fpext float %8 to double
%17 = load float, float* %4
br label %18
18: ; preds = %15, %62
%19 = phi float [ %17, %15 ], [ %63, %62 ]
%20 = phi i64 [ 0, %15 ], [ %64, %62 ]
%21 = phi float* [ %5, %15 ], [ %54, %62 ]
%22 = fptosi float %19 to i32
%23 = add nsw i32 %22, 1
%24 = srem i32 %23, 1024
%25 = sitofp i32 %22 to float
%26 = fsub float %19, %25
%27 = fmul float %13, %26
%28 = fptosi float %27 to i32
%29 = sitofp i32 %28 to float
%30 = fdiv float %29, %13
%31 = sext i32 %22 to i64
%32 = getelementptr inbounds float, float* %3, i64 %31
%33 = load float, float* %32
%34 = sext i32 %24 to i64
%35 = getelementptr inbounds float, float* %3, i64 %34
%36 = load float, float* %35
%37 = fsub float %36, %33
%38 = tail call float @llvm.fmuladd.f32(float %37, float %30, float %33)
%39 = fcmp une float %38, 0.000000e+00
br i1 %39, label %40, label %52
40: ; preds = %18
%41 = fmul float %13, %19
%42 = fptosi float %41 to i64
%43 = srem i64 %42, 1024
%44 = getelementptr inbounds float, float* %3, i64 %43
%45 = load float, float* %44
%46 = fdiv float %45, %38
%47 = fpext float %46 to double
%48 = fadd double %47, -1.000000e+00
%49 = fmul double %48, %16
%50 = fdiv double %49, %12
%51 = fptrunc double %50 to float
br label %52
52: ; preds = %18, %40
%53 = phi float [ %51, %40 ], [ %8, %18 ]
%54 = getelementptr inbounds float, float* %21, i64 1
store float %53, float* %21
%55 = load float, float* %4
%56 = fadd float %55, %9
%57 = fcmp ult float %56, 1.024000e+03
br i1 %57, label %62, label %58
58: ; preds = %52, %58
%59 = phi float [ %60, %58 ], [ %56, %52 ]
%60 = fadd float %59, -1.024000e+03
%61 = fcmp ult float %60, 1.024000e+03
br i1 %61, label %62, label %58
62: ; preds = %58, %52
%63 = phi float [ %56, %52 ], [ %60, %58 ]
store float %63, float* %4
%64 = add nuw nsw i64 %20, 1
%65 = icmp eq i64 %64, %6
br i1 %65, label %66, label %18
66: ; preds = %62, %7
ret float* %5
}