double percentualeSuImporto(double importoSuCuiCalcolare, double percentuale) {
  double importoPercentuale = -1;
  if (importoSuCuiCalcolare > 0) {
    if (percentuale > 0) {
      importoPercentuale = (importoSuCuiCalcolare * percentuale / 100);
      return importoPercentuale;
    } else if (percentuale == 0) {
      return 0;
    }
  } else if (importoSuCuiCalcolare == 0) {
    return 0;
  }
  return -1;
}


x86 assembly (clang, -O0):
<percentualeSuImporto>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
movsd  0xeea(%rip),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x10(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1198 <percentualeSuImporto+0x98>
movsd  -0x18(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    1169 <percentualeSuImporto+0x69>
movsd  -0x10(%rbp),%xmm0
mulsd  -0x18(%rbp),%xmm0
movsd  0xeb7(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    11cf <percentualeSuImporto+0xcf>
movsd  -0x18(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    118e <percentualeSuImporto+0x8e>
jp     118e <percentualeSuImporto+0x8e>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    11cf <percentualeSuImporto+0xcf>
jmp    1193 <percentualeSuImporto+0x93>
jmp    11c2 <percentualeSuImporto+0xc2>
movsd  -0x10(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    11bd <percentualeSuImporto+0xbd>
jp     11bd <percentualeSuImporto+0xbd>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    11cf <percentualeSuImporto+0xcf>
jmp    11c2 <percentualeSuImporto+0xc2>
movsd  0xe36(%rip),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<percentualeSuImporto>:
movapd %xmm0,%xmm2
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm2
jbe    1129 <percentualeSuImporto+0x29>
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm1
jbe    1129 <percentualeSuImporto+0x29>
mulsd  %xmm1,%xmm2
divsd  0xee4(%rip),%xmm2
movapd %xmm2,%xmm0
ret
jne    112e <percentualeSuImporto+0x2e>
jp     112e <percentualeSuImporto+0x2e>
ret
movsd  0xeca(%rip),%xmm0
ret

LLVM IR (-O0):
define double @percentualeSuImporto(double %0, double %1) {
%3 = alloca double
%4 = alloca double
%5 = alloca double
%6 = alloca double
store double %0, double* %4
store double %1, double* %5
store double -1.000000e+00, double* %6
%7 = load double, double* %4
%8 = fcmp ogt double %7, 0.000000e+00
br i1 %8, label %9, label %24
9: ; preds = %2
%10 = load double, double* %5
%11 = fcmp ogt double %10, 0.000000e+00
br i1 %11, label %12, label %18
12: ; preds = %9
%13 = load double, double* %4
%14 = load double, double* %5
%15 = fmul double %13, %14
%16 = fdiv double %15, 1.000000e+02
store double %16, double* %6
%17 = load double, double* %6
store double %17, double* %3
br label %30
18: ; preds = %9
%19 = load double, double* %5
%20 = fcmp oeq double %19, 0.000000e+00
br i1 %20, label %21, label %22
21: ; preds = %18
store double 0.000000e+00, double* %3
br label %30
22: ; preds = %18
br label %23
23: ; preds = %22
br label %29
24: ; preds = %2
%25 = load double, double* %4
%26 = fcmp oeq double %25, 0.000000e+00
br i1 %26, label %27, label %28
27: ; preds = %24
store double 0.000000e+00, double* %3
br label %30
28: ; preds = %24
br label %29
29: ; preds = %28, %23
store double -1.000000e+00, double* %3
br label %30
30: ; preds = %29, %27, %21, %12
%31 = load double, double* %3
ret double %31
}

LLVM IR (-O2):
define double @percentualeSuImporto(double %0, double %1) {
%3 = fcmp ogt double %0, 0.000000e+00
br i1 %3, label %4, label %11
4: ; preds = %2
%5 = fcmp ogt double %1, 0.000000e+00
br i1 %5, label %6, label %9
6: ; preds = %4
%7 = fmul double %0, %1
%8 = fdiv double %7, 1.000000e+02
br label %14
9: ; preds = %4
%10 = fcmp oeq double %1, 0.000000e+00
br i1 %10, label %14, label %13
11: ; preds = %2
%12 = fcmp oeq double %0, 0.000000e+00
br i1 %12, label %14, label %13
13: ; preds = %11, %9
br label %14
14: ; preds = %11, %9, %13, %6
%15 = phi double [ %8, %6 ], [ -1.000000e+00, %13 ], [ 0.000000e+00, %9 ], [ 0.000000e+00, %11 ]
ret double %15
}