double gamln1(double a) {
  static double p0 = .577215664901533;
  static double p1 = .844203922187225;
  static double p2 = -.168860593646662;
  static double p3 = -.780427615533591;
  static double p4 = -.402055799310489;
  static double p5 = -.0673562214325671;
  static double p6 = -.00271935708322958;
  static double q1 = 2.88743195473681;
  static double q2 = 3.12755088914843;
  static double q3 = 1.56875193295039;
  static double q4 = .361951990101499;
  static double q5 = .0325038868253937;
  static double q6 = 6.67465618796164e-4;
  static double r0 = .422784335098467;
  static double r1 = .848044614534529;
  static double r2 = .565221050691933;
  static double r3 = .156513060486551;
  static double r4 = .017050248402265;
  static double r5 = 4.97958207639485e-4;
  static double s1 = 1.24313399877507;
  static double s2 = .548042109832463;
  static double s3 = .10155218743983;
  static double s4 = .00713309612391;
  static double s5 = 1.16165475989616e-4;
  double ret_val;
  double w, x;
  if (a >= .6f) {
    goto L10;
  }
  w = ((((((p6 * a + p5) * a + p4) * a + p3) * a + p2) * a + p1) * a + p0) /
      ((((((q6 * a + q5) * a + q4) * a + q3) * a + q2) * a + q1) * a + 1.0);
  ret_val = -(a)*w;
  return ret_val;
L10:
  x = a - 0.5 - 0.5;
  w = (((((r5 * x + r4) * x + r3) * x + r2) * x + r1) * x + r0) /
      (((((s5 * x + s4) * x + s3) * x + s2) * x + s1) * x + 1.0);
  ret_val = x * w;
  return ret_val;
}


x86 assembly (clang, -O0):
<gamln1>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x10(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  0xeea(%rip),%xmm1
ucomisd %xmm1,%xmm0
jb     1125 <gamln1+0x25>
jmp    126f <gamln1+0x16f>
movsd  0x2f23(%rip),%xmm0
movsd  -0x10(%rbp),%xmm2
movsd  0x2f0e(%rip),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x10(%rbp),%xmm2
movsd  0x2ef1(%rip),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x10(%rbp),%xmm2
movsd  0x2ed4(%rip),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x10(%rbp),%xmm2
movsd  0x2eb7(%rip),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x10(%rbp),%xmm2
movsd  0x2e9a(%rip),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x10(%rbp),%xmm2
movsd  0x2e7d(%rip),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0x2ecd(%rip),%xmm1
movsd  -0x10(%rbp),%xmm3
movsd  0x2eb8(%rip),%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
movsd  -0x10(%rbp),%xmm3
movsd  0x2e9b(%rip),%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
movsd  -0x10(%rbp),%xmm3
movsd  0x2e7e(%rip),%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
movsd  -0x10(%rbp),%xmm3
movsd  0x2e61(%rip),%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
movsd  -0x10(%rbp),%xmm3
movsd  0x2e44(%rip),%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
movsd  -0x10(%rbp),%xmm2
mulsd  %xmm2,%xmm1
movsd  0xddb(%rip),%xmm2
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x10(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1395 <gamln1+0x295>
movsd  -0x10(%rbp),%xmm0
movsd  0xd94(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  0xd88(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  0x2e17(%rip),%xmm0
movsd  -0x28(%rbp),%xmm2
movsd  0x2e02(%rip),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
movsd  0x2de5(%rip),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
movsd  0x2dc8(%rip),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
movsd  0x2dab(%rip),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  -0x28(%rbp),%xmm2
movsd  0x2d8e(%rip),%xmm1
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0x2dce(%rip),%xmm1
movsd  -0x28(%rbp),%xmm3
movsd  0x2db9(%rip),%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
movsd  -0x28(%rbp),%xmm3
movsd  0x2d9c(%rip),%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
movsd  -0x28(%rbp),%xmm3
movsd  0x2d7f(%rip),%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
movsd  -0x28(%rbp),%xmm3
movsd  0x2d62(%rip),%xmm2
mulsd  %xmm3,%xmm1
addsd  %xmm2,%xmm1
movsd  -0x28(%rbp),%xmm2
mulsd  %xmm2,%xmm1
movsd  0xc99(%rip),%xmm2
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x28(%rbp),%xmm0
mulsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x18(%rbp)
movsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<gamln1>:
ucomisd 0xef8(%rip),%xmm0
jae    117b <gamln1+0x7b>
movapd %xmm0,%xmm1
unpcklpd %xmm0,%xmm1
movapd 0xf56(%rip),%xmm2
mulpd  %xmm1,%xmm2
addpd  0xf5a(%rip),%xmm2
mulpd  %xmm1,%xmm2
addpd  0xf5e(%rip),%xmm2
mulpd  %xmm1,%xmm2
addpd  0xf62(%rip),%xmm2
mulpd  %xmm1,%xmm2
addpd  0xf66(%rip),%xmm2
mulpd  %xmm1,%xmm2
addpd  0xf6a(%rip),%xmm2
mulpd  %xmm1,%xmm2
addpd  0xf6e(%rip),%xmm2
movapd %xmm2,%xmm1
unpckhpd %xmm2,%xmm1
divsd  %xmm1,%xmm2
xorpd  0xf6a(%rip),%xmm0
mulsd  %xmm2,%xmm0
ret
movsd  0xe85(%rip),%xmm1
addsd  %xmm1,%xmm0
addsd  %xmm1,%xmm0
movapd %xmm0,%xmm1
unpcklpd %xmm0,%xmm1
movapd 0xe75(%rip),%xmm2
mulpd  %xmm1,%xmm2
addpd  0xe79(%rip),%xmm2
mulpd  %xmm1,%xmm2
addpd  0xe7d(%rip),%xmm2
mulpd  %xmm1,%xmm2
addpd  0xe81(%rip),%xmm2
mulpd  %xmm1,%xmm2
addpd  0xe85(%rip),%xmm2
mulpd  %xmm1,%xmm2
addpd  0xe89(%rip),%xmm2
movapd %xmm2,%xmm1
unpckhpd %xmm2,%xmm1
divsd  %xmm1,%xmm2
mulsd  %xmm2,%xmm0
ret

LLVM IR (-O0):
@gamln1.p0 = internal global double 0x3FE2788CFC6FB61A
@gamln1.p1 = internal global double 0x3FEB03B7F19E5EB3
@gamln1.p2 = internal global double 0xBFC59D3953A5D4DE
@gamln1.p3 = internal global double 0xBFE8F94355B395CA
@gamln1.p4 = internal global double 0xBFD9BB483F4D2A05
@gamln1.p5 = internal global double 0xBFB13E41E03C299D
@gamln1.p6 = internal global double 0xBF6646E7B7A2C01C
@gamln1.q1 = internal global double 0x40071975ECB828DC
@gamln1.q2 = internal global double 0x40090539668BBEEE
@gamln1.q3 = internal global double 0x3FF9199BA078F07A
@gamln1.q4 = internal global double 0x3FD72A38AE0D50C1
@gamln1.q5 = internal global double 0x3FA0A45975D0DEFB
@gamln1.q6 = internal global double 0x3F45DF1B8080E82C
@gamln1.r0 = internal global double 0x3FDB0EE6072093CC
@gamln1.r1 = internal global double 0x3FEB232E759F30F9
@gamln1.r2 = internal global double 0x3FE2164A74F7718B
@gamln1.r3 = internal global double 0x3FC4089EB617E2B8
@gamln1.r4 = internal global double 0x3F91759ECD1B09C3
@gamln1.r5 = internal global double 0x3F40512D1BB91A1E
@gamln1.s1 = internal global double 0x3FF3E3E079D48DD8
@gamln1.s2 = internal global double 0x3FE1898F9B51F5EA
@gamln1.s3 = internal global double 0x3FB9FF52FBE42E52
@gamln1.s4 = internal global double 0x3F7D3797E9248701
@gamln1.s5 = internal global double 0x3F1E73BBAE6309A9
define double @gamln1(double %0) {
%2 = alloca double
%3 = alloca double
%4 = alloca double
%5 = alloca double
%6 = alloca double
store double %0, double* %3
%7 = load double, double* %3
%8 = fcmp oge double %7, 0x3FE3333340000000
br i1 %8, label %9, label %10
9: ; preds = %1
br label %54
10: ; preds = %1
%11 = load double, double* @gamln1.p6
%12 = load double, double* %3
%13 = load double, double* @gamln1.p5
%14 = call double @llvm.fmuladd.f64(double %11, double %12, double %13)
%15 = load double, double* %3
%16 = load double, double* @gamln1.p4
%17 = call double @llvm.fmuladd.f64(double %14, double %15, double %16)
%18 = load double, double* %3
%19 = load double, double* @gamln1.p3
%20 = call double @llvm.fmuladd.f64(double %17, double %18, double %19)
%21 = load double, double* %3
%22 = load double, double* @gamln1.p2
%23 = call double @llvm.fmuladd.f64(double %20, double %21, double %22)
%24 = load double, double* %3
%25 = load double, double* @gamln1.p1
%26 = call double @llvm.fmuladd.f64(double %23, double %24, double %25)
%27 = load double, double* %3
%28 = load double, double* @gamln1.p0
%29 = call double @llvm.fmuladd.f64(double %26, double %27, double %28)
%30 = load double, double* @gamln1.q6
%31 = load double, double* %3
%32 = load double, double* @gamln1.q5
%33 = call double @llvm.fmuladd.f64(double %30, double %31, double %32)
%34 = load double, double* %3
%35 = load double, double* @gamln1.q4
%36 = call double @llvm.fmuladd.f64(double %33, double %34, double %35)
%37 = load double, double* %3
%38 = load double, double* @gamln1.q3
%39 = call double @llvm.fmuladd.f64(double %36, double %37, double %38)
%40 = load double, double* %3
%41 = load double, double* @gamln1.q2
%42 = call double @llvm.fmuladd.f64(double %39, double %40, double %41)
%43 = load double, double* %3
%44 = load double, double* @gamln1.q1
%45 = call double @llvm.fmuladd.f64(double %42, double %43, double %44)
%46 = load double, double* %3
%47 = call double @llvm.fmuladd.f64(double %45, double %46, double 1.000000e+00)
%48 = fdiv double %29, %47
store double %48, double* %5
%49 = load double, double* %3
%50 = fneg double %49
%51 = load double, double* %5
%52 = fmul double %50, %51
store double %52, double* %4
%53 = load double, double* %4
store double %53, double* %2
br label %94
54: ; preds = %9
%55 = load double, double* %3
%56 = fsub double %55, 5.000000e-01
%57 = fsub double %56, 5.000000e-01
store double %57, double* %6
%58 = load double, double* @gamln1.r5
%59 = load double, double* %6
%60 = load double, double* @gamln1.r4
%61 = call double @llvm.fmuladd.f64(double %58, double %59, double %60)
%62 = load double, double* %6
%63 = load double, double* @gamln1.r3
%64 = call double @llvm.fmuladd.f64(double %61, double %62, double %63)
%65 = load double, double* %6
%66 = load double, double* @gamln1.r2
%67 = call double @llvm.fmuladd.f64(double %64, double %65, double %66)
%68 = load double, double* %6
%69 = load double, double* @gamln1.r1
%70 = call double @llvm.fmuladd.f64(double %67, double %68, double %69)
%71 = load double, double* %6
%72 = load double, double* @gamln1.r0
%73 = call double @llvm.fmuladd.f64(double %70, double %71, double %72)
%74 = load double, double* @gamln1.s5
%75 = load double, double* %6
%76 = load double, double* @gamln1.s4
%77 = call double @llvm.fmuladd.f64(double %74, double %75, double %76)
%78 = load double, double* %6
%79 = load double, double* @gamln1.s3
%80 = call double @llvm.fmuladd.f64(double %77, double %78, double %79)
%81 = load double, double* %6
%82 = load double, double* @gamln1.s2
%83 = call double @llvm.fmuladd.f64(double %80, double %81, double %82)
%84 = load double, double* %6
%85 = load double, double* @gamln1.s1
%86 = call double @llvm.fmuladd.f64(double %83, double %84, double %85)
%87 = load double, double* %6
%88 = call double @llvm.fmuladd.f64(double %86, double %87, double 1.000000e+00)
%89 = fdiv double %73, %88
store double %89, double* %5
%90 = load double, double* %6
%91 = load double, double* %5
%92 = fmul double %90, %91
store double %92, double* %4
%93 = load double, double* %4
store double %93, double* %2
br label %94
94: ; preds = %54, %10
%95 = load double, double* %2
ret double %95
}

LLVM IR (-O2):
define double @gamln1(double %0) {
%2 = fcmp ult double %0, 0x3FE3333340000000
br i1 %2, label %3, label %17
3: ; preds = %1
%4 = insertelement <2 x double> poison, double %0, i64 0
%5 = shufflevector <2 x double> %4, <2 x double> poison, <2 x i32> zeroinitializer
%6 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %5, <2 x double> <double 0xBF6646E7B7A2C01C, double 0x3F45DF1B8080E82C>, <2 x double> <double 0xBFB13E41E03C299D, double 0x3FA0A45975D0DEFB>)
%7 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %6, <2 x double> %5, <2 x double> <double 0xBFD9BB483F4D2A05, double 0x3FD72A38AE0D50C1>)
%8 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %7, <2 x double> %5, <2 x double> <double 0xBFE8F94355B395CA, double 0x3FF9199BA078F07A>)
%9 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %8, <2 x double> %5, <2 x double> <double 0xBFC59D3953A5D4DE, double 0x40090539668BBEEE>)
%10 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %9, <2 x double> %5, <2 x double> <double 0x3FEB03B7F19E5EB3, double 0x40071975ECB828DC>)
%11 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %10, <2 x double> %5, <2 x double> <double 0x3FE2788CFC6FB61A, double 1.000000e+00>)
%12 = extractelement <2 x double> %11, i64 0
%13 = extractelement <2 x double> %11, i64 1
%14 = fdiv double %12, %13
%15 = fneg double %0
%16 = fmul double %14, %15
br label %31
17: ; preds = %1
%18 = fadd double %0, -5.000000e-01
%19 = fadd double %18, -5.000000e-01
%20 = insertelement <2 x double> poison, double %19, i64 0
%21 = shufflevector <2 x double> %20, <2 x double> poison, <2 x i32> zeroinitializer
%22 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %21, <2 x double> <double 0x3F40512D1BB91A1E, double 0x3F1E73BBAE6309A9>, <2 x double> <double 0x3F91759ECD1B09C3, double 0x3F7D3797E9248701>)
%23 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %22, <2 x double> %21, <2 x double> <double 0x3FC4089EB617E2B8, double 0x3FB9FF52FBE42E52>)
%24 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %23, <2 x double> %21, <2 x double> <double 0x3FE2164A74F7718B, double 0x3FE1898F9B51F5EA>)
%25 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %24, <2 x double> %21, <2 x double> <double 0x3FEB232E759F30F9, double 0x3FF3E3E079D48DD8>)
%26 = call <2 x double> @llvm.fmuladd.v2f64(<2 x double> %25, <2 x double> %21, <2 x double> <double 0x3FDB0EE6072093CC, double 1.000000e+00>)
%27 = extractelement <2 x double> %26, i64 0
%28 = extractelement <2 x double> %26, i64 1
%29 = fdiv double %27, %28
%30 = fmul double %19, %29
br label %31
31: ; preds = %17, %3
%32 = phi double [ %30, %17 ], [ %16, %3 ]
ret double %32
}