double _FMUL_(const double x, const double y, const double missval1,
              const double missval2) {
  return (
      ((((x)) != ((x))) || ((0.) != (0.))
           ? ((((x)) != ((x))) && ((0.) != (0.)) ? 1 : 0)
           : !((x) < 0. || 0. < (x))) ||
              (!((y) < 0. || 0. < (y)))
          ? 0
      : ((((x)) != ((x))) || ((missval1) != (missval1))
             ? ((((x)) != ((x))) && ((missval1) != (missval1)) ? 1 : 0)
             : !((x) < missval1 || missval1 < (x))) ||
              ((((y)) != ((y))) || ((missval2) != (missval2))
                   ? ((((y)) != ((y))) && ((missval2) != (missval2)) ? 1 : 0)
                   : !((y) < missval2 || missval2 < (y)))
          ? missval1
          : (x) * (y));
}


x86 assembly (clang, -O0):
<_FMUL_>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  %xmm2,-0x18(%rbp)
movsd  %xmm3,-0x20(%rbp)
movsd  -0x8(%rbp),%xmm0
ucomisd -0x8(%rbp),%xmm0
jne    1133 <_FMUL_+0x33>
jp     1133 <_FMUL_+0x33>
jmp    117b <_FMUL_+0x7b>
movsd  -0x8(%rbp),%xmm0
ucomisd -0x8(%rbp),%xmm0
jne    114e <_FMUL_+0x4e>
jp     114e <_FMUL_+0x4e>
jmp    116c <_FMUL_+0x6c>
xor    %eax,%eax
test   $0x1,%al
jne    115d <_FMUL_+0x5d>
jmp    116c <_FMUL_+0x6c>
mov    $0x1,%al
test   $0x1,%al
jne    11bb <_FMUL_+0xbb>
jmp    119b <_FMUL_+0x9b>
xor    %eax,%eax
test   $0x1,%al
jne    11bb <_FMUL_+0xbb>
jmp    119b <_FMUL_+0x9b>
xorps  %xmm0,%xmm0
ucomisd -0x8(%rbp),%xmm0
ja     119b <_FMUL_+0x9b>
movsd  -0x8(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jbe    11bb <_FMUL_+0xbb>
xorps  %xmm0,%xmm0
ucomisd -0x10(%rbp),%xmm0
ja     11c8 <_FMUL_+0xc8>
movsd  -0x10(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
ja     11c8 <_FMUL_+0xc8>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x28(%rbp)
jmp    134a <_FMUL_+0x24a>
movsd  -0x8(%rbp),%xmm0
ucomisd -0x8(%rbp),%xmm0
jne    11f9 <_FMUL_+0xf9>
jp     11f9 <_FMUL_+0xf9>
movsd  -0x18(%rbp),%xmm0
ucomisd -0x18(%rbp),%xmm0
jne    11f9 <_FMUL_+0xf9>
jp     11f9 <_FMUL_+0xf9>
jmp    124d <_FMUL_+0x14d>
movsd  -0x8(%rbp),%xmm0
ucomisd -0x8(%rbp),%xmm0
jne    1214 <_FMUL_+0x114>
jp     1214 <_FMUL_+0x114>
jmp    123e <_FMUL_+0x13e>
movsd  -0x18(%rbp),%xmm0
ucomisd -0x18(%rbp),%xmm0
jne    122f <_FMUL_+0x12f>
jp     122f <_FMUL_+0x12f>
jmp    123e <_FMUL_+0x13e>
mov    $0x1,%al
test   $0x1,%al
jne    1322 <_FMUL_+0x222>
jmp    1275 <_FMUL_+0x175>
xor    %eax,%eax
test   $0x1,%al
jne    1322 <_FMUL_+0x222>
jmp    1275 <_FMUL_+0x175>
movsd  -0x8(%rbp),%xmm1
movsd  -0x18(%rbp),%xmm0
ucomisd %xmm1,%xmm0
ja     1275 <_FMUL_+0x175>
movsd  -0x18(%rbp),%xmm1
movsd  -0x8(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1322 <_FMUL_+0x222>
movsd  -0x10(%rbp),%xmm0
ucomisd -0x10(%rbp),%xmm0
jne    12a6 <_FMUL_+0x1a6>
jp     12a6 <_FMUL_+0x1a6>
movsd  -0x20(%rbp),%xmm0
ucomisd -0x20(%rbp),%xmm0
jne    12a6 <_FMUL_+0x1a6>
jp     12a6 <_FMUL_+0x1a6>
jmp    12fa <_FMUL_+0x1fa>
movsd  -0x10(%rbp),%xmm0
ucomisd -0x10(%rbp),%xmm0
jne    12c1 <_FMUL_+0x1c1>
jp     12c1 <_FMUL_+0x1c1>
jmp    12eb <_FMUL_+0x1eb>
movsd  -0x20(%rbp),%xmm0
ucomisd -0x20(%rbp),%xmm0
jne    12dc <_FMUL_+0x1dc>
jp     12dc <_FMUL_+0x1dc>
jmp    12eb <_FMUL_+0x1eb>
mov    $0x1,%al
test   $0x1,%al
jne    1322 <_FMUL_+0x222>
jmp    1331 <_FMUL_+0x231>
xor    %eax,%eax
test   $0x1,%al
jne    1322 <_FMUL_+0x222>
jmp    1331 <_FMUL_+0x231>
movsd  -0x10(%rbp),%xmm1
movsd  -0x20(%rbp),%xmm0
ucomisd %xmm1,%xmm0
ja     1331 <_FMUL_+0x231>
movsd  -0x20(%rbp),%xmm1
movsd  -0x10(%rbp),%xmm0
ucomisd %xmm1,%xmm0
ja     1331 <_FMUL_+0x231>
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    1340 <_FMUL_+0x240>
movsd  -0x8(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<_FMUL_>:
xorpd  %xmm4,%xmm4
ucomisd %xmm4,%xmm0
jne    110c <_FMUL_+0xc>
jnp    1132 <_FMUL_+0x32>
xorpd  %xmm5,%xmm5
ucomisd %xmm5,%xmm1
je     1132 <_FMUL_+0x32>
ucomisd %xmm2,%xmm0
jp     1137 <_FMUL_+0x37>
je     1143 <_FMUL_+0x43>
ucomisd %xmm3,%xmm1
jp     1148 <_FMUL_+0x48>
movapd %xmm2,%xmm4
je     1132 <_FMUL_+0x32>
mulsd  %xmm1,%xmm0
movapd %xmm0,%xmm4
movapd %xmm4,%xmm0
ret
ucomisd %xmm0,%xmm0
jnp    111e <_FMUL_+0x1e>
ucomisd %xmm2,%xmm2
jnp    111e <_FMUL_+0x1e>
movapd %xmm2,%xmm0
ret
ucomisd %xmm1,%xmm1
jnp    112a <_FMUL_+0x2a>
ucomisd %xmm3,%xmm3
movapd %xmm2,%xmm4
jp     1132 <_FMUL_+0x32>
jmp    112a <_FMUL_+0x2a>

LLVM IR (-O0):
define double @_FMUL_(double %0, double %1, double %2, double %3) {
%5 = alloca double
%6 = alloca double
%7 = alloca double
%8 = alloca double
store double %0, double* %5
store double %1, double* %6
store double %2, double* %7
store double %3, double* %8
%9 = load double, double* %5
%10 = load double, double* %5
%11 = fcmp une double %9, %10
br i1 %11, label %12, label %19
12: ; preds = %4
%13 = load double, double* %5
%14 = load double, double* %5
%15 = fcmp une double %13, %14
br i1 %15, label %16, label %18
16: ; preds = %12
br i1 false, label %17, label %18
17: ; preds = %16
br i1 true, label %31, label %25
18: ; preds = %16, %12
br i1 false, label %31, label %25
19: ; preds = %4
%20 = load double, double* %5
%21 = fcmp olt double %20, 0.000000e+00
br i1 %21, label %25, label %22
22: ; preds = %19
%23 = load double, double* %5
%24 = fcmp olt double 0.000000e+00, %23
br i1 %24, label %25, label %31
25: ; preds = %22, %19, %18, %17
%26 = load double, double* %6
%27 = fcmp olt double %26, 0.000000e+00
br i1 %27, label %32, label %28
28: ; preds = %25
%29 = load double, double* %6
%30 = fcmp olt double 0.000000e+00, %29
br i1 %30, label %32, label %31
31: ; preds = %28, %22, %18, %17
br label %92
32: ; preds = %28, %25
%33 = load double, double* %5
%34 = load double, double* %5
%35 = fcmp une double %33, %34
br i1 %35, label %40, label %36
36: ; preds = %32
%37 = load double, double* %7
%38 = load double, double* %7
%39 = fcmp une double %37, %38
br i1 %39, label %40, label %50
40: ; preds = %36, %32
%41 = load double, double* %5
%42 = load double, double* %5
%43 = fcmp une double %41, %42
br i1 %43, label %44, label %49
44: ; preds = %40
%45 = load double, double* %7
%46 = load double, double* %7
%47 = fcmp une double %45, %46
br i1 %47, label %48, label %49
48: ; preds = %44
br i1 true, label %84, label %58
49: ; preds = %44, %40
br i1 false, label %84, label %58
50: ; preds = %36
%51 = load double, double* %5
%52 = load double, double* %7
%53 = fcmp olt double %51, %52
br i1 %53, label %58, label %54
54: ; preds = %50
%55 = load double, double* %7
%56 = load double, double* %5
%57 = fcmp olt double %55, %56
br i1 %57, label %58, label %84
58: ; preds = %54, %50, %49, %48
%59 = load double, double* %6
%60 = load double, double* %6
%61 = fcmp une double %59, %60
br i1 %61, label %66, label %62
62: ; preds = %58
%63 = load double, double* %8
%64 = load double, double* %8
%65 = fcmp une double %63, %64
br i1 %65, label %66, label %76
66: ; preds = %62, %58
%67 = load double, double* %6
%68 = load double, double* %6
%69 = fcmp une double %67, %68
br i1 %69, label %70, label %75
70: ; preds = %66
%71 = load double, double* %8
%72 = load double, double* %8
%73 = fcmp une double %71, %72
br i1 %73, label %74, label %75
74: ; preds = %70
br i1 true, label %84, label %86
75: ; preds = %70, %66
br i1 false, label %84, label %86
76: ; preds = %62
%77 = load double, double* %6
%78 = load double, double* %8
%79 = fcmp olt double %77, %78
br i1 %79, label %86, label %80
80: ; preds = %76
%81 = load double, double* %8
%82 = load double, double* %6
%83 = fcmp olt double %81, %82
br i1 %83, label %86, label %84
84: ; preds = %80, %75, %74, %54, %49, %48
%85 = load double, double* %7
br label %90
86: ; preds = %80, %76, %75, %74
%87 = load double, double* %5
%88 = load double, double* %6
%89 = fmul double %87, %88
br label %90
90: ; preds = %86, %84
%91 = phi double [ %85, %84 ], [ %89, %86 ]
br label %92
92: ; preds = %90, %31
%93 = phi double [ 0.000000e+00, %31 ], [ %91, %90 ]
ret double %93
}

LLVM IR (-O2):
define double @_FMUL_(double %0, double %1, double %2, double %3) {
%5 = fcmp uno double %0, 0.000000e+00
%6 = xor i1 %5, true
%7 = fcmp ueq double %0, 0.000000e+00
%8 = and i1 %7, %6
%9 = fcmp ueq double %1, 0.000000e+00
%10 = or i1 %8, %9
br i1 %10, label %28, label %11
11: ; preds = %4
%12 = fcmp uno double %0, %2
br i1 %12, label %13, label %16
13: ; preds = %11
%14 = fcmp uno double %2, 0.000000e+00
%15 = and i1 %5, %14
br i1 %15, label %28, label %18
16: ; preds = %11
%17 = fcmp ueq double %0, %2
br i1 %17, label %28, label %18
18: ; preds = %13, %16
%19 = fcmp uno double %1, %3
br i1 %19, label %20, label %24
20: ; preds = %18
%21 = fcmp uno double %3, 0.000000e+00
%22 = fcmp uno double %1, 0.000000e+00
%23 = and i1 %22, %21
br i1 %23, label %28, label %26
24: ; preds = %18
%25 = fcmp ueq double %1, %3
br i1 %25, label %28, label %26
26: ; preds = %20, %24
%27 = fmul double %0, %1
br label %28
28: ; preds = %13, %16, %20, %24, %4, %26
%29 = phi double [ %27, %26 ], [ 0.000000e+00, %4 ], [ %2, %24 ], [ %2, %20 ], [ %2, %16 ], [ %2, %13 ]
ret double %29
}