#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
double INFINITY;
double NAN;
double taylor_log(double x, unsigned int n) {
  if (x == 0)
    return -INFINITY;
  if (x == INFINITY)
    return INFINITY;
  if (x < 0)
    return NAN;
  if (x == 1)
    return 0;
  double vysledok;
  if (x >= 1) {
    double stary_vysledok;
    vysledok = 0;
    double pom = ((x - 1) / x);
    for (unsigned int i = 1; i <= n; i++) {
      stary_vysledok = vysledok;
      vysledok += (pom / i);
      pom *= ((x - 1) / x);
      if (vysledok == stary_vysledok)
        break;
    }
  } else {
    double stary_vysledok;
    vysledok = -(1 - x);
    double pom = 1 - x;
    for (unsigned int i = 2; i <= n; i++) {
      pom *= (1 - x);
      stary_vysledok = vysledok;
      vysledok -= pom / i;
      if (vysledok == stary_vysledok)
        break;
    }
  }
  return vysledok;
}


x86 assembly (clang, -O0):
<taylor_log>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x10(%rbp)
mov    %edi,-0x14(%rbp)
movsd  -0x10(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1150 <taylor_log+0x50>
jp     1150 <taylor_log+0x50>
mov    0x2eb5(%rip),%rax
movsd  (%rax),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1366 <taylor_log+0x266>
movsd  -0x10(%rbp),%xmm0
mov    0x2e84(%rip),%rax
ucomisd (%rax),%xmm0
jne    1181 <taylor_log+0x81>
jp     1181 <taylor_log+0x81>
mov    0x2e6d(%rip),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1366 <taylor_log+0x266>
xorps  %xmm0,%xmm0
ucomisd -0x10(%rbp),%xmm0
jbe    11a4 <taylor_log+0xa4>
mov    0x2e62(%rip),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1366 <taylor_log+0x266>
movsd  -0x10(%rbp),%xmm0
movsd  0xe4f(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    11ce <taylor_log+0xce>
jp     11ce <taylor_log+0xce>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    1366 <taylor_log+0x266>
movsd  -0x10(%rbp),%xmm0
movsd  0xe25(%rip),%xmm1
ucomisd %xmm1,%xmm0
jb     1293 <taylor_log+0x193>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  0xe06(%rip),%xmm1
subsd  %xmm1,%xmm0
divsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movl   $0x1,-0x34(%rbp)
mov    -0x34(%rbp),%eax
cmp    -0x14(%rbp),%eax
ja     128e <taylor_log+0x18e>
movsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x30(%rbp),%xmm0
mov    -0x34(%rbp),%eax
cvtsi2sd %rax,%xmm1
divsd  %xmm1,%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  0xdb3(%rip),%xmm1
subsd  %xmm1,%xmm0
divsd  -0x10(%rbp),%xmm0
mulsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x20(%rbp),%xmm0
ucomisd -0x28(%rbp),%xmm0
jne    127b <taylor_log+0x17b>
jp     127b <taylor_log+0x17b>
jmp    128e <taylor_log+0x18e>
jmp    1280 <taylor_log+0x180>
mov    -0x34(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x34(%rbp)
jmp    120f <taylor_log+0x10f>
jmp    135c <taylor_log+0x25c>
movsd  0xd65(%rip),%xmm0
subsd  -0x10(%rbp),%xmm0
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  0xd3c(%rip),%xmm0
subsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x48(%rbp)
movl   $0x2,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0x14(%rbp),%eax
ja     1357 <taylor_log+0x257>
movsd  -0x10(%rbp),%xmm0
movsd  0xd12(%rip),%xmm1
subsd  %xmm0,%xmm1
movsd  -0x48(%rbp),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x48(%rbp)
movsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
movsd  -0x48(%rbp),%xmm1
mov    -0x4c(%rbp),%eax
cvtsi2sd %rax,%xmm0
divsd  %xmm0,%xmm1
movsd  -0x20(%rbp),%xmm0
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x20(%rbp),%xmm0
ucomisd -0x40(%rbp),%xmm0
jne    1344 <taylor_log+0x244>
jp     1344 <taylor_log+0x244>
jmp    1357 <taylor_log+0x257>
jmp    1349 <taylor_log+0x249>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    12d5 <taylor_log+0x1d5>
jmp    135c <taylor_log+0x25c>
movsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<taylor_log>:
movapd %xmm0,%xmm1
xorpd  %xmm0,%xmm0
ucomisd %xmm0,%xmm1
mov    0x2ecd(%rip),%rax
movsd  (%rax),%xmm0
jne    1124 <taylor_log+0x24>
jp     1124 <taylor_log+0x24>
xorpd  0xeed(%rip),%xmm0
ret
ucomisd %xmm1,%xmm0
jne    112d <taylor_log+0x2d>
jp     112d <taylor_log+0x2d>
ret
xorpd  %xmm0,%xmm0
ucomisd %xmm1,%xmm0
jbe    1143 <taylor_log+0x43>
mov    0x2eba(%rip),%rax
movsd  (%rax),%xmm0
ret
ucomisd 0xeb5(%rip),%xmm1
jne    114f <taylor_log+0x4f>
jnp    112c <taylor_log+0x2c>
jae    11b5 <taylor_log+0xb5>
movsd  0xea7(%rip),%xmm2
subsd  %xmm1,%xmm2
movapd 0xeab(%rip),%xmm0
xorpd  %xmm2,%xmm0
cmp    $0x2,%edi
jb     112c <taylor_log+0x2c>
mov    $0x3,%eax
movapd %xmm2,%xmm1
nopw   0x0(%rax,%rax,1)
movapd %xmm0,%xmm3
lea    -0x1(%rax),%ecx
mulsd  %xmm2,%xmm1
xorps  %xmm4,%xmm4
cvtsi2sd %rcx,%xmm4
movapd %xmm1,%xmm5
divsd  %xmm4,%xmm5
subsd  %xmm5,%xmm0
ucomisd %xmm3,%xmm0
jne    11a7 <taylor_log+0xa7>
jnp    112c <taylor_log+0x2c>
lea    0x1(%rax),%ecx
cmp    %edi,%eax
mov    %ecx,%eax
jbe    1180 <taylor_log+0x80>
jmp    112c <taylor_log+0x2c>
test   %edi,%edi
je     112c <taylor_log+0x2c>
movsd  0xe43(%rip),%xmm2
addsd  %xmm1,%xmm2
divsd  %xmm1,%xmm2
xorpd  %xmm0,%xmm0
mov    $0x1,%eax
movapd %xmm2,%xmm1
movapd %xmm0,%xmm3
mov    %eax,%ecx
xorps  %xmm4,%xmm4
cvtsi2sd %rcx,%xmm4
movapd %xmm1,%xmm0
divsd  %xmm4,%xmm0
addsd  %xmm3,%xmm0
ucomisd %xmm3,%xmm0
jne    1200 <taylor_log+0x100>
jnp    112c <taylor_log+0x2c>
mulsd  %xmm2,%xmm1
add    $0x1,%eax
cmp    %edi,%eax
jbe    11da <taylor_log+0xda>
jmp    112c <taylor_log+0x2c>

LLVM IR (-O0):
@INFINITY = global double 0.000000e+00
@NAN = global double 0.000000e+00
define double @taylor_log(double %0, i32 %1) {
%3 = alloca double
%4 = alloca double
%5 = alloca i32
%6 = alloca double
%7 = alloca double
%8 = alloca double
%9 = alloca i32
%10 = alloca double
%11 = alloca double
%12 = alloca i32
store double %0, double* %4
store i32 %1, i32* %5
%13 = load double, double* %4
%14 = fcmp oeq double %13, 0.000000e+00
br i1 %14, label %15, label %18
15: ; preds = %2
%16 = load double, double* @INFINITY
%17 = fneg double %16
store double %17, double* %3
br label %101
18: ; preds = %2
%19 = load double, double* %4
%20 = load double, double* @INFINITY
%21 = fcmp oeq double %19, %20
br i1 %21, label %22, label %24
22: ; preds = %18
%23 = load double, double* @INFINITY
store double %23, double* %3
br label %101
24: ; preds = %18
%25 = load double, double* %4
%26 = fcmp olt double %25, 0.000000e+00
br i1 %26, label %27, label %29
27: ; preds = %24
%28 = load double, double* @NAN
store double %28, double* %3
br label %101
29: ; preds = %24
%30 = load double, double* %4
%31 = fcmp oeq double %30, 1.000000e+00
br i1 %31, label %32, label %33
32: ; preds = %29
store double 0.000000e+00, double* %3
br label %101
33: ; preds = %29
%34 = load double, double* %4
%35 = fcmp oge double %34, 1.000000e+00
br i1 %35, label %36, label %68
36: ; preds = %33
store double 0.000000e+00, double* %6
%37 = load double, double* %4
%38 = fsub double %37, 1.000000e+00
%39 = load double, double* %4
%40 = fdiv double %38, %39
store double %40, double* %8
store i32 1, i32* %9
br label %41
41: ; preds = %64, %36
%42 = load i32, i32* %9
%43 = load i32, i32* %5
%44 = icmp ule i32 %42, %43
br i1 %44, label %45, label %67
45: ; preds = %41
%46 = load double, double* %6
store double %46, double* %7
%47 = load double, double* %8
%48 = load i32, i32* %9
%49 = uitofp i32 %48 to double
%50 = fdiv double %47, %49
%51 = load double, double* %6
%52 = fadd double %51, %50
store double %52, double* %6
%53 = load double, double* %4
%54 = fsub double %53, 1.000000e+00
%55 = load double, double* %4
%56 = fdiv double %54, %55
%57 = load double, double* %8
%58 = fmul double %57, %56
store double %58, double* %8
%59 = load double, double* %6
%60 = load double, double* %7
%61 = fcmp oeq double %59, %60
br i1 %61, label %62, label %63
62: ; preds = %45
br label %67
63: ; preds = %45
br label %64
64: ; preds = %63
%65 = load i32, i32* %9
%66 = add i32 %65, 1
store i32 %66, i32* %9
br label %41
67: ; preds = %62, %41
br label %99
68: ; preds = %33
%69 = load double, double* %4
%70 = fsub double 1.000000e+00, %69
%71 = fneg double %70
store double %71, double* %6
%72 = load double, double* %4
%73 = fsub double 1.000000e+00, %72
store double %73, double* %11
store i32 2, i32* %12
br label %74
74: ; preds = %95, %68
%75 = load i32, i32* %12
%76 = load i32, i32* %5
%77 = icmp ule i32 %75, %76
br i1 %77, label %78, label %98
78: ; preds = %74
%79 = load double, double* %4
%80 = fsub double 1.000000e+00, %79
%81 = load double, double* %11
%82 = fmul double %81, %80
store double %82, double* %11
%83 = load double, double* %6
store double %83, double* %10
%84 = load double, double* %11
%85 = load i32, i32* %12
%86 = uitofp i32 %85 to double
%87 = fdiv double %84, %86
%88 = load double, double* %6
%89 = fsub double %88, %87
store double %89, double* %6
%90 = load double, double* %6
%91 = load double, double* %10
%92 = fcmp oeq double %90, %91
br i1 %92, label %93, label %94
93: ; preds = %78
br label %98
94: ; preds = %78
br label %95
95: ; preds = %94
%96 = load i32, i32* %12
%97 = add i32 %96, 1
store i32 %97, i32* %12
br label %74
98: ; preds = %93, %74
br label %99
99: ; preds = %98, %67
%100 = load double, double* %6
store double %100, double* %3
br label %101
101: ; preds = %99, %32, %27, %22, %15
%102 = load double, double* %3
ret double %102
}

LLVM IR (-O2):
@INFINITY = global double 0.000000e+00
@NAN = global double 0.000000e+00
define double @taylor_log(double %0, i32 %1) {
%3 = fcmp oeq double %0, 0.000000e+00
%4 = load double, double* @INFINITY
br i1 %3, label %5, label %7
5: ; preds = %2
%6 = fneg double %4
br label %49
7: ; preds = %2
%8 = fcmp oeq double %4, %0
br i1 %8, label %49, label %9
9: ; preds = %7
%10 = fcmp olt double %0, 0.000000e+00
br i1 %10, label %11, label %13
11: ; preds = %9
%12 = load double, double* @NAN
br label %49
13: ; preds = %9
%14 = fcmp oeq double %0, 1.000000e+00
br i1 %14, label %49, label %15
15: ; preds = %13
%16 = fcmp ult double %0, 1.000000e+00
br i1 %16, label %33, label %17
17: ; preds = %15
%18 = fadd double %0, -1.000000e+00
%19 = fdiv double %18, %0
%20 = icmp eq i32 %1, 0
br i1 %20, label %49, label %21
21: ; preds = %17, %29
%22 = phi i32 [ %31, %29 ], [ 1, %17 ]
%23 = phi double [ %30, %29 ], [ %19, %17 ]
%24 = phi double [ %27, %29 ], [ 0.000000e+00, %17 ]
%25 = uitofp i32 %22 to double
%26 = fdiv double %23, %25
%27 = fadd double %24, %26
%28 = fcmp oeq double %27, %24
br i1 %28, label %49, label %29
29: ; preds = %21
%30 = fmul double %19, %23
%31 = add i32 %22, 1
%32 = icmp ugt i32 %31, %1
br i1 %32, label %49, label %21
33: ; preds = %15
%34 = fsub double 1.000000e+00, %0
%35 = fneg double %34
%36 = icmp ult i32 %1, 2
br i1 %36, label %49, label %37
37: ; preds = %33, %37
%38 = phi i32 [ %46, %37 ], [ 2, %33 ]
%39 = phi double [ %41, %37 ], [ %34, %33 ]
%40 = phi double [ %44, %37 ], [ %35, %33 ]
%41 = fmul double %34, %39
%42 = uitofp i32 %38 to double
%43 = fdiv double %41, %42
%44 = fsub double %40, %43
%45 = fcmp oeq double %44, %40
%46 = add i32 %38, 1
%47 = icmp ugt i32 %46, %1
%48 = select i1 %45, i1 true, i1 %47
br i1 %48, label %49, label %37
49: ; preds = %29, %21, %37, %17, %33, %13, %7, %11, %5
%50 = phi double [ %6, %5 ], [ %12, %11 ], [ %4, %7 ], [ 0.000000e+00, %13 ], [ %35, %33 ], [ 0.000000e+00, %17 ], [ %44, %37 ], [ %27, %21 ], [ %27, %29 ]
ret double %50
}