float gammapow(float x, float y) {
  register float tmp, t, t2, r;
  int i;
  if (x == 0.0)
    return y == 0.0 ? 1.0 : 0.0;
  t = (x - 1.0) / (x + 1.0);
  t2 = t * t;
  tmp = r = t;
  for (i = 3; i < 20; i += 2) {
    r *= t2;
    tmp += r / i;
  }
  tmp = -y * 2.0 * tmp;
  r = t = tmp;
  tmp = 1.0 + t;
  for (i = 2; i < 16; i++) {
    r = r * t / i;
    tmp += r;
  }
  return 1.0 / tmp;
}


x86 assembly (clang, -O0):
<gammapow>:
push   %rbp
mov    %rsp,%rbp
movss  %xmm0,-0x8(%rbp)
movss  %xmm1,-0xc(%rbp)
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1160 <gammapow+0x60>
jp     1160 <gammapow+0x60>
movss  -0xc(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xec5(%rip),%xmm3
xorps  %xmm2,%xmm2
cmpeqsd %xmm2,%xmm0
movaps %xmm0,%xmm1
andpd  %xmm3,%xmm1
andnpd %xmm2,%xmm0
orpd   %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    12c4 <gammapow+0x1c4>
movss  -0x8(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe8f(%rip),%xmm1
subsd  %xmm1,%xmm0
movss  -0x8(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movsd  0xe7a(%rip),%xmm2
addsd  %xmm2,%xmm1
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x14(%rbp)
movss  -0x14(%rbp),%xmm0
mulss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0x14(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  %xmm0,-0x10(%rbp)
movl   $0x3,-0x20(%rbp)
cmpl   $0x14,-0x20(%rbp)
jge    11fb <gammapow+0xfb>
movss  -0x18(%rbp),%xmm0
mulss  -0x1c(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x1c(%rbp),%xmm0
cvtsi2ssl -0x20(%rbp),%xmm1
divss  %xmm1,%xmm0
addss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
mov    -0x20(%rbp),%eax
add    $0x2,%eax
mov    %eax,-0x20(%rbp)
jmp    11bc <gammapow+0xbc>
movss  -0xc(%rbp),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xdef(%rip),%xmm1
mulsd  %xmm1,%xmm0
movss  -0x10(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
mulsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x10(%rbp)
movss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x14(%rbp)
movss  %xmm0,-0x1c(%rbp)
movss  -0x14(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xdad(%rip),%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x10(%rbp)
movl   $0x2,-0x20(%rbp)
cmpl   $0x10,-0x20(%rbp)
jge    12a6 <gammapow+0x1a6>
movss  -0x1c(%rbp),%xmm0
mulss  -0x14(%rbp),%xmm0
cvtsi2ssl -0x20(%rbp),%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x1c(%rbp),%xmm0
addss  -0x10(%rbp),%xmm0
movss  %xmm0,-0x10(%rbp)
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1267 <gammapow+0x167>
movss  -0x10(%rbp),%xmm0
cvtss2sd %xmm0,%xmm1
movsd  0xd49(%rip),%xmm0
divsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<gammapow>:
xorps  %xmm2,%xmm2
ucomiss %xmm2,%xmm0
jne    111b <gammapow+0x1b>
jp     111b <gammapow+0x1b>
cmpeqss %xmm2,%xmm1
movss  0xf05(%rip),%xmm0
andps  %xmm1,%xmm0
ret
cvtss2sd %xmm0,%xmm0
movsd  0xed9(%rip),%xmm2
addsd  %xmm0,%xmm2
addsd  0xed5(%rip),%xmm0
divsd  %xmm0,%xmm2
xorps  %xmm0,%xmm0
cvtsd2ss %xmm2,%xmm0
movaps %xmm0,%xmm2
mulss  %xmm0,%xmm2
movaps %xmm2,%xmm4
mulss  %xmm0,%xmm4
movss  0xebc(%rip),%xmm6
movaps %xmm2,%xmm7
mulss  %xmm4,%xmm7
divss  %xmm6,%xmm4
addss  %xmm0,%xmm4
movss  0xea9(%rip),%xmm3
movaps %xmm2,%xmm0
mulss  %xmm7,%xmm0
divss  %xmm3,%xmm7
addss  %xmm4,%xmm7
movss  0xe95(%rip),%xmm8
movaps %xmm2,%xmm4
mulss  %xmm0,%xmm4
divss  %xmm8,%xmm0
movaps %xmm2,%xmm5
mulss  %xmm4,%xmm5
unpcklps %xmm5,%xmm4
divps  0xeb0(%rip),%xmm4
addss  %xmm7,%xmm0
addss  %xmm4,%xmm0
shufps $0x55,%xmm4,%xmm4
mulss  %xmm2,%xmm5
movaps %xmm2,%xmm7
mulss  %xmm5,%xmm7
unpcklps %xmm7,%xmm5
divps  0xe9f(%rip),%xmm5
addss  %xmm0,%xmm4
addss  %xmm5,%xmm4
shufps $0x55,%xmm5,%xmm5
mulss  %xmm2,%xmm7
mulss  %xmm7,%xmm2
unpcklps %xmm2,%xmm7
divps  0xe91(%rip),%xmm7
addss  %xmm4,%xmm5
addss  %xmm7,%xmm5
shufps $0x55,%xmm7,%xmm7
addss  %xmm5,%xmm7
xorps  0xe8a(%rip),%xmm1
xorps  %xmm0,%xmm0
cvtss2sd %xmm1,%xmm0
addsd  %xmm0,%xmm0
xorps  %xmm1,%xmm1
cvtss2sd %xmm7,%xmm1
mulsd  %xmm0,%xmm1
xorps  %xmm5,%xmm5
cvtsd2ss %xmm1,%xmm5
movss  0xe01(%rip),%xmm0
movaps %xmm5,%xmm4
movaps %xmm5,%xmm1
mulss  %xmm5,%xmm1
mulss  0xdf3(%rip),%xmm1
addss  %xmm0,%xmm4
addss  %xmm1,%xmm4
mulss  %xmm5,%xmm1
divss  %xmm6,%xmm1
addss  %xmm1,%xmm4
mulss  %xmm5,%xmm1
mulss  0xdd7(%rip),%xmm1
addss  %xmm1,%xmm4
mulss  %xmm5,%xmm1
divss  %xmm3,%xmm1
addss  %xmm1,%xmm4
mulss  %xmm5,%xmm1
divss  0xdbf(%rip),%xmm1
addss  %xmm1,%xmm4
mulss  %xmm5,%xmm1
divss  %xmm8,%xmm1
addss  %xmm1,%xmm4
mulss  %xmm5,%xmm1
mulss  0xda6(%rip),%xmm1
addss  %xmm1,%xmm4
mulss  %xmm5,%xmm1
divss  0xd9a(%rip),%xmm1
addss  %xmm1,%xmm4
mulss  %xmm5,%xmm1
divss  0xd8e(%rip),%xmm1
addss  %xmm1,%xmm4
mulss  %xmm5,%xmm1
divss  0xd82(%rip),%xmm1
addss  %xmm1,%xmm4
mulss  %xmm5,%xmm1
divss  0xd76(%rip),%xmm1
addss  %xmm1,%xmm4
mulss  %xmm5,%xmm1
divss  0xd6a(%rip),%xmm1
addss  %xmm1,%xmm4
mulss  %xmm5,%xmm1
divss  0xd5e(%rip),%xmm1
addss  %xmm1,%xmm4
mulss  %xmm5,%xmm1
divss  0xd52(%rip),%xmm1
addss  %xmm4,%xmm1
divss  %xmm1,%xmm0
ret

LLVM IR (-O0):
define float @gammapow(float %0, float %1) {
%3 = alloca float
%4 = alloca float
%5 = alloca float
%6 = alloca float
%7 = alloca float
%8 = alloca float
%9 = alloca float
%10 = alloca i32
store float %0, float* %4
store float %1, float* %5
%11 = load float, float* %4
%12 = fpext float %11 to double
%13 = fcmp oeq double %12, 0.000000e+00
br i1 %13, label %14, label %21
14: ; preds = %2
%15 = load float, float* %5
%16 = fpext float %15 to double
%17 = fcmp oeq double %16, 0.000000e+00
%18 = zext i1 %17 to i64
%19 = select i1 %17, double 1.000000e+00, double 0.000000e+00
%20 = fptrunc double %19 to float
store float %20, float* %3
br label %85
21: ; preds = %2
%22 = load float, float* %4
%23 = fpext float %22 to double
%24 = fsub double %23, 1.000000e+00
%25 = load float, float* %4
%26 = fpext float %25 to double
%27 = fadd double %26, 1.000000e+00
%28 = fdiv double %24, %27
%29 = fptrunc double %28 to float
store float %29, float* %7
%30 = load float, float* %7
%31 = load float, float* %7
%32 = fmul float %30, %31
store float %32, float* %8
%33 = load float, float* %7
store float %33, float* %9
store float %33, float* %6
store i32 3, i32* %10
br label %34
34: ; preds = %47, %21
%35 = load i32, i32* %10
%36 = icmp slt i32 %35, 20
br i1 %36, label %37, label %50
37: ; preds = %34
%38 = load float, float* %8
%39 = load float, float* %9
%40 = fmul float %39, %38
store float %40, float* %9
%41 = load float, float* %9
%42 = load i32, i32* %10
%43 = sitofp i32 %42 to float
%44 = fdiv float %41, %43
%45 = load float, float* %6
%46 = fadd float %45, %44
store float %46, float* %6
br label %47
47: ; preds = %37
%48 = load i32, i32* %10
%49 = add nsw i32 %48, 2
store i32 %49, i32* %10
br label %34
50: ; preds = %34
%51 = load float, float* %5
%52 = fneg float %51
%53 = fpext float %52 to double
%54 = fmul double %53, 2.000000e+00
%55 = load float, float* %6
%56 = fpext float %55 to double
%57 = fmul double %54, %56
%58 = fptrunc double %57 to float
store float %58, float* %6
%59 = load float, float* %6
store float %59, float* %7
store float %59, float* %9
%60 = load float, float* %7
%61 = fpext float %60 to double
%62 = fadd double 1.000000e+00, %61
%63 = fptrunc double %62 to float
store float %63, float* %6
store i32 2, i32* %10
br label %64
64: ; preds = %77, %50
%65 = load i32, i32* %10
%66 = icmp slt i32 %65, 16
br i1 %66, label %67, label %80
67: ; preds = %64
%68 = load float, float* %9
%69 = load float, float* %7
%70 = fmul float %68, %69
%71 = load i32, i32* %10
%72 = sitofp i32 %71 to float
%73 = fdiv float %70, %72
store float %73, float* %9
%74 = load float, float* %9
%75 = load float, float* %6
%76 = fadd float %75, %74
store float %76, float* %6
br label %77
77: ; preds = %67
%78 = load i32, i32* %10
%79 = add nsw i32 %78, 1
store i32 %79, i32* %10
br label %64
80: ; preds = %64
%81 = load float, float* %6
%82 = fpext float %81 to double
%83 = fdiv double 1.000000e+00, %82
%84 = fptrunc double %83 to float
store float %84, float* %3
br label %85
85: ; preds = %80, %14
%86 = load float, float* %3
ret float %86
}

LLVM IR (-O2):
define float @gammapow(float %0, float %1) {
%3 = fpext float %0 to double
%4 = fcmp oeq float %0, 0.000000e+00
br i1 %4, label %5, label %8
5: ; preds = %2
%6 = fcmp oeq float %1, 0.000000e+00
%7 = select i1 %6, float 1.000000e+00, float 0.000000e+00
br label %100
8: ; preds = %2
%9 = fadd double %3, -1.000000e+00
%10 = fadd double %3, 1.000000e+00
%11 = fdiv double %9, %10
%12 = fptrunc double %11 to float
%13 = fmul float %12, %12
%14 = fmul float %13, %12
%15 = fdiv float %14, 3.000000e+00
%16 = fadd float %15, %12
%17 = fmul float %13, %14
%18 = fdiv float %17, 5.000000e+00
%19 = fadd float %16, %18
%20 = fmul float %13, %17
%21 = fdiv float %20, 7.000000e+00
%22 = fadd float %19, %21
%23 = fmul float %13, %20
%24 = fmul float %13, %23
%25 = insertelement <2 x float> poison, float %23, i64 0
%26 = insertelement <2 x float> %25, float %24, i64 1
%27 = fdiv <2 x float> %26, <float 9.000000e+00, float 1.100000e+01>
%28 = extractelement <2 x float> %27, i64 0
%29 = fadd float %22, %28
%30 = extractelement <2 x float> %27, i64 1
%31 = fadd float %29, %30
%32 = fmul float %13, %24
%33 = fmul float %13, %32
%34 = insertelement <2 x float> poison, float %32, i64 0
%35 = insertelement <2 x float> %34, float %33, i64 1
%36 = fdiv <2 x float> %35, <float 1.300000e+01, float 1.500000e+01>
%37 = extractelement <2 x float> %36, i64 0
%38 = fadd float %31, %37
%39 = extractelement <2 x float> %36, i64 1
%40 = fadd float %38, %39
%41 = fmul float %13, %33
%42 = fmul float %13, %41
%43 = insertelement <2 x float> poison, float %41, i64 0
%44 = insertelement <2 x float> %43, float %42, i64 1
%45 = fdiv <2 x float> %44, <float 1.700000e+01, float 1.900000e+01>
%46 = extractelement <2 x float> %45, i64 0
%47 = fadd float %40, %46
%48 = extractelement <2 x float> %45, i64 1
%49 = fadd float %47, %48
%50 = fneg float %1
%51 = fpext float %50 to double
%52 = fmul double %51, 2.000000e+00
%53 = fpext float %49 to double
%54 = fmul double %52, %53
%55 = fptrunc double %54 to float
%56 = fadd float %55, 1.000000e+00
%57 = fmul float %55, %55
%58 = fmul float %57, 5.000000e-01
%59 = fadd float %56, %58
%60 = fmul float %58, %55
%61 = fdiv float %60, 3.000000e+00
%62 = fadd float %59, %61
%63 = fmul float %61, %55
%64 = fmul float %63, 2.500000e-01
%65 = fadd float %62, %64
%66 = fmul float %64, %55
%67 = fdiv float %66, 5.000000e+00
%68 = fadd float %65, %67
%69 = fmul float %67, %55
%70 = fdiv float %69, 6.000000e+00
%71 = fadd float %68, %70
%72 = fmul float %70, %55
%73 = fdiv float %72, 7.000000e+00
%74 = fadd float %71, %73
%75 = fmul float %73, %55
%76 = fmul float %75, 1.250000e-01
%77 = fadd float %74, %76
%78 = fmul float %76, %55
%79 = fdiv float %78, 9.000000e+00
%80 = fadd float %77, %79
%81 = fmul float %79, %55
%82 = fdiv float %81, 1.000000e+01
%83 = fadd float %80, %82
%84 = fmul float %82, %55
%85 = fdiv float %84, 1.100000e+01
%86 = fadd float %83, %85
%87 = fmul float %85, %55
%88 = fdiv float %87, 1.200000e+01
%89 = fadd float %86, %88
%90 = fmul float %88, %55
%91 = fdiv float %90, 1.300000e+01
%92 = fadd float %89, %91
%93 = fmul float %91, %55
%94 = fdiv float %93, 1.400000e+01
%95 = fadd float %92, %94
%96 = fmul float %94, %55
%97 = fdiv float %96, 1.500000e+01
%98 = fadd float %95, %97
%99 = fdiv float 1.000000e+00, %98
br label %100
100: ; preds = %8, %5
%101 = phi float [ %7, %5 ], [ %99, %8 ]
ret float %101
}