long double KM(long double S, long double Z) {
  long double Sum = 1.0;
  long double Nom = 1.0;
  long double Denom = 1.0;
  for (int I = 0; I < 1000; I++) {
    Nom *= Z;
    S++;
    Denom *= S;
    Sum += (Nom / Denom);
  }
  return Sum;
}


x86 assembly (clang, -O0):
<KM>:
push   %rbp
mov    %rsp,%rbp
fldt   0x20(%rbp)
fldt   0x10(%rbp)
fstpt  -0x10(%rbp)
fstpt  -0x20(%rbp)
fld1
fld    %st(0)
fstpt  -0x30(%rbp)
fld    %st(0)
fstpt  -0x40(%rbp)
fstpt  -0x50(%rbp)
movl   $0x0,-0x54(%rbp)
cmpl   $0x3e8,-0x54(%rbp)
jge    1171 <KM+0x71>
fldt   -0x20(%rbp)
fldt   -0x40(%rbp)
fmulp  %st,%st(1)
fstpt  -0x40(%rbp)
fldt   -0x10(%rbp)
fld1
faddp  %st,%st(1)
fstpt  -0x10(%rbp)
fldt   -0x10(%rbp)
fldt   -0x50(%rbp)
fmulp  %st,%st(1)
fstpt  -0x50(%rbp)
fldt   -0x40(%rbp)
fldt   -0x50(%rbp)
fdivrp %st,%st(1)
fldt   -0x30(%rbp)
faddp  %st,%st(1)
fstpt  -0x30(%rbp)
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    1126 <KM+0x26>
fldt   -0x30(%rbp)
pop    %rbp
ret

x86 assembly (clang, -O2):
<KM>:
fld1
mov    $0x3e8,%eax
fldt   0x18(%rsp)
fldt   0x8(%rsp)
fld    %st(2)
fld    %st(3)
fld    %st(4)
cs nopw 0x0(%rax,%rax,1)
nop
fxch   %st(1)
fmul   %st(4),%st
fxch   %st(3)
fadd   %st(5),%st
fmul   %st,%st(2)
fld    %st(3)
fdiv   %st(3),%st
faddp  %st,%st(2)
fxch   %st(3)
fmul   %st(4),%st
fxch   %st(3)
fadd   %st(5),%st
fmul   %st,%st(2)
fld    %st(3)
fdiv   %st(3),%st
faddp  %st,%st(2)
add    $0xfffffffe,%eax
fxch   %st(3)
fxch   %st(1)
jne    1120 <KM+0x20>
fstp   %st(5)
fstp   %st(3)
fstp   %st(1)
fstp   %st(0)
fstp   %st(0)
ret

LLVM IR (-O0):
define x86_fp80 @KM(x86_fp80 %0, x86_fp80 %1) {
%3 = alloca x86_fp80
%4 = alloca x86_fp80
%5 = alloca x86_fp80
%6 = alloca x86_fp80
%7 = alloca x86_fp80
%8 = alloca i32
store x86_fp80 %0, x86_fp80* %3
store x86_fp80 %1, x86_fp80* %4
store x86_fp80 0xK3FFF8000000000000000, x86_fp80* %5
store x86_fp80 0xK3FFF8000000000000000, x86_fp80* %6
store x86_fp80 0xK3FFF8000000000000000, x86_fp80* %7
store i32 0, i32* %8
br label %9
9: ; preds = %26, %2
%10 = load i32, i32* %8
%11 = icmp slt i32 %10, 1000
br i1 %11, label %12, label %29
12: ; preds = %9
%13 = load x86_fp80, x86_fp80* %4
%14 = load x86_fp80, x86_fp80* %6
%15 = fmul x86_fp80 %14, %13
store x86_fp80 %15, x86_fp80* %6
%16 = load x86_fp80, x86_fp80* %3
%17 = fadd x86_fp80 %16, 0xK3FFF8000000000000000
store x86_fp80 %17, x86_fp80* %3
%18 = load x86_fp80, x86_fp80* %3
%19 = load x86_fp80, x86_fp80* %7
%20 = fmul x86_fp80 %19, %18
store x86_fp80 %20, x86_fp80* %7
%21 = load x86_fp80, x86_fp80* %6
%22 = load x86_fp80, x86_fp80* %7
%23 = fdiv x86_fp80 %21, %22
%24 = load x86_fp80, x86_fp80* %5
%25 = fadd x86_fp80 %24, %23
store x86_fp80 %25, x86_fp80* %5
br label %26
26: ; preds = %12
%27 = load i32, i32* %8
%28 = add nsw i32 %27, 1
store i32 %28, i32* %8
br label %9
29: ; preds = %9
%30 = load x86_fp80, x86_fp80* %5
ret x86_fp80 %30
}

LLVM IR (-O2):
define x86_fp80 @KM(x86_fp80 %0, x86_fp80 %1) {
br label %4
3: ; preds = %4
ret x86_fp80 %19
4: ; preds = %4, %2
%5 = phi i32 [ 0, %2 ], [ %20, %4 ]
%6 = phi x86_fp80 [ 0xK3FFF8000000000000000, %2 ], [ %17, %4 ]
%7 = phi x86_fp80 [ %0, %2 ], [ %16, %4 ]
%8 = phi x86_fp80 [ 0xK3FFF8000000000000000, %2 ], [ %15, %4 ]
%9 = phi x86_fp80 [ 0xK3FFF8000000000000000, %2 ], [ %19, %4 ]
%10 = fmul x86_fp80 %8, %1
%11 = fadd x86_fp80 %7, 0xK3FFF8000000000000000
%12 = fmul x86_fp80 %6, %11
%13 = fdiv x86_fp80 %10, %12
%14 = fadd x86_fp80 %9, %13
%15 = fmul x86_fp80 %10, %1
%16 = fadd x86_fp80 %11, 0xK3FFF8000000000000000
%17 = fmul x86_fp80 %12, %16
%18 = fdiv x86_fp80 %15, %17
%19 = fadd x86_fp80 %14, %18
%20 = add nuw nsw i32 %5, 2
%21 = icmp eq i32 %20, 1000
br i1 %21, label %3, label %4
}