float media(float not1, float not2, float not3, char med) {
  float mfinal;
  if (med == 'a' || med == 'A') {
    mfinal = (not1 + not2 + not3) / 3;
  }
  if (med == 'p' || med == 'P') {
    mfinal = ((not1 * 5) + (not2 * 3) + (not3 * 2)) / (5 + 3 + 2);
  }
  if (med == 'h' || med == 'H') {
    mfinal = 3 / ((1 / not1) + (1 / not2) + (1 / not3));
  }
  return (mfinal);
}


x86 assembly (clang, -O0):
<media>:
push   %rbp
mov    %rsp,%rbp
mov    %dil,%al
movss  %xmm0,-0x4(%rbp)
movss  %xmm1,-0x8(%rbp)
movss  %xmm2,-0xc(%rbp)
mov    %al,-0xd(%rbp)
movsbl -0xd(%rbp),%eax
cmp    $0x61,%eax
je     1133 <media+0x33>
movsbl -0xd(%rbp),%eax
cmp    $0x41,%eax
jne    1153 <media+0x53>
movss  -0x4(%rbp),%xmm0
addss  -0x8(%rbp),%xmm0
addss  -0xc(%rbp),%xmm0
movss  0xeb6(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x14(%rbp)
movsbl -0xd(%rbp),%eax
cmp    $0x70,%eax
je     116d <media+0x6d>
movsbl -0xd(%rbp),%eax
cmp    $0x50,%eax
jne    11ad <media+0xad>
movss  -0x4(%rbp),%xmm1
movss  0xe86(%rip),%xmm0
mulss  -0x8(%rbp),%xmm0
movss  0xe81(%rip),%xmm2
mulss  %xmm2,%xmm1
addss  %xmm0,%xmm1
movss  -0xc(%rbp),%xmm0
addss  %xmm0,%xmm0
addss  %xmm1,%xmm0
movss  0xe60(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x14(%rbp)
movsbl -0xd(%rbp),%eax
cmp    $0x68,%eax
je     11c7 <media+0xc7>
movsbl -0xd(%rbp),%eax
cmp    $0x48,%eax
jne    1207 <media+0x107>
movss  0xe3d(%rip),%xmm1
divss  -0x4(%rbp),%xmm1
movss  0xe30(%rip),%xmm0
divss  -0x8(%rbp),%xmm0
addss  %xmm0,%xmm1
movss  0xe1f(%rip),%xmm0
divss  -0xc(%rbp),%xmm0
addss  %xmm0,%xmm1
movss  0xe02(%rip),%xmm0
divss  %xmm1,%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x14(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<media>:
and    $0xdf,%dil
cmp    $0x50,%dil
je     1127 <media+0x27>
cmp    $0x48,%dil
je     114f <media+0x4f>
cmp    $0x41,%dil
jne    1180 <media+0x80>
addss  %xmm1,%xmm0
addss  %xmm2,%xmm0
divss  0xede(%rip),%xmm0
ret
mulss  0xed5(%rip),%xmm1
mulss  0xed1(%rip),%xmm0
addss  %xmm1,%xmm0
addss  %xmm2,%xmm2
addss  %xmm0,%xmm2
divss  0xec1(%rip),%xmm2
movaps %xmm2,%xmm0
ret
movss  0xea9(%rip),%xmm3
divss  %xmm1,%xmm3
unpcklps %xmm2,%xmm0
movaps 0xeab(%rip),%xmm1
divps  %xmm0,%xmm1
addss  %xmm1,%xmm3
shufps $0x55,%xmm1,%xmm1
addss  %xmm3,%xmm1
movss  0xe88(%rip),%xmm0
divss  %xmm1,%xmm0
ret

LLVM IR (-O0):
define float @media(float %0, float %1, float %2, i8 signext %3) {
%5 = alloca float
%6 = alloca float
%7 = alloca float
%8 = alloca i8
%9 = alloca float
store float %0, float* %5
store float %1, float* %6
store float %2, float* %7
store i8 %3, i8* %8
%10 = load i8, i8* %8
%11 = sext i8 %10 to i32
%12 = icmp eq i32 %11, 97
br i1 %12, label %17, label %13
13: ; preds = %4
%14 = load i8, i8* %8
%15 = sext i8 %14 to i32
%16 = icmp eq i32 %15, 65
br i1 %16, label %17, label %24
17: ; preds = %13, %4
%18 = load float, float* %5
%19 = load float, float* %6
%20 = fadd float %18, %19
%21 = load float, float* %7
%22 = fadd float %20, %21
%23 = fdiv float %22, 3.000000e+00
store float %23, float* %9
br label %24
24: ; preds = %17, %13
%25 = load i8, i8* %8
%26 = sext i8 %25 to i32
%27 = icmp eq i32 %26, 112
br i1 %27, label %32, label %28
28: ; preds = %24
%29 = load i8, i8* %8
%30 = sext i8 %29 to i32
%31 = icmp eq i32 %30, 80
br i1 %31, label %32, label %40
32: ; preds = %28, %24
%33 = load float, float* %5
%34 = load float, float* %6
%35 = fmul float %34, 3.000000e+00
%36 = call float @llvm.fmuladd.f32(float %33, float 5.000000e+00, float %35)
%37 = load float, float* %7
%38 = call float @llvm.fmuladd.f32(float %37, float 2.000000e+00, float %36)
%39 = fdiv float %38, 1.000000e+01
store float %39, float* %9
br label %40
40: ; preds = %32, %28
%41 = load i8, i8* %8
%42 = sext i8 %41 to i32
%43 = icmp eq i32 %42, 104
br i1 %43, label %48, label %44
44: ; preds = %40
%45 = load i8, i8* %8
%46 = sext i8 %45 to i32
%47 = icmp eq i32 %46, 72
br i1 %47, label %48, label %58
48: ; preds = %44, %40
%49 = load float, float* %5
%50 = fdiv float 1.000000e+00, %49
%51 = load float, float* %6
%52 = fdiv float 1.000000e+00, %51
%53 = fadd float %50, %52
%54 = load float, float* %7
%55 = fdiv float 1.000000e+00, %54
%56 = fadd float %53, %55
%57 = fdiv float 3.000000e+00, %56
store float %57, float* %9
br label %58
58: ; preds = %48, %44
%59 = load float, float* %9
ret float %59
}

LLVM IR (-O2):
define float @media(float %0, float %1, float %2, i8 signext %3) {
%5 = and i8 %3, -33
switch i8 %5, label %25 [
i8 65, label %6
i8 80, label %10
i8 72, label %15
]
6: ; preds = %4
%7 = fadd float %0, %1
%8 = fadd float %7, %2
%9 = fdiv float %8, 3.000000e+00
br label %25
10: ; preds = %4
%11 = fmul float %1, 3.000000e+00
%12 = tail call float @llvm.fmuladd.f32(float %0, float 5.000000e+00, float %11)
%13 = tail call float @llvm.fmuladd.f32(float %2, float 2.000000e+00, float %12)
%14 = fdiv float %13, 1.000000e+01
br label %25
15: ; preds = %4
%16 = fdiv float 1.000000e+00, %1
%17 = insertelement <2 x float> poison, float %0, i64 0
%18 = insertelement <2 x float> %17, float %2, i64 1
%19 = fdiv <2 x float> <float 1.000000e+00, float 1.000000e+00>, %18
%20 = extractelement <2 x float> %19, i64 0
%21 = fadd float %20, %16
%22 = extractelement <2 x float> %19, i64 1
%23 = fadd float %21, %22
%24 = fdiv float 3.000000e+00, %23
br label %25
25: ; preds = %4, %10, %6, %15
%26 = phi float [ %24, %15 ], [ %9, %6 ], [ %14, %10 ], [ undef, %4 ]
ret float %26
}