#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int /*<<< orphan*/ blackman(float *, int);
int sin(double);
float setresamp(short *resampcoeffs, float freq_in, float BW) {
  int pi = 3.14159265359;
  int length = 128;
  float window[128];
  float resampgain;
  float gaintemp;
  double wp, ws, wc;
  int n;
  blackman(window, length);
  wc = pi * (float)BW / (float)freq_in;
  resampgain = 0;
  for (n = 0; n < 64; n++) {
    resampcoeffs[n] =
        (short)(2047 * window[n] * (pi / wc) * sin(wc * ((float)n - 63.5)) /
                    (pi * ((float)n - 63.5)) +
                .49999);
    resampgain = resampgain + resampcoeffs[n];
  }
  resampgain = 2 * resampgain / 4096;
  if (resampgain > 1) {
    gaintemp = resampgain;
    resampgain = 0;
    for (n = 0; n < 64; n++) {
      resampcoeffs[n] =
          (short)((1 / gaintemp) * (float)resampcoeffs[n] + 0.499999);
      resampgain = resampgain + resampcoeffs[n];
    }
    resampgain = 2 * resampgain;
    resampgain = resampgain / 4096;
  }
  return resampgain;
}


x86 assembly (clang, -O0):
<setresamp>:
push   %rbp
mov    %rsp,%rbp
sub    $0x260,%rsp
mov    %rdi,-0x8(%rbp)
movss  %xmm0,-0xc(%rbp)
movss  %xmm1,-0x10(%rbp)
movl   $0x3,-0x14(%rbp)
movl   $0x80,-0x18(%rbp)
lea    -0x220(%rbp),%rdi
mov    -0x18(%rbp),%esi
call   1030 <blackman@plt>
cvtsi2ssl -0x14(%rbp),%xmm0
mulss  -0x10(%rbp),%xmm0
divss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x240(%rbp)
ff
xorps  %xmm0,%xmm0
movss  %xmm0,-0x224(%rbp)
ff
movl   $0x0,-0x244(%rbp)
cmpl   $0x40,-0x244(%rbp)
jge    1289 <setresamp+0x169>
movslq -0x244(%rbp),%rcx
mov    %ecx,%eax
movss  -0x220(%rbp,%rcx,4),%xmm0
ff ff
movss  0xe5f(%rip),%xmm1
mulss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm1
cvtsi2sdl -0x14(%rbp),%xmm2
movsd  -0x240(%rbp),%xmm0
ff
divsd  %xmm0,%xmm2
mulsd  %xmm2,%xmm1
movsd  %xmm1,-0x258(%rbp)
ff
cvtsi2ss %eax,%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xe36(%rip),%xmm2
movsd  %xmm2,-0x250(%rbp)
ff
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
call   1040 <sin@plt>
movsd  -0x258(%rbp),%xmm0
ff
movsd  -0x250(%rbp),%xmm3
ff
cvtsi2sd %eax,%xmm1
mulsd  %xmm1,%xmm0
cvtsi2sdl -0x14(%rbp),%xmm1
cvtsi2ssl -0x244(%rbp),%xmm2
ff
cvtss2sd %xmm2,%xmm2
subsd  %xmm3,%xmm2
mulsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  0xdec(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %ax,%dx
mov    -0x8(%rbp),%rax
movslq -0x244(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
movss  -0x224(%rbp),%xmm0
ff
mov    -0x8(%rbp),%rax
movslq -0x244(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cvtsi2ss %eax,%xmm1
addss  %xmm1,%xmm0
movss  %xmm0,-0x224(%rbp)
ff
mov    -0x244(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x244(%rbp)
jmp    1186 <setresamp+0x66>
movss  0xd77(%rip),%xmm0
mulss  -0x224(%rbp),%xmm0
ff
movss  0xd63(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x224(%rbp)
ff
movss  -0x224(%rbp),%xmm0
ff
movss  0xd43(%rip),%xmm1
ucomiss %xmm1,%xmm0
jbe    13b8 <setresamp+0x298>
movss  -0x224(%rbp),%xmm0
ff
movss  %xmm0,-0x228(%rbp)
ff
xorps  %xmm0,%xmm0
movss  %xmm0,-0x224(%rbp)
ff
movl   $0x0,-0x244(%rbp)
cmpl   $0x40,-0x244(%rbp)
jge    1384 <setresamp+0x264>
movss  -0x228(%rbp),%xmm1
ff
movss  0xcf8(%rip),%xmm0
divss  %xmm1,%xmm0
mov    -0x8(%rbp),%rax
movslq -0x244(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cvtsi2ss %eax,%xmm1
mulss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xce1(%rip),%xmm1
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %ax,%dx
mov    -0x8(%rbp),%rax
movslq -0x244(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
movss  -0x224(%rbp),%xmm0
ff
mov    -0x8(%rbp),%rax
movslq -0x244(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cvtsi2ss %eax,%xmm1
addss  %xmm1,%xmm0
movss  %xmm0,-0x224(%rbp)
ff
mov    -0x244(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x244(%rbp)
jmp    12eb <setresamp+0x1cb>
movss  0xc7c(%rip),%xmm0
mulss  -0x224(%rbp),%xmm0
ff
movss  %xmm0,-0x224(%rbp)
ff
movss  -0x224(%rbp),%xmm0
ff
movss  0xc58(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x224(%rbp)
ff
movss  -0x224(%rbp),%xmm0
ff
add    $0x260,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<setresamp>:
push   %r14
push   %rbx
sub    $0x238,%rsp
movss  %xmm1,0x10(%rsp)
movss  %xmm0,0xc(%rsp)
mov    %rdi,%r14
lea    0x30(%rsp),%rdi
mov    $0x80,%esi
call   1030 <blackman@plt>
movss  0x10(%rsp),%xmm0
mulss  0xeaa(%rip),%xmm0
divss  0xc(%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xea8(%rip),%xmm1
movsd  %xmm0,0x20(%rsp)
divsd  %xmm0,%xmm1
movsd  %xmm1,0x18(%rsp)
xorps  %xmm0,%xmm0
xor    %ebx,%ebx
nopl   (%rax)
movss  %xmm0,0xc(%rsp)
movss  0x30(%rsp,%rbx,4),%xmm0
mulss  0xe70(%rip),%xmm0
xorps  %xmm1,%xmm1
cvtss2sd %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsi2ss %ebx,%xmm0
mulsd  0x18(%rsp),%xmm1
movsd  %xmm1,0x10(%rsp)
cvtss2sd %xmm0,%xmm0
addsd  0xe5e(%rip),%xmm0
movsd  %xmm0,0x28(%rsp)
mulsd  0x20(%rsp),%xmm0
call   1040 <sin@plt>
movss  0xc(%rsp),%xmm0
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
movsd  0x28(%rsp),%xmm2
mulsd  0xe2a(%rip),%xmm2
mulsd  0x10(%rsp),%xmm1
divsd  %xmm2,%xmm1
addsd  0xe28(%rip),%xmm1
cvttsd2si %xmm1,%eax
movswl %ax,%ecx
xorps  %xmm1,%xmm1
cvtsi2ss %ecx,%xmm1
mov    %ax,(%r14,%rbx,2)
addss  %xmm1,%xmm0
add    $0x1,%rbx
cmp    $0x40,%rbx
jne    1180 <setresamp+0x60>
addss  %xmm0,%xmm0
mulss  0xddf(%rip),%xmm0
ucomiss 0xddc(%rip),%xmm0
jbe    12c6 <setresamp+0x1a6>
movss  0xdce(%rip),%xmm4
divss  %xmm0,%xmm4
xorps  %xmm0,%xmm0
xor    %eax,%eax
movsd  0xdd9(%rip),%xmm1
nop
movswl (%r14,%rax,2),%ecx
xorps  %xmm2,%xmm2
cvtsi2ss %ecx,%xmm2
mulss  %xmm4,%xmm2
cvtss2sd %xmm2,%xmm2
addsd  %xmm1,%xmm2
cvttsd2si %xmm2,%ecx
movswl %cx,%edx
xorps  %xmm2,%xmm2
cvtsi2ss %edx,%xmm2
mov    %cx,(%r14,%rax,2)
addss  %xmm0,%xmm2
movswl 0x2(%r14,%rax,2),%ecx
xorps  %xmm3,%xmm3
cvtsi2ss %ecx,%xmm3
mulss  %xmm4,%xmm3
cvtss2sd %xmm3,%xmm3
addsd  %xmm1,%xmm3
cvttsd2si %xmm3,%ecx
movswl %cx,%edx
xorps  %xmm0,%xmm0
cvtsi2ss %edx,%xmm0
mov    %cx,0x2(%r14,%rax,2)
addss  %xmm2,%xmm0
add    $0x2,%rax
cmp    $0x40,%rax
jne    1250 <setresamp+0x130>
addss  %xmm0,%xmm0
mulss  0xd42(%rip),%xmm0
add    $0x238,%rsp
pop    %rbx
pop    %r14
ret

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

LLVM IR (-O2):
define float @setresamp(i16* nocapture %0, float %1, float %2) {
%4 = alloca [128 x float]
%5 = bitcast [128 x float]* %4 to i8*
%6 = getelementptr inbounds [128 x float], [128 x float]* %4, i64 0, i64 0
%7 = call i32 @blackman(float* %6, i32 128)
%8 = fmul float %2, 3.000000e+00
%9 = fdiv float %8, %1
%10 = fpext float %9 to double
%11 = fdiv double 3.000000e+00, %10
br label %12
12: ; preds = %3, %12
%13 = phi i64 [ 0, %3 ], [ %35, %12 ]
%14 = phi float [ 0.000000e+00, %3 ], [ %34, %12 ]
%15 = getelementptr inbounds [128 x float], [128 x float]* %4, i64 0, i64 %13
%16 = load float, float* %15
%17 = fmul float %16, 2.047000e+03
%18 = fpext float %17 to double
%19 = fmul double %11, %18
%20 = trunc i64 %13 to i32
%21 = sitofp i32 %20 to float
%22 = fpext float %21 to double
%23 = fadd double %22, -6.350000e+01
%24 = fmul double %23, %10
%25 = call i32 @sin(double %24)
%26 = sitofp i32 %25 to double
%27 = fmul double %19, %26
%28 = fmul double %23, 3.000000e+00
%29 = fdiv double %27, %28
%30 = fadd double %29, 4.999900e-01
%31 = fptosi double %30 to i16
%32 = getelementptr inbounds i16, i16* %0, i64 %13
store i16 %31, i16* %32
%33 = sitofp i16 %31 to float
%34 = fadd float %14, %33
%35 = add nuw nsw i64 %13, 1
%36 = icmp eq i64 %35, 64
br i1 %36, label %37, label %12
37: ; preds = %12
%38 = fmul float %34, 2.000000e+00
%39 = fmul float %38, 0x3F30000000000000
%40 = fcmp ogt float %39, 1.000000e+00
br i1 %40, label %41, label %70
41: ; preds = %37
%42 = fdiv float 1.000000e+00, %39
br label %43
43: ; preds = %43, %41
%44 = phi i64 [ 0, %41 ], [ %65, %43 ]
%45 = phi float [ 0.000000e+00, %41 ], [ %64, %43 ]
%46 = getelementptr inbounds i16, i16* %0, i64 %44
%47 = load i16, i16* %46
%48 = sitofp i16 %47 to float
%49 = fmul float %42, %48
%50 = fpext float %49 to double
%51 = fadd double %50, 4.999990e-01
%52 = fptosi double %51 to i16
store i16 %52, i16* %46
%53 = sitofp i16 %52 to float
%54 = fadd float %45, %53
%55 = or i64 %44, 1
%56 = getelementptr inbounds i16, i16* %0, i64 %55
%57 = load i16, i16* %56
%58 = sitofp i16 %57 to float
%59 = fmul float %42, %58
%60 = fpext float %59 to double
%61 = fadd double %60, 4.999990e-01
%62 = fptosi double %61 to i16
store i16 %62, i16* %56
%63 = sitofp i16 %62 to float
%64 = fadd float %54, %63
%65 = add nuw nsw i64 %44, 2
%66 = icmp eq i64 %65, 64
br i1 %66, label %67, label %43
67: ; preds = %43
%68 = fmul float %64, 2.000000e+00
%69 = fmul float %68, 0x3F30000000000000
br label %70
70: ; preds = %67, %37
%71 = phi float [ %69, %67 ], [ %39, %37 ]
ret float %71
}