float buzz(amp, si, hn, f, phs)
float amp, si, hn, *f, *phs;
{
  int j, k;
  float q, d, h2n, h2np1;
  j = *phs;
  k = (j + 1) % 1024;
  h2n = 2. * hn;
  h2np1 = h2n + 1.;
  q = (int)((*phs - (float)j) * h2np1) / h2np1;
  d = *(f + j);
  d += (*(f + k) - d) * q;
  if (!d)
    q = amp;
  else {
    k = (long)(h2np1 * *phs) % 1024;
    q = amp * (*(f + k) / d - 1.) / h2n;
  }
  *phs += si;
  while (*phs >= 1024.)
    *phs -= 1024.;
  return (q);
}


x86 assembly (clang, -O0):
<buzz>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm2,-0x40(%rbp)
movaps %xmm0,%xmm2
movsd  -0x40(%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    -0x20(%rbp),%rax
cvttss2si (%rax),%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    $0x400,%ecx
cltd
idiv   %ecx
mov    %edx,-0x28(%rbp)
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xea7(%rip),%xmm0
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x34(%rbp)
movss  -0x34(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe81(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x38(%rbp)
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
cvtsi2ssl -0x24(%rbp),%xmm1
subss  %xmm1,%xmm0
mulss  -0x38(%rbp),%xmm0
cvttss2si %xmm0,%eax
cvtsi2ss %eax,%xmm0
divss  -0x38(%rbp),%xmm0
movss  %xmm0,-0x2c(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x30(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x28(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
subss  -0x30(%rbp),%xmm0
movss  -0x2c(%rbp),%xmm2
movss  -0x30(%rbp),%xmm1
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x30(%rbp)
movss  -0x30(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomiss %xmm1,%xmm0
jne    1215 <buzz+0x115>
jp     1215 <buzz+0x115>
movss  -0x4(%rbp),%xmm0
movss  %xmm0,-0x2c(%rbp)
jmp    127b <buzz+0x17b>
movss  -0x38(%rbp),%xmm0
mov    -0x20(%rbp),%rax
mulss  (%rax),%xmm0
cvttss2si %xmm0,%rax
mov    $0x400,%ecx
cqto
idiv   %rcx
mov    %edx,%eax
mov    %eax,-0x28(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
mov    -0x18(%rbp),%rax
movslq -0x28(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
divss  -0x30(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xda3(%rip),%xmm2
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movss  -0x34(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x2c(%rbp)
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  0xd70(%rip),%xmm1
ucomisd %xmm1,%xmm0
jb     12cf <buzz+0x1cf>
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd52(%rip),%xmm1
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,(%rax)
jmp    128c <buzz+0x18c>
movss  -0x2c(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<buzz>:
cvtsd2ss %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm3
cvtsd2ss %xmm2,%xmm2
movss  (%rsi),%xmm1
cvttss2si %xmm1,%eax
lea    0x1(%rax),%ecx
lea    0x400(%rax),%edx
test   %ecx,%ecx
cmovns %ecx,%edx
and    $0xfffffc00,%edx
neg    %edx
lea    (%rax,%rdx,1),%ecx
add    $0x1,%ecx
addss  %xmm2,%xmm2
movss  0xec4(%rip),%xmm4
addss  %xmm2,%xmm4
cvttps2dq %xmm1,%xmm5
cvtdq2ps %xmm5,%xmm5
movaps %xmm1,%xmm6
subss  %xmm5,%xmm6
mulss  %xmm4,%xmm6
cvttps2dq %xmm6,%xmm5
cvtdq2ps %xmm5,%xmm6
divss  %xmm4,%xmm6
cltq
movss  (%rdi,%rax,4),%xmm7
movslq %ecx,%rax
movss  (%rdi,%rax,4),%xmm5
subss  %xmm7,%xmm5
mulss  %xmm6,%xmm5
addss  %xmm7,%xmm5
xorps  %xmm6,%xmm6
ucomiss %xmm6,%xmm5
jne    1182 <buzz+0x82>
jnp    11d5 <buzz+0xd5>
cvtss2sd %xmm2,%xmm2
mulss  %xmm1,%xmm4
cvttss2si %xmm4,%rax
lea    0x3ff(%rax),%rcx
test   %rax,%rax
cmovns %rax,%rcx
movabs $0x3ffffffffffffc00,%rdx
ff ff 3f
and    %rcx,%rdx
sub    %rdx,%rax
cvtss2sd %xmm0,%xmm0
movss  (%rdi,%rax,4),%xmm4
divss  %xmm5,%xmm4
cvtss2sd %xmm4,%xmm4
addsd  0xe4a(%rip),%xmm4
mulsd  %xmm0,%xmm4
divsd  %xmm2,%xmm4
xorps  %xmm0,%xmm0
cvtsd2ss %xmm4,%xmm0
addss  %xmm3,%xmm1
ucomiss 0xe24(%rip),%xmm1
jb     1209 <buzz+0x109>
movss  0xe1e(%rip),%xmm2
movss  0xe12(%rip),%xmm3
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
addss  %xmm2,%xmm1
ucomiss %xmm3,%xmm1
jae    1200 <buzz+0x100>
movss  %xmm1,(%rsi)
ret

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

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