int calculate_pid_value(int pid, int a, int b, int c, int d) {
  switch (pid) {
  case 0x04:
    return (int)((a * 100) / 255.0);
  case 0x05:
    return a - 40;
  case 0x0C:
    return (int)(((a * 256) + b) / 4.0);
  case 0x0D:
    return a;
  case 0x11:
    return (int)((a * 100) / 255.0);
  }
}


x86 assembly (clang, -O0):
<calculate_pid_value>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8d,-0x18(%rbp)
mov    -0x8(%rbp),%eax
add    $0xfffffffc,%eax
mov    %eax,%ecx
mov    %rcx,-0x20(%rbp)
sub    $0xd,%eax
ja     11b6 <calculate_pid_value+0xb6>
mov    -0x20(%rbp),%rax
lea    0xedc(%rip),%rcx
movslq (%rcx,%rax,4),%rax
add    %rcx,%rax
jmp    *%rax
imul   $0x64,-0xc(%rbp),%eax
cvtsi2sd %eax,%xmm0
movsd  0xeb3(%rip),%xmm1
divsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x4(%rbp)
jmp    11b6 <calculate_pid_value+0xb6>
mov    -0xc(%rbp),%eax
sub    $0x28,%eax
mov    %eax,-0x4(%rbp)
jmp    11b6 <calculate_pid_value+0xb6>
mov    -0xc(%rbp),%eax
shl    $0x8,%eax
add    -0x10(%rbp),%eax
cvtsi2sd %eax,%xmm0
movsd  0xe88(%rip),%xmm1
divsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x4(%rbp)
jmp    11b6 <calculate_pid_value+0xb6>
mov    -0xc(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    11b6 <calculate_pid_value+0xb6>
imul   $0x64,-0xc(%rbp),%eax
cvtsi2sd %eax,%xmm0
movsd  0xe55(%rip),%xmm1
divsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<calculate_pid_value>:
mov    %esi,%eax
add    $0xfffffffc,%edi
cmp    $0xd,%edi
ja     1144 <calculate_pid_value+0x44>
lea    0xeff(%rip),%rcx
movslq (%rcx,%rdi,4),%rsi
add    %rcx,%rsi
jmp    *%rsi
imul   $0x64,%eax,%eax
cvtsi2sd %eax,%xmm0
divsd  0xed7(%rip),%xmm0
jmp    1140 <calculate_pid_value+0x40>
add    $0xffffffd8,%eax
ret
shl    $0x8,%eax
add    %edx,%eax
cvtsi2sd %eax,%xmm0
mulsd  0xec8(%rip),%xmm0
cvttsd2si %xmm0,%eax
ret

LLVM IR (-O0):
define i32 @calculate_pid_value(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 i32
store i32 %0, i32* %7
store i32 %1, i32* %8
store i32 %2, i32* %9
store i32 %3, i32* %10
store i32 %4, i32* %11
%12 = load i32, i32* %7
switch i32 %12, label %38 [
i32 4, label %13
i32 5, label %19
i32 12, label %22
i32 13, label %30
i32 17, label %32
]
13: ; preds = %5
%14 = load i32, i32* %8
%15 = mul nsw i32 %14, 100
%16 = sitofp i32 %15 to double
%17 = fdiv double %16, 2.550000e+02
%18 = fptosi double %17 to i32
store i32 %18, i32* %6
br label %38
19: ; preds = %5
%20 = load i32, i32* %8
%21 = sub nsw i32 %20, 40
store i32 %21, i32* %6
br label %38
22: ; preds = %5
%23 = load i32, i32* %8
%24 = mul nsw i32 %23, 256
%25 = load i32, i32* %9
%26 = add nsw i32 %24, %25
%27 = sitofp i32 %26 to double
%28 = fdiv double %27, 4.000000e+00
%29 = fptosi double %28 to i32
store i32 %29, i32* %6
br label %38
30: ; preds = %5
%31 = load i32, i32* %8
store i32 %31, i32* %6
br label %38
32: ; preds = %5
%33 = load i32, i32* %8
%34 = mul nsw i32 %33, 100
%35 = sitofp i32 %34 to double
%36 = fdiv double %35, 2.550000e+02
%37 = fptosi double %36 to i32
store i32 %37, i32* %6
br label %38
38: ; preds = %13, %19, %22, %30, %32, %5
%39 = load i32, i32* %6
ret i32 %39
}

LLVM IR (-O2):
define i32 @calculate_pid_value(i32 %0, i32 %1, i32 %2, i32 %3, i32 %4) {
switch i32 %0, label %24 [
i32 4, label %6
i32 5, label %11
i32 12, label %13
i32 17, label %19
]
6: ; preds = %5
%7 = mul nsw i32 %1, 100
%8 = sitofp i32 %7 to double
%9 = fdiv double %8, 2.550000e+02
%10 = fptosi double %9 to i32
br label %24
11: ; preds = %5
%12 = add nsw i32 %1, -40
br label %24
13: ; preds = %5
%14 = shl nsw i32 %1, 8
%15 = add nsw i32 %14, %2
%16 = sitofp i32 %15 to double
%17 = fmul double %16, 2.500000e-01
%18 = fptosi double %17 to i32
br label %24
19: ; preds = %5
%20 = mul nsw i32 %1, 100
%21 = sitofp i32 %20 to double
%22 = fdiv double %21, 2.550000e+02
%23 = fptosi double %22 to i32
br label %24
24: ; preds = %6, %11, %13, %19, %5
%25 = phi i32 [ %23, %19 ], [ %18, %13 ], [ %12, %11 ], [ %10, %6 ], [ %1, %5 ]
ret i32 %25
}