float convert_temp(float t, int units_in, int units_out) {
  if (units_in == units_out)
    return (t);
  switch (units_out) {
  case 12:
    if (units_in == 14)
      return ((t - 32.0) * (5.0 / 9.0));
    else if (units_in == 13)
      return (t - 273.15);
    else
      return (t);
  case 13:
    if (units_in == 14)
      return (273.15 + (t - 32.0) * (5.0 / 9.0));
    else if (units_in == 12)
      return (t + 273.15);
    else
      return (t);
  case 14:
    if (units_in == 12)
      return (t * (9.0 / 5.0) + 32.0);
    else if (units_in == 13)
      return ((t - 273.15) * (9.0 / 5.0) + 32.0);
    else
      return (t);
  default:
    return (t);
  }
}


x86 assembly (clang, -O0):
<convert_temp>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x8(%rbp)
mov    %edi,-0xc(%rbp)
mov    %esi,-0x10(%rbp)
mov    -0xc(%rbp),%eax
cmp    -0x10(%rbp),%eax
jne    112a <convert_temp+0x2a>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    12ed <convert_temp+0x1ed>
mov    -0x10(%rbp),%eax
mov    %eax,-0x14(%rbp)
sub    $0xc,%eax
je     1160 <convert_temp+0x60>
jmp    113e <convert_temp+0x3e>
mov    -0x14(%rbp),%eax
sub    $0xd,%eax
je     11d5 <convert_temp+0xd5>
jmp    114f <convert_temp+0x4f>
mov    -0x14(%rbp),%eax
sub    $0xe,%eax
je     1256 <convert_temp+0x156>
jmp    12e3 <convert_temp+0x1e3>
cmpl   $0xe,-0xc(%rbp)
jne    1199 <convert_temp+0x99>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe8d(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  0xe91(%rip),%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    12ed <convert_temp+0x1ed>
cmpl   $0xd,-0xc(%rbp)
jne    11c6 <convert_temp+0xc6>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe5c(%rip),%xmm1
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    12ed <convert_temp+0x1ed>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    12ed <convert_temp+0x1ed>
cmpl   $0xe,-0xc(%rbp)
jne    121a <convert_temp+0x11a>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe18(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  0xe1c(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xe08(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    12ed <convert_temp+0x1ed>
cmpl   $0xc,-0xc(%rbp)
jne    1247 <convert_temp+0x147>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xddb(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    12ed <convert_temp+0x1ed>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    12ed <convert_temp+0x1ed>
cmpl   $0xc,-0xc(%rbp)
jne    128f <convert_temp+0x18f>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd8f(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xd8b(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    12ed <convert_temp+0x1ed>
cmpl   $0xd,-0xc(%rbp)
jne    12d4 <convert_temp+0x1d4>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xd66(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  0xd4a(%rip),%xmm1
mulsd  %xmm1,%xmm0
movsd  0xd46(%rip),%xmm1
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    12ed <convert_temp+0x1ed>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    12ed <convert_temp+0x1ed>
movss  -0x8(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<convert_temp>:
cmp    %esi,%edi
je     11b3 <convert_temp+0xb3>
cmp    $0xe,%esi
je     1167 <convert_temp+0x67>
cmp    $0xd,%esi
je     113f <convert_temp+0x3f>
cmp    $0xc,%esi
jne    11b3 <convert_temp+0xb3>
cmp    $0xd,%edi
je     1177 <convert_temp+0x77>
cmp    $0xe,%edi
jne    11b3 <convert_temp+0xb3>
cvtss2sd %xmm0,%xmm0
addsd  0xeeb(%rip),%xmm0
mulsd  0xeeb(%rip),%xmm0
jmp    11af <convert_temp+0xaf>
cmp    $0xc,%edi
je     1185 <convert_temp+0x85>
cmp    $0xe,%edi
jne    11b3 <convert_temp+0xb3>
cvtss2sd %xmm0,%xmm0
addsd  0xecb(%rip),%xmm0
mulsd  0xecb(%rip),%xmm0
addsd  0xeb3(%rip),%xmm0
jmp    11af <convert_temp+0xaf>
cmp    $0xd,%edi
je     1193 <convert_temp+0x93>
cmp    $0xc,%edi
jne    11b3 <convert_temp+0xb3>
cvtss2sd %xmm0,%xmm0
jmp    119f <convert_temp+0x9f>
cvtss2sd %xmm0,%xmm0
addsd  0xe7d(%rip),%xmm0
jmp    11af <convert_temp+0xaf>
cvtss2sd %xmm0,%xmm0
addsd  0xe87(%rip),%xmm0
jmp    11af <convert_temp+0xaf>
cvtss2sd %xmm0,%xmm0
addsd  0xe61(%rip),%xmm0
mulsd  0xe61(%rip),%xmm0
addsd  0xe61(%rip),%xmm0
cvtsd2ss %xmm0,%xmm0
ret

LLVM IR (-O0):
define float @convert_temp(float %0, i32 %1, i32 %2) {
%4 = alloca float
%5 = alloca float
%6 = alloca i32
%7 = alloca i32
store float %0, float* %5
store i32 %1, i32* %6
store i32 %2, i32* %7
%8 = load i32, i32* %6
%9 = load i32, i32* %7
%10 = icmp eq i32 %8, %9
br i1 %10, label %11, label %13
11: ; preds = %3
%12 = load float, float* %5
store float %12, float* %4
br label %74
13: ; preds = %3
%14 = load i32, i32* %7
switch i32 %14, label %72 [
i32 12, label %15
i32 13, label %34
i32 14, label %53
]
15: ; preds = %13
%16 = load i32, i32* %6
%17 = icmp eq i32 %16, 14
br i1 %17, label %18, label %24
18: ; preds = %15
%19 = load float, float* %5
%20 = fpext float %19 to double
%21 = fsub double %20, 3.200000e+01
%22 = fmul double %21, 0x3FE1C71C71C71C72
%23 = fptrunc double %22 to float
store float %23, float* %4
br label %74
24: ; preds = %15
%25 = load i32, i32* %6
%26 = icmp eq i32 %25, 13
br i1 %26, label %27, label %32
27: ; preds = %24
%28 = load float, float* %5
%29 = fpext float %28 to double
%30 = fsub double %29, 2.731500e+02
%31 = fptrunc double %30 to float
store float %31, float* %4
br label %74
32: ; preds = %24
%33 = load float, float* %5
store float %33, float* %4
br label %74
34: ; preds = %13
%35 = load i32, i32* %6
%36 = icmp eq i32 %35, 14
br i1 %36, label %37, label %43
37: ; preds = %34
%38 = load float, float* %5
%39 = fpext float %38 to double
%40 = fsub double %39, 3.200000e+01
%41 = call double @llvm.fmuladd.f64(double %40, double 0x3FE1C71C71C71C72, double 2.731500e+02)
%42 = fptrunc double %41 to float
store float %42, float* %4
br label %74
43: ; preds = %34
%44 = load i32, i32* %6
%45 = icmp eq i32 %44, 12
br i1 %45, label %46, label %51
46: ; preds = %43
%47 = load float, float* %5
%48 = fpext float %47 to double
%49 = fadd double %48, 2.731500e+02
%50 = fptrunc double %49 to float
store float %50, float* %4
br label %74
51: ; preds = %43
%52 = load float, float* %5
store float %52, float* %4
br label %74
53: ; preds = %13
%54 = load i32, i32* %6
%55 = icmp eq i32 %54, 12
br i1 %55, label %56, label %61
56: ; preds = %53
%57 = load float, float* %5
%58 = fpext float %57 to double
%59 = call double @llvm.fmuladd.f64(double %58, double 1.800000e+00, double 3.200000e+01)
%60 = fptrunc double %59 to float
store float %60, float* %4
br label %74
61: ; preds = %53
%62 = load i32, i32* %6
%63 = icmp eq i32 %62, 13
br i1 %63, label %64, label %70
64: ; preds = %61
%65 = load float, float* %5
%66 = fpext float %65 to double
%67 = fsub double %66, 2.731500e+02
%68 = call double @llvm.fmuladd.f64(double %67, double 1.800000e+00, double 3.200000e+01)
%69 = fptrunc double %68 to float
store float %69, float* %4
br label %74
70: ; preds = %61
%71 = load float, float* %5
store float %71, float* %4
br label %74
72: ; preds = %13
%73 = load float, float* %5
store float %73, float* %4
br label %74
74: ; preds = %72, %70, %64, %56, %51, %46, %37, %32, %27, %18, %11
%75 = load float, float* %4
ret float %75
}

LLVM IR (-O2):
define float @convert_temp(float %0, i32 %1, i32 %2) {
%4 = icmp eq i32 %1, %2
br i1 %4, label %36, label %5
5: ; preds = %3
switch i32 %2, label %36 [
i32 12, label %6
i32 13, label %16
i32 14, label %26
]
6: ; preds = %5
switch i32 %1, label %36 [
i32 14, label %7
i32 13, label %12
]
7: ; preds = %6
%8 = fpext float %0 to double
%9 = fadd double %8, -3.200000e+01
%10 = fmul double %9, 0x3FE1C71C71C71C72
%11 = fptrunc double %10 to float
br label %36
12: ; preds = %6
%13 = fpext float %0 to double
%14 = fadd double %13, -2.731500e+02
%15 = fptrunc double %14 to float
br label %36
16: ; preds = %5
switch i32 %1, label %36 [
i32 14, label %17
i32 12, label %22
]
17: ; preds = %16
%18 = fpext float %0 to double
%19 = fadd double %18, -3.200000e+01
%20 = tail call double @llvm.fmuladd.f64(double %19, double 0x3FE1C71C71C71C72, double 2.731500e+02)
%21 = fptrunc double %20 to float
br label %36
22: ; preds = %16
%23 = fpext float %0 to double
%24 = fadd double %23, 2.731500e+02
%25 = fptrunc double %24 to float
br label %36
26: ; preds = %5
switch i32 %1, label %36 [
i32 12, label %27
i32 13, label %31
]
27: ; preds = %26
%28 = fpext float %0 to double
%29 = tail call double @llvm.fmuladd.f64(double %28, double 1.800000e+00, double 3.200000e+01)
%30 = fptrunc double %29 to float
br label %36
31: ; preds = %26
%32 = fpext float %0 to double
%33 = fadd double %32, -2.731500e+02
%34 = tail call double @llvm.fmuladd.f64(double %33, double 1.800000e+00, double 3.200000e+01)
%35 = fptrunc double %34 to float
br label %36
36: ; preds = %5, %26, %16, %6, %3, %31, %27, %22, %17, %12, %7
%37 = phi float [ %30, %27 ], [ %35, %31 ], [ %21, %17 ], [ %25, %22 ], [ %11, %7 ], [ %15, %12 ], [ %0, %3 ], [ %0, %6 ], [ %0, %16 ], [ %0, %26 ], [ %0, %5 ]
ret float %37
}