float media(float notas[3], char type) {
  if (type == 'p' || type == 'P') {
    return (notas[0] * 5 + notas[1] * 3 + notas[2] * 2) / 3;
  } else if (type == 'a' || type == 'A') {
    return (notas[0] + notas[1] + notas[2]) / 3;
  }
  return 1;
}


x86 assembly (clang, -O0):
<media>:
push   %rbp
mov    %rsp,%rbp
mov    %sil,%al
mov    %rdi,-0x10(%rbp)
mov    %al,-0x11(%rbp)
movsbl -0x11(%rbp),%eax
cmp    $0x70,%eax
je     1128 <media+0x28>
movsbl -0x11(%rbp),%eax
cmp    $0x50,%eax
jne    1178 <media+0x78>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm1
mov    -0x10(%rbp),%rax
movss  0xec8(%rip),%xmm0
mulss  0x4(%rax),%xmm0
movss  0xebf(%rip),%xmm2
mulss  %xmm2,%xmm1
addss  %xmm0,%xmm1
mov    -0x10(%rbp),%rax
movss  0x8(%rax),%xmm0
addss  %xmm0,%xmm0
addss  %xmm1,%xmm0
movss  0xe9a(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    11d4 <media+0xd4>
movsbl -0x11(%rbp),%eax
cmp    $0x61,%eax
je     1192 <media+0x92>
movsbl -0x11(%rbp),%eax
cmp    $0x41,%eax
jne    11c2 <media+0xc2>
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x10(%rbp),%rax
addss  0x4(%rax),%xmm0
mov    -0x10(%rbp),%rax
addss  0x8(%rax),%xmm0
movss  0xe50(%rip),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    11d4 <media+0xd4>
jmp    11c7 <media+0xc7>
movss  0xe31(%rip),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<media>:
and    $0xdf,%sil
cmp    $0x41,%sil
je     1143 <media+0x43>
cmp    $0x50,%sil
jne    115a <media+0x5a>
movss  0xeec(%rip),%xmm1
movss  0x4(%rdi),%xmm2
mulss  %xmm1,%xmm2
movss  (%rdi),%xmm3
movss  0x8(%rdi),%xmm0
mulss  0xed6(%rip),%xmm3
addss  %xmm2,%xmm3
addss  %xmm0,%xmm0
addss  %xmm3,%xmm0
divss  %xmm1,%xmm0
ret
movss  (%rdi),%xmm0
addss  0x4(%rdi),%xmm0
addss  0x8(%rdi),%xmm0
divss  0xeab(%rip),%xmm0
ret
movss  0xe9e(%rip),%xmm0
ret

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

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