#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 pow(double, double);
int tc_core_time2tick(double);
unsigned tc_cbq_calc_maxidle(unsigned bndw, unsigned rate, unsigned avpkt,
                             int ewma_log, unsigned maxburst) {
  double maxidle;
  double g = 1.0 - 1.0 / (1 << ewma_log);
  double xmt = (double)avpkt / bndw;
  maxidle = xmt * (1 - g);
  if (bndw != rate && maxburst) {
    double vxmt = (double)avpkt / rate - xmt;
    vxmt *= (pow(g, -(double)maxburst) - 1);
    if (vxmt > maxidle)
      maxidle = vxmt;
  }
  return tc_core_time2tick(maxidle * (1 << ewma_log) * 1000000);
}


x86 assembly (clang, -O0):
<tc_cbq_calc_maxidle>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %edx,-0xc(%rbp)
mov    %ecx,-0x10(%rbp)
mov    %r8d,-0x14(%rbp)
mov    -0x10(%rbp),%cl
mov    $0x1,%eax
shl    %cl,%eax
cvtsi2sd %eax,%xmm2
movsd  0xeb2(%rip),%xmm0
movaps %xmm0,%xmm1
divsd  %xmm2,%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0xc(%rbp),%eax
cvtsi2sd %rax,%xmm0
mov    -0x4(%rbp),%eax
cvtsi2sd %rax,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  0xe7c(%rip),%xmm1
subsd  -0x28(%rbp),%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x4(%rbp),%eax
cmp    -0x8(%rbp),%eax
je     1223 <tc_cbq_calc_maxidle+0x103>
cmpl   $0x0,-0x14(%rbp)
je     1223 <tc_cbq_calc_maxidle+0x103>
mov    -0xc(%rbp),%eax
cvtsi2sd %rax,%xmm0
mov    -0x8(%rbp),%eax
cvtsi2sd %rax,%xmm1
divsd  %xmm1,%xmm0
movsd  -0x30(%rbp),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x28(%rbp),%xmm0
mov    -0x14(%rbp),%eax
cvtsi2sd %rax,%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
call   1030 <pow@plt>
sub    $0x1,%eax
cvtsi2sd %eax,%xmm0
mulsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm0
ucomisd -0x20(%rbp),%xmm0
jbe    121e <tc_cbq_calc_maxidle+0xfe>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
jmp    1223 <tc_cbq_calc_maxidle+0x103>
movsd  -0x20(%rbp),%xmm0
mov    -0x10(%rbp),%ecx
mov    $0x1,%eax
shl    %cl,%eax
cvtsi2sd %eax,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xdc6(%rip),%xmm1
mulsd  %xmm1,%xmm0
call   1040 <tc_core_time2tick@plt>
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<tc_cbq_calc_maxidle>:
sub    $0x18,%rsp
mov    $0x1,%eax
shl    %cl,%eax
cvtsi2sd %eax,%xmm4
movsd  0xec9(%rip),%xmm3
movapd %xmm3,%xmm1
divsd  %xmm4,%xmm1
movapd %xmm3,%xmm0
mov    %edx,%eax
cvtsi2sd %rax,%xmm5
subsd  %xmm1,%xmm0
mov    %edi,%eax
cvtsi2sd %rax,%xmm2
movapd %xmm5,%xmm1
divsd  %xmm2,%xmm1
subsd  %xmm0,%xmm3
mulsd  %xmm1,%xmm3
cmp    %esi,%edi
je     11c4 <tc_cbq_calc_maxidle+0xa4>
test   %r8d,%r8d
je     11c4 <tc_cbq_calc_maxidle+0xa4>
mov    %esi,%eax
xorps  %xmm2,%xmm2
cvtsi2sd %rax,%xmm2
divsd  %xmm2,%xmm5
subsd  %xmm1,%xmm5
movsd  %xmm5,(%rsp)
mov    %r8d,%eax
xorps  %xmm1,%xmm1
cvtsi2sd %rax,%xmm1
xorpd  0xe78(%rip),%xmm1
movsd  %xmm3,0x8(%rsp)
movsd  %xmm4,0x10(%rsp)
call   1030 <pow@plt>
movsd  0x10(%rsp),%xmm4
add    $0xffffffff,%eax
xorps  %xmm3,%xmm3
cvtsi2sd %eax,%xmm3
mulsd  (%rsp),%xmm3
maxsd  0x8(%rsp),%xmm3
mulsd  %xmm4,%xmm3
mulsd  0xe38(%rip),%xmm3
movapd %xmm3,%xmm0
add    $0x18,%rsp
jmp    1040 <tc_core_time2tick@plt>

LLVM IR (-O0):
define i32 @tc_cbq_calc_maxidle(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4) {
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca double
%12 = alloca double
%13 = alloca double
%14 = alloca double
store i32 %0, i32* %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store i32 %3, i32* %9
store i32 %4, i32* %10
%15 = load i32, i32* %9
%16 = shl i32 1, %15
%17 = sitofp i32 %16 to double
%18 = fdiv double 1.000000e+00, %17
%19 = fsub double 1.000000e+00, %18
store double %19, double* %12
%20 = load i32, i32* %8
%21 = uitofp i32 %20 to double
%22 = load i32, i32* %6
%23 = uitofp i32 %22 to double
%24 = fdiv double %21, %23
store double %24, double* %13
%25 = load double, double* %13
%26 = load double, double* %12
%27 = fsub double 1.000000e+00, %26
%28 = fmul double %25, %27
store double %28, double* %11
%29 = load i32, i32* %6
%30 = load i32, i32* %7
%31 = icmp ne i32 %29, %30
br i1 %31, label %32, label %58
32: ; preds = %5
%33 = load i32, i32* %10
%34 = icmp ne i32 %33, 0
br i1 %34, label %35, label %58
35: ; preds = %32
%36 = load i32, i32* %8
%37 = uitofp i32 %36 to double
%38 = load i32, i32* %7
%39 = uitofp i32 %38 to double
%40 = fdiv double %37, %39
%41 = load double, double* %13
%42 = fsub double %40, %41
store double %42, double* %14
%43 = load double, double* %12
%44 = load i32, i32* %10
%45 = uitofp i32 %44 to double
%46 = fneg double %45
%47 = call i32 @pow(double %43, double %46)
%48 = sub nsw i32 %47, 1
%49 = sitofp i32 %48 to double
%50 = load double, double* %14
%51 = fmul double %50, %49
store double %51, double* %14
%52 = load double, double* %14
%53 = load double, double* %11
%54 = fcmp ogt double %52, %53
br i1 %54, label %55, label %57
55: ; preds = %35
%56 = load double, double* %14
store double %56, double* %11
br label %57
57: ; preds = %55, %35
br label %58
58: ; preds = %57, %32, %5
%59 = load double, double* %11
%60 = load i32, i32* %9
%61 = shl i32 1, %60
%62 = sitofp i32 %61 to double
%63 = fmul double %59, %62
%64 = fmul double %63, 1.000000e+06
%65 = call i32 @tc_core_time2tick(double %64)
ret i32 %65
}

LLVM IR (-O2):
define i32 @tc_cbq_calc_maxidle(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4) {
%6 = shl nuw i32 1, %3
%7 = sitofp i32 %6 to double
%8 = fdiv double 1.000000e+00, %7
%9 = fsub double 1.000000e+00, %8
%10 = uitofp i32 %2 to double
%11 = uitofp i32 %0 to double
%12 = fdiv double %10, %11
%13 = fsub double 1.000000e+00, %9
%14 = fmul double %12, %13
%15 = icmp ne i32 %0, %1
%16 = icmp ne i32 %4, 0
%17 = and i1 %15, %16
br i1 %17, label %18, label %30
18: ; preds = %5
%19 = uitofp i32 %1 to double
%20 = fdiv double %10, %19
%21 = fsub double %20, %12
%22 = uitofp i32 %4 to double
%23 = fneg double %22
%24 = tail call i32 @pow(double %9, double %23)
%25 = add nsw i32 %24, -1
%26 = sitofp i32 %25 to double
%27 = fmul double %21, %26
%28 = fcmp ogt double %27, %14
%29 = select i1 %28, double %27, double %14
br label %30
30: ; preds = %18, %5
%31 = phi double [ %29, %18 ], [ %14, %5 ]
%32 = fmul double %31, %7
%33 = fmul double %32, 1.000000e+06
%34 = tail call i32 @tc_core_time2tick(double %33)
ret i32 %34
}