void DEVqmeyer(vgs, vgd, von, vdsat, capgs, capgd, capgb, phi, cox) double vgs;
double vgd;
double von;
double vdsat;
double *capgs;
double *capgd;
double *capgb;
double phi;
double cox;
{
  double vds;
  double vddif;
  double vddif1;
  double vddif2;
  double vgst;
  vgst = vgs - von;
  if (vgst <= -phi) {
    *capgb = cox / 2;
    *capgs = 0;
    *capgd = 0;
  } else if (vgst <= -phi / 2) {
    *capgb = -vgst * cox / (2 * phi);
    *capgs = 0;
    *capgd = 0;
  } else if (vgst <= 0) {
    *capgb = -vgst * cox / (2 * phi);
    *capgs = vgst * cox / (1.5 * phi) + cox / 3;
    *capgd = 0;
  } else {
    vds = vgs - vgd;
    if (vdsat <= vds) {
      *capgs = cox / 3;
      *capgd = 0;
      *capgb = 0;
    } else {
      vddif = 2.0 * vdsat - vds;
      vddif1 = vdsat - vds;
      vddif2 = vddif * vddif;
      *capgd = cox * (1.0 - vdsat * vdsat / vddif2) / 3;
      *capgs = cox * (1.0 - vddif1 * vddif1 / vddif2) / 3;
      *capgb = 0;
    }
  }
}


x86 assembly (clang, -O0):
<DEVqmeyer>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x8(%rbp)
movsd  %xmm1,-0x10(%rbp)
movsd  %xmm2,-0x18(%rbp)
movsd  %xmm3,-0x20(%rbp)
mov    %rdi,-0x28(%rbp)
mov    %rsi,-0x30(%rbp)
mov    %rdx,-0x38(%rbp)
movsd  %xmm4,-0x40(%rbp)
movsd  %xmm5,-0x48(%rbp)
movsd  -0x8(%rbp),%xmm0
subsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x70(%rbp),%xmm1
movsd  -0x40(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
ucomisd %xmm1,%xmm0
jb     119c <DEVqmeyer+0x9c>
movsd  -0x48(%rbp),%xmm0
movsd  0xe8b(%rip),%xmm1
divsd  %xmm1,%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x28(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
mov    -0x30(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
jmp    13e5 <DEVqmeyer+0x2e5>
movsd  -0x70(%rbp),%xmm1
movsd  -0x40(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  0xe3b(%rip),%xmm2
divsd  %xmm2,%xmm0
ucomisd %xmm1,%xmm0
jb     1228 <DEVqmeyer+0x128>
movsd  -0x70(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  -0x48(%rbp),%xmm0
movsd  0xe04(%rip),%xmm1
mulsd  -0x40(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x28(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
mov    -0x30(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
jmp    13e0 <DEVqmeyer+0x2e0>
xorps  %xmm0,%xmm0
ucomisd -0x70(%rbp),%xmm0
jb     12b8 <DEVqmeyer+0x1b8>
movsd  -0x70(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  -0x48(%rbp),%xmm0
movsd  0xda1(%rip),%xmm1
mulsd  -0x40(%rbp),%xmm1
divsd  %xmm1,%xmm0
mov    -0x38(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x70(%rbp),%xmm0
mulsd  -0x48(%rbp),%xmm0
movsd  0xd96(%rip),%xmm1
mulsd  -0x40(%rbp),%xmm1
divsd  %xmm1,%xmm0
movsd  -0x48(%rbp),%xmm1
movsd  0xd70(%rip),%xmm2
divsd  %xmm2,%xmm1
addsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x30(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
jmp    13db <DEVqmeyer+0x2db>
movsd  -0x8(%rbp),%xmm0
subsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x50(%rbp)
movsd  -0x20(%rbp),%xmm1
movsd  -0x50(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jb     130f <DEVqmeyer+0x20f>
movsd  -0x48(%rbp),%xmm0
movsd  0xd20(%rip),%xmm1
divsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x30(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
mov    -0x38(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
jmp    13d6 <DEVqmeyer+0x2d6>
movsd  -0x20(%rbp),%xmm0
movsd  -0x50(%rbp),%xmm1
movq   %xmm1,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm1
addsd  %xmm0,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x58(%rbp)
movsd  -0x20(%rbp),%xmm0
subsd  -0x50(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x58(%rbp),%xmm0
mulsd  -0x58(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x48(%rbp),%xmm0
movsd  -0x20(%rbp),%xmm2
mulsd  -0x20(%rbp),%xmm2
divsd  -0x68(%rbp),%xmm2
movsd  0xc99(%rip),%xmm1
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xc81(%rip),%xmm1
divsd  %xmm1,%xmm0
mov    -0x30(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x48(%rbp),%xmm0
movsd  -0x60(%rbp),%xmm2
mulsd  -0x60(%rbp),%xmm2
divsd  -0x68(%rbp),%xmm2
movsd  0xc61(%rip),%xmm1
subsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  0xc49(%rip),%xmm1
divsd  %xmm1,%xmm0
mov    -0x28(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x38(%rbp),%rax
xorps  %xmm0,%xmm0
movsd  %xmm0,(%rax)
jmp    13db <DEVqmeyer+0x2db>
jmp    13e0 <DEVqmeyer+0x2e0>
jmp    13e5 <DEVqmeyer+0x2e5>
pop    %rbp
ret

x86 assembly (clang, -O2):
<DEVqmeyer>:
movapd %xmm0,%xmm6
subsd  %xmm2,%xmm6
movapd 0xef0(%rip),%xmm2
xorpd  %xmm4,%xmm2
ucomisd %xmm6,%xmm2
jae    11b4 <DEVqmeyer+0xb4>
movsd  0xef2(%rip),%xmm2
mulsd  %xmm4,%xmm2
ucomisd %xmm6,%xmm2
jae    11c2 <DEVqmeyer+0xc2>
xorpd  %xmm2,%xmm2
ucomisd %xmm6,%xmm2
jae    11e9 <DEVqmeyer+0xe9>
subsd  %xmm1,%xmm0
ucomisd %xmm3,%xmm0
jae    1231 <DEVqmeyer+0x131>
movapd %xmm3,%xmm1
addsd  %xmm3,%xmm1
subsd  %xmm0,%xmm1
movapd %xmm3,%xmm2
subsd  %xmm0,%xmm2
mulsd  %xmm1,%xmm1
mulsd  %xmm3,%xmm3
divsd  %xmm1,%xmm3
movsd  0xeb8(%rip),%xmm0
movapd %xmm0,%xmm4
subsd  %xmm3,%xmm4
mulsd  %xmm5,%xmm4
movsd  0xe9c(%rip),%xmm3
divsd  %xmm3,%xmm4
movsd  %xmm4,(%rsi)
mulsd  %xmm2,%xmm2
divsd  %xmm1,%xmm2
subsd  %xmm2,%xmm0
mulsd  %xmm5,%xmm0
divsd  %xmm3,%xmm0
movsd  %xmm0,(%rdi)
movq   $0x0,(%rdx)
ret
mulsd  0xe54(%rip),%xmm5
movsd  %xmm5,(%rdx)
jmp    11da <DEVqmeyer+0xda>
xorpd  0xe36(%rip),%xmm6
mulsd  %xmm5,%xmm6
addsd  %xmm4,%xmm4
divsd  %xmm4,%xmm6
movsd  %xmm6,(%rdx)
movq   $0x0,(%rdi)
movq   $0x0,(%rsi)
ret
movapd 0xe0f(%rip),%xmm0
xorpd  %xmm6,%xmm0
mulsd  %xmm5,%xmm0
movapd %xmm4,%xmm1
addsd  %xmm4,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,(%rdx)
mulsd  %xmm5,%xmm6
mulsd  0xe0b(%rip),%xmm4
divsd  %xmm4,%xmm6
divsd  0xe07(%rip),%xmm5
addsd  %xmm6,%xmm5
movsd  %xmm5,(%rdi)
movq   $0x0,(%rsi)
ret
divsd  0xdef(%rip),%xmm5
movsd  %xmm5,(%rdi)
movq   $0x0,(%rsi)
movq   $0x0,(%rdx)
ret

LLVM IR (-O0):
define void @DEVqmeyer(double %0, double %1, double %2, double %3, double* %4, double* %5, double* %6, double %7, double %8) {
%10 = alloca double
%11 = alloca double
%12 = alloca double
%13 = alloca double
%14 = alloca double*
%15 = alloca double*
%16 = alloca double*
%17 = alloca double
%18 = alloca double
%19 = alloca double
%20 = alloca double
%21 = alloca double
%22 = alloca double
%23 = alloca double
store double %0, double* %10
store double %1, double* %11
store double %2, double* %12
store double %3, double* %13
store double* %4, double** %14
store double* %5, double** %15
store double* %6, double** %16
store double %7, double* %17
store double %8, double* %18
%24 = load double, double* %10
%25 = load double, double* %12
%26 = fsub double %24, %25
store double %26, double* %23
%27 = load double, double* %23
%28 = load double, double* %17
%29 = fneg double %28
%30 = fcmp ole double %27, %29
br i1 %30, label %31, label %37
31: ; preds = %9
%32 = load double, double* %18
%33 = fdiv double %32, 2.000000e+00
%34 = load double*, double** %16
store double %33, double* %34
%35 = load double*, double** %14
store double 0.000000e+00, double* %35
%36 = load double*, double** %15
store double 0.000000e+00, double* %36
br label %125
37: ; preds = %9
%38 = load double, double* %23
%39 = load double, double* %17
%40 = fneg double %39
%41 = fdiv double %40, 2.000000e+00
%42 = fcmp ole double %38, %41
br i1 %42, label %43, label %54
43: ; preds = %37
%44 = load double, double* %23
%45 = fneg double %44
%46 = load double, double* %18
%47 = fmul double %45, %46
%48 = load double, double* %17
%49 = fmul double 2.000000e+00, %48
%50 = fdiv double %47, %49
%51 = load double*, double** %16
store double %50, double* %51
%52 = load double*, double** %14
store double 0.000000e+00, double* %52
%53 = load double*, double** %15
store double 0.000000e+00, double* %53
br label %124
54: ; preds = %37
%55 = load double, double* %23
%56 = fcmp ole double %55, 0.000000e+00
br i1 %56, label %57, label %77
57: ; preds = %54
%58 = load double, double* %23
%59 = fneg double %58
%60 = load double, double* %18
%61 = fmul double %59, %60
%62 = load double, double* %17
%63 = fmul double 2.000000e+00, %62
%64 = fdiv double %61, %63
%65 = load double*, double** %16
store double %64, double* %65
%66 = load double, double* %23
%67 = load double, double* %18
%68 = fmul double %66, %67
%69 = load double, double* %17
%70 = fmul double 1.500000e+00, %69
%71 = fdiv double %68, %70
%72 = load double, double* %18
%73 = fdiv double %72, 3.000000e+00
%74 = fadd double %71, %73
%75 = load double*, double** %14
store double %74, double* %75
%76 = load double*, double** %15
store double 0.000000e+00, double* %76
br label %123
77: ; preds = %54
%78 = load double, double* %10
%79 = load double, double* %11
%80 = fsub double %78, %79
store double %80, double* %19
%81 = load double, double* %13
%82 = load double, double* %19
%83 = fcmp ole double %81, %82
br i1 %83, label %84, label %90
84: ; preds = %77
%85 = load double, double* %18
%86 = fdiv double %85, 3.000000e+00
%87 = load double*, double** %14
store double %86, double* %87
%88 = load double*, double** %15
store double 0.000000e+00, double* %88
%89 = load double*, double** %16
store double 0.000000e+00, double* %89
br label %122
90: ; preds = %77
%91 = load double, double* %13
%92 = load double, double* %19
%93 = fneg double %92
%94 = call double @llvm.fmuladd.f64(double 2.000000e+00, double %91, double %93)
store double %94, double* %20
%95 = load double, double* %13
%96 = load double, double* %19
%97 = fsub double %95, %96
store double %97, double* %21
%98 = load double, double* %20
%99 = load double, double* %20
%100 = fmul double %98, %99
store double %100, double* %22
%101 = load double, double* %18
%102 = load double, double* %13
%103 = load double, double* %13
%104 = fmul double %102, %103
%105 = load double, double* %22
%106 = fdiv double %104, %105
%107 = fsub double 1.000000e+00, %106
%108 = fmul double %101, %107
%109 = fdiv double %108, 3.000000e+00
%110 = load double*, double** %15
store double %109, double* %110
%111 = load double, double* %18
%112 = load double, double* %21
%113 = load double, double* %21
%114 = fmul double %112, %113
%115 = load double, double* %22
%116 = fdiv double %114, %115
%117 = fsub double 1.000000e+00, %116
%118 = fmul double %111, %117
%119 = fdiv double %118, 3.000000e+00
%120 = load double*, double** %14
store double %119, double* %120
%121 = load double*, double** %16
store double 0.000000e+00, double* %121
br label %122
122: ; preds = %90, %84
br label %123
123: ; preds = %122, %57
br label %124
124: ; preds = %123, %43
br label %125
125: ; preds = %124, %31
ret void
}

LLVM IR (-O2):
define void @DEVqmeyer(double %0, double %1, double %2, double %3, double* nocapture writeonly %4, double* nocapture writeonly %5, double* nocapture writeonly %6, double %7, double %8) {
%10 = fsub double %0, %2
%11 = fneg double %7
%12 = fcmp ugt double %10, %11
br i1 %12, label %15, label %13
13: ; preds = %9
%14 = fmul double %8, 5.000000e-01
store double %14, double* %6
store double 0.000000e+00, double* %4
br label %55
15: ; preds = %9
%16 = fmul double %7, -5.000000e-01
%17 = fcmp ugt double %10, %16
br i1 %17, label %23, label %18
18: ; preds = %15
%19 = fneg double %10
%20 = fmul double %19, %8
%21 = fmul double %7, 2.000000e+00
%22 = fdiv double %20, %21
store double %22, double* %6
store double 0.000000e+00, double* %4
br label %55
23: ; preds = %15
%24 = fcmp ugt double %10, 0.000000e+00
br i1 %24, label %35, label %25
25: ; preds = %23
%26 = fneg double %10
%27 = fmul double %26, %8
%28 = fmul double %7, 2.000000e+00
%29 = fdiv double %27, %28
store double %29, double* %6
%30 = fmul double %10, %8
%31 = fmul double %7, 1.500000e+00
%32 = fdiv double %30, %31
%33 = fdiv double %8, 3.000000e+00
%34 = fadd double %33, %32
store double %34, double* %4
br label %55
35: ; preds = %23
%36 = fsub double %0, %1
%37 = fcmp ult double %36, %3
br i1 %37, label %40, label %38
38: ; preds = %35
%39 = fdiv double %8, 3.000000e+00
store double %39, double* %4
store double 0.000000e+00, double* %5
br label %55
40: ; preds = %35
%41 = fneg double %36
%42 = tail call double @llvm.fmuladd.f64(double %3, double 2.000000e+00, double %41)
%43 = fsub double %3, %36
%44 = fmul double %42, %42
%45 = fmul double %3, %3
%46 = fdiv double %45, %44
%47 = fsub double 1.000000e+00, %46
%48 = fmul double %47, %8
%49 = fdiv double %48, 3.000000e+00
store double %49, double* %5
%50 = fmul double %43, %43
%51 = fdiv double %50, %44
%52 = fsub double 1.000000e+00, %51
%53 = fmul double %52, %8
%54 = fdiv double %53, 3.000000e+00
store double %54, double* %4
br label %55
55: ; preds = %18, %38, %40, %25, %13
%56 = phi double* [ %5, %18 ], [ %6, %38 ], [ %6, %40 ], [ %5, %25 ], [ %5, %13 ]
store double 0.000000e+00, double* %56
ret void
}