#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 */
float pow(float, double);
float calculaMedia(int x, int y, int z, int operacao) {
  switch (operacao) {
  case 1:
    return pow((float)(x * y * z), (1.0 / 3.0));
  case 2:
    return (x + 2 * y + 3 * z) / 6.0;
  case 3:
    return 3 / ((1 / (float)x) + (1 / (float)y) + (1 / (float)z));
  case 4:
    return ((float)x + (float)y + (float)z) / 3;
  }
}


x86 assembly (clang, -O0):
<calculaMedia>:
push   %rbp
mov    %rsp,%rbp
sub    $0x20,%rsp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    -0x14(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,%ecx
mov    %rcx,-0x20(%rbp)
sub    $0x3,%eax
ja     121b <calculaMedia+0x10b>
mov    -0x20(%rbp),%rax
lea    0xed4(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
mov    -0x8(%rbp),%eax
imul   -0xc(%rbp),%eax
imul   -0x10(%rbp),%eax
cvtsi2ss %eax,%xmm0
movsd  0xeac(%rip),%xmm1
call   1030 <pow@plt>
movss  %xmm0,-0x4(%rbp)
jmp    121b <calculaMedia+0x10b>
mov    -0x8(%rbp),%eax
mov    -0xc(%rbp),%ecx
shl    $0x1,%ecx
add    %ecx,%eax
imul   $0x3,-0x10(%rbp),%ecx
add    %ecx,%eax
cvtsi2sd %eax,%xmm0
movsd  0xe78(%rip),%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    121b <calculaMedia+0x10b>
cvtsi2ssl -0x8(%rbp),%xmm0
movss  0xe55(%rip),%xmm1
divss  %xmm0,%xmm1
cvtsi2ssl -0xc(%rbp),%xmm2
movss  0xe44(%rip),%xmm0
divss  %xmm2,%xmm0
addss  %xmm0,%xmm1
cvtsi2ssl -0x10(%rbp),%xmm2
movss  0xe2f(%rip),%xmm0
divss  %xmm2,%xmm0
addss  %xmm0,%xmm1
movss  0xe1b(%rip),%xmm0
divss  %xmm1,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    121b <calculaMedia+0x10b>
cvtsi2ssl -0x8(%rbp),%xmm0
cvtsi2ssl -0xc(%rbp),%xmm1
addss  %xmm1,%xmm0
cvtsi2ssl -0x10(%rbp),%xmm1
addss  %xmm1,%xmm0
movss  0xdee(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
add    $0x20,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<calculaMedia>:
add    $0xffffffff,%ecx
cmp    $0x3,%ecx
ja     113f <calculaMedia+0x2f>
lea    0xf11(%rip),%rax
movslq (%rax,%rcx,4),%rcx
add    %rax,%rcx
jmp    *%rcx
imul   %edi,%esi
imul   %edx,%esi
cvtsi2ss %esi,%xmm0
movsd  0xeee(%rip),%xmm1
jmp    1030 <pow@plt>
ret
lea    (%rdi,%rsi,2),%eax
lea    (%rdx,%rdx,2),%ecx
add    %eax,%ecx
cvtsi2sd %ecx,%xmm0
divsd  0xecc(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
ret
cvtsi2ss %esi,%xmm0
movss  0xe9f(%rip),%xmm1
divss  %xmm0,%xmm1
movd   %edx,%xmm0
movd   %edi,%xmm2
punpckldq %xmm0,%xmm2
cvtdq2ps %xmm2,%xmm0
movaps 0xe91(%rip),%xmm2
divps  %xmm0,%xmm2
addss  %xmm2,%xmm1
shufps $0x55,%xmm2,%xmm2
addss  %xmm1,%xmm2
movss  0xe6a(%rip),%xmm0
divss  %xmm2,%xmm0
ret
cvtsi2ss %edi,%xmm1
cvtsi2ss %esi,%xmm2
cvtsi2ss %edx,%xmm0
addss  %xmm1,%xmm2
addss  %xmm2,%xmm0
divss  0xe49(%rip),%xmm0
ret

LLVM IR (-O0):
define float @calculaMedia(i32 %0, i32 %1, i32 %2, i32 %3) {
%5 = alloca float
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
store i32 %0, i32* %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store i32 %3, i32* %9
%10 = load i32, i32* %9
switch i32 %10, label %53 [
i32 1, label %11
i32 2, label %19
i32 3, label %30
i32 4, label %43
]
11: ; preds = %4
%12 = load i32, i32* %6
%13 = load i32, i32* %7
%14 = mul nsw i32 %12, %13
%15 = load i32, i32* %8
%16 = mul nsw i32 %14, %15
%17 = sitofp i32 %16 to float
%18 = call float @pow(float %17, double 0x3FD5555555555555)
store float %18, float* %5
br label %53
19: ; preds = %4
%20 = load i32, i32* %6
%21 = load i32, i32* %7
%22 = mul nsw i32 2, %21
%23 = add nsw i32 %20, %22
%24 = load i32, i32* %8
%25 = mul nsw i32 3, %24
%26 = add nsw i32 %23, %25
%27 = sitofp i32 %26 to double
%28 = fdiv double %27, 6.000000e+00
%29 = fptrunc double %28 to float
store float %29, float* %5
br label %53
30: ; preds = %4
%31 = load i32, i32* %6
%32 = sitofp i32 %31 to float
%33 = fdiv float 1.000000e+00, %32
%34 = load i32, i32* %7
%35 = sitofp i32 %34 to float
%36 = fdiv float 1.000000e+00, %35
%37 = fadd float %33, %36
%38 = load i32, i32* %8
%39 = sitofp i32 %38 to float
%40 = fdiv float 1.000000e+00, %39
%41 = fadd float %37, %40
%42 = fdiv float 3.000000e+00, %41
store float %42, float* %5
br label %53
43: ; preds = %4
%44 = load i32, i32* %6
%45 = sitofp i32 %44 to float
%46 = load i32, i32* %7
%47 = sitofp i32 %46 to float
%48 = fadd float %45, %47
%49 = load i32, i32* %8
%50 = sitofp i32 %49 to float
%51 = fadd float %48, %50
%52 = fdiv float %51, 3.000000e+00
store float %52, float* %5
br label %53
53: ; preds = %11, %19, %30, %43, %4
%54 = load float, float* %5
ret float %54
}

LLVM IR (-O2):
define float @calculaMedia(i32 %0, i32 %1, i32 %2, i32 %3) {
switch i32 %3, label %37 [
i32 1, label %5
i32 2, label %10
i32 3, label %18
i32 4, label %30
]
5: ; preds = %4
%6 = mul nsw i32 %1, %0
%7 = mul nsw i32 %6, %2
%8 = sitofp i32 %7 to float
%9 = tail call float @pow(float %8, double 0x3FD5555555555555)
br label %37
10: ; preds = %4
%11 = shl nsw i32 %1, 1
%12 = add nsw i32 %11, %0
%13 = mul nsw i32 %2, 3
%14 = add nsw i32 %12, %13
%15 = sitofp i32 %14 to double
%16 = fdiv double %15, 6.000000e+00
%17 = fptrunc double %16 to float
br label %37
18: ; preds = %4
%19 = sitofp i32 %1 to float
%20 = fdiv float 1.000000e+00, %19
%21 = insertelement <2 x i32> poison, i32 %0, i64 0
%22 = insertelement <2 x i32> %21, i32 %2, i64 1
%23 = sitofp <2 x i32> %22 to <2 x float>
%24 = fdiv <2 x float> <float 1.000000e+00, float 1.000000e+00>, %23
%25 = extractelement <2 x float> %24, i64 0
%26 = fadd float %25, %20
%27 = extractelement <2 x float> %24, i64 1
%28 = fadd float %26, %27
%29 = fdiv float 3.000000e+00, %28
br label %37
30: ; preds = %4
%31 = sitofp i32 %0 to float
%32 = sitofp i32 %1 to float
%33 = fadd float %31, %32
%34 = sitofp i32 %2 to float
%35 = fadd float %33, %34
%36 = fdiv float %35, 3.000000e+00
br label %37
37: ; preds = %5, %10, %18, %30, %4
%38 = phi float [ undef, %4 ], [ %36, %30 ], [ %29, %18 ], [ %17, %10 ], [ %9, %5 ]
ret float %38
}