int resampleLengthNeeded(int src_srate, int dest_srate, int dest_len,
                         double *state) {
  if (!src_srate)
    src_srate = 48000;
  if (!dest_srate)
    dest_srate = 48000;
  if (src_srate == dest_srate)
    return dest_len;
  return (int)(((double)src_srate * (double)dest_len / (double)dest_srate) +
               *state);
}


x86 assembly (clang, -O0):
<resampleLengthNeeded>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %rcx,-0x18(%rbp)
cmpl   $0x0,-0x8(%rbp)
jne    1122 <resampleLengthNeeded+0x22>
movl   $0xbb80,-0x8(%rbp)
cmpl   $0x0,-0xc(%rbp)
jne    1133 <resampleLengthNeeded+0x33>
movl   $0xbb80,-0xc(%rbp)
mov    -0x8(%rbp),%eax
cmp    -0xc(%rbp),%eax
jne    114a <resampleLengthNeeded+0x4a>
mov    -0x10(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1170 <resampleLengthNeeded+0x70>
cvtsi2sdl -0x8(%rbp),%xmm0
cvtsi2sdl -0x10(%rbp),%xmm1
mulsd  %xmm1,%xmm0
cvtsi2sdl -0xc(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x18(%rbp),%rax
addsd  (%rax),%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<resampleLengthNeeded>:
mov    %edx,%eax
test   %edi,%edi
mov    $0xbb80,%edx
cmove  %edx,%edi
test   %esi,%esi
cmove  %edx,%esi
cmp    %esi,%edi
je     1134 <resampleLengthNeeded+0x34>
cvtsi2sd %edi,%xmm0
cvtsi2sd %eax,%xmm1
mulsd  %xmm0,%xmm1
xorps  %xmm0,%xmm0
cvtsi2sd %esi,%xmm0
divsd  %xmm0,%xmm1
addsd  (%rcx),%xmm1
cvttsd2si %xmm1,%eax
ret

LLVM IR (-O0):
define i32 @resampleLengthNeeded(i32 %0, i32 %1, i32 %2, double* %3) {
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca double*
store i32 %0, i32* %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store double* %3, double** %9
%10 = load i32, i32* %6
%11 = icmp ne i32 %10, 0
br i1 %11, label %13, label %12
12: ; preds = %4
store i32 48000, i32* %6
br label %13
13: ; preds = %12, %4
%14 = load i32, i32* %7
%15 = icmp ne i32 %14, 0
br i1 %15, label %17, label %16
16: ; preds = %13
store i32 48000, i32* %7
br label %17
17: ; preds = %16, %13
%18 = load i32, i32* %6
%19 = load i32, i32* %7
%20 = icmp eq i32 %18, %19
br i1 %20, label %21, label %23
21: ; preds = %17
%22 = load i32, i32* %8
store i32 %22, i32* %5
br label %36
23: ; preds = %17
%24 = load i32, i32* %6
%25 = sitofp i32 %24 to double
%26 = load i32, i32* %8
%27 = sitofp i32 %26 to double
%28 = fmul double %25, %27
%29 = load i32, i32* %7
%30 = sitofp i32 %29 to double
%31 = fdiv double %28, %30
%32 = load double*, double** %9
%33 = load double, double* %32
%34 = fadd double %31, %33
%35 = fptosi double %34 to i32
store i32 %35, i32* %5
br label %36
36: ; preds = %23, %21
%37 = load i32, i32* %5
ret i32 %37
}

LLVM IR (-O2):
define i32 @resampleLengthNeeded(i32 %0, i32 %1, i32 %2, double* nocapture %3) {
%5 = icmp eq i32 %0, 0
%6 = select i1 %5, i32 48000, i32 %0
%7 = icmp eq i32 %1, 0
%8 = select i1 %7, i32 48000, i32 %1
%9 = icmp eq i32 %6, %8
br i1 %9, label %19, label %10
10: ; preds = %4
%11 = sitofp i32 %6 to double
%12 = sitofp i32 %2 to double
%13 = fmul double %11, %12
%14 = sitofp i32 %8 to double
%15 = fdiv double %13, %14
%16 = load double, double* %3
%17 = fadd double %15, %16
%18 = fptosi double %17 to i32
br label %19
19: ; preds = %4, %10
%20 = phi i32 [ %18, %10 ], [ %2, %4 ]
ret i32 %20
}