#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 */
scalar_t__ sdtools_isinepsilon(double);
double sdtools_logN(double x, double base) {
  double result = 0.0;
  double term;
  int n = 0;
  if (sdtools_isinepsilon(x) || (x < 1.0 && base < 1.0))
    return 0.0;
  while (x < 1.0) {
    result -= 1.0;
    x *= base;
  }
  while (x >= base) {
    result += 1.0;
    x /= base;
  }
  term = 0.5;
  x *= x;
  while (n < 255 && term > 0.000000000001) {
    if (x >= base) {
      result += term;
      x = x / base;
    }
    term *= 0.5;
    x *= x;
    n++;
  }
  return (result);
}


x86 assembly (clang, -O0):
<sdtools_logN>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x20(%rbp)
movl   $0x0,-0x2c(%rbp)
movsd  -0x10(%rbp),%xmm0
call   1030 <sdtools_isinepsilon@plt>
cmp    $0x0,%rax
jne    116b <sdtools_logN+0x5b>
movsd  0xeb3(%rip),%xmm0
ucomisd -0x10(%rbp),%xmm0
jbe    1178 <sdtools_logN+0x68>
movsd  0xea0(%rip),%xmm0
ucomisd -0x18(%rbp),%xmm0
jbe    1178 <sdtools_logN+0x68>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    12b5 <sdtools_logN+0x1a5>
jmp    117d <sdtools_logN+0x6d>
movsd  0xe7b(%rip),%xmm0
ucomisd -0x10(%rbp),%xmm0
jbe    11ba <sdtools_logN+0xaa>
movsd  -0x20(%rbp),%xmm0
movsd  0xe63(%rip),%xmm1
subsd  %xmm1,%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x18(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    117d <sdtools_logN+0x6d>
jmp    11bf <sdtools_logN+0xaf>
movsd  -0x10(%rbp),%xmm0
ucomisd -0x18(%rbp),%xmm0
jb     11f9 <sdtools_logN+0xe9>
movsd  0xe29(%rip),%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x18(%rbp),%xmm1
movsd  -0x10(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x10(%rbp)
jmp    11bf <sdtools_logN+0xaf>
movsd  0xe07(%rip),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x10(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
xor    %eax,%eax
cmpl   $0xff,-0x2c(%rbp)
mov    %al,-0x2d(%rbp)
jge    123e <sdtools_logN+0x12e>
movsd  -0x28(%rbp),%xmm0
movsd  0xddc(%rip),%xmm1
ucomisd %xmm1,%xmm0
seta   %al
mov    %al,-0x2d(%rbp)
mov    -0x2d(%rbp),%al
test   $0x1,%al
jne    124e <sdtools_logN+0x13e>
jmp    12ab <sdtools_logN+0x19b>
movsd  -0x10(%rbp),%xmm0
ucomisd -0x18(%rbp),%xmm0
jb     127c <sdtools_logN+0x16c>
movsd  -0x28(%rbp),%xmm0
addsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x20(%rbp)
movsd  -0x10(%rbp),%xmm0
divsd  -0x18(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
movsd  0xd84(%rip),%xmm0
mulsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x10(%rbp),%xmm0
mulsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x10(%rbp)
mov    -0x2c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x2c(%rbp)
jmp    1215 <sdtools_logN+0x105>
movsd  -0x20(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<sdtools_logN>:
sub    $0x18,%rsp
movsd  %xmm1,0x10(%rsp)
movsd  %xmm0,0x8(%rsp)
call   1030 <sdtools_isinepsilon@plt>
xorpd  %xmm0,%xmm0
test   %rax,%rax
jne    114e <sdtools_logN+0x3e>
movsd  0xeca(%rip),%xmm1
movsd  0x8(%rsp),%xmm4
ucomisd %xmm4,%xmm1
movsd  0x10(%rsp),%xmm3
jbe    1153 <sdtools_logN+0x43>
ucomisd %xmm3,%xmm1
jbe    1153 <sdtools_logN+0x43>
add    $0x18,%rsp
ret
xorpd  %xmm0,%xmm0
ucomisd %xmm4,%xmm1
jbe    1188 <sdtools_logN+0x78>
xorpd  %xmm0,%xmm0
movsd  0xe9f(%rip),%xmm2
nopl   0x0(%rax)
addsd  %xmm2,%xmm0
mulsd  %xmm3,%xmm4
ucomisd %xmm4,%xmm1
ja     1170 <sdtools_logN+0x60>
jmp    1188 <sdtools_logN+0x78>
addsd  %xmm1,%xmm0
divsd  %xmm3,%xmm4
ucomisd %xmm3,%xmm4
jae    1180 <sdtools_logN+0x70>
mulsd  %xmm4,%xmm4
movsd  0xe76(%rip),%xmm1
mov    $0x26,%eax
movapd %xmm1,%xmm2
jmp    11bb <sdtools_logN+0xab>
cs nopw 0x0(%rax,%rax,1)
nop
mulsd  %xmm1,%xmm2
mulsd  %xmm4,%xmm4
add    $0xfffffffe,%eax
ucomisd %xmm3,%xmm4
jb     11c9 <sdtools_logN+0xb9>
addsd  %xmm2,%xmm0
divsd  %xmm3,%xmm4
mulsd  %xmm1,%xmm2
test   %eax,%eax
je     114e <sdtools_logN+0x3e>
mulsd  %xmm4,%xmm4
ucomisd %xmm3,%xmm4
jb     11b0 <sdtools_logN+0xa0>
addsd  %xmm2,%xmm0
divsd  %xmm3,%xmm4
jmp    11b0 <sdtools_logN+0xa0>

LLVM IR (-O0):
define double @sdtools_logN(double %0, double %1) {
%3 = alloca double
%4 = alloca double
%5 = alloca double
%6 = alloca double
%7 = alloca double
%8 = alloca i32
store double %0, double* %4
store double %1, double* %5
store double 0.000000e+00, double* %6
store i32 0, i32* %8
%9 = load double, double* %4
%10 = call i64 @sdtools_isinepsilon(double %9)
%11 = icmp ne i64 %10, 0
br i1 %11, label %18, label %12
12: ; preds = %2
%13 = load double, double* %4
%14 = fcmp olt double %13, 1.000000e+00
br i1 %14, label %15, label %19
15: ; preds = %12
%16 = load double, double* %5
%17 = fcmp olt double %16, 1.000000e+00
br i1 %17, label %18, label %19
18: ; preds = %15, %2
store double 0.000000e+00, double* %3
br label %73
19: ; preds = %15, %12
br label %20
20: ; preds = %23, %19
%21 = load double, double* %4
%22 = fcmp olt double %21, 1.000000e+00
br i1 %22, label %23, label %29
23: ; preds = %20
%24 = load double, double* %6
%25 = fsub double %24, 1.000000e+00
store double %25, double* %6
%26 = load double, double* %5
%27 = load double, double* %4
%28 = fmul double %27, %26
store double %28, double* %4
br label %20
29: ; preds = %20
br label %30
30: ; preds = %34, %29
%31 = load double, double* %4
%32 = load double, double* %5
%33 = fcmp oge double %31, %32
br i1 %33, label %34, label %40
34: ; preds = %30
%35 = load double, double* %6
%36 = fadd double %35, 1.000000e+00
store double %36, double* %6
%37 = load double, double* %5
%38 = load double, double* %4
%39 = fdiv double %38, %37
store double %39, double* %4
br label %30
40: ; preds = %30
store double 5.000000e-01, double* %7
%41 = load double, double* %4
%42 = load double, double* %4
%43 = fmul double %42, %41
store double %43, double* %4
br label %44
44: ; preds = %63, %40
%45 = load i32, i32* %8
%46 = icmp slt i32 %45, 255
br i1 %46, label %47, label %50
47: ; preds = %44
%48 = load double, double* %7
%49 = fcmp ogt double %48, 0x3D719799812DEA11
br label %50
50: ; preds = %47, %44
%51 = phi i1 [ false, %44 ], [ %49, %47 ]
br i1 %51, label %52, label %71
52: ; preds = %50
%53 = load double, double* %4
%54 = load double, double* %5
%55 = fcmp oge double %53, %54
br i1 %55, label %56, label %63
56: ; preds = %52
%57 = load double, double* %7
%58 = load double, double* %6
%59 = fadd double %58, %57
store double %59, double* %6
%60 = load double, double* %4
%61 = load double, double* %5
%62 = fdiv double %60, %61
store double %62, double* %4
br label %63
63: ; preds = %56, %52
%64 = load double, double* %7
%65 = fmul double %64, 5.000000e-01
store double %65, double* %7
%66 = load double, double* %4
%67 = load double, double* %4
%68 = fmul double %67, %66
store double %68, double* %4
%69 = load i32, i32* %8
%70 = add nsw i32 %69, 1
store i32 %70, i32* %8
br label %44
71: ; preds = %50
%72 = load double, double* %6
store double %72, double* %3
br label %73
73: ; preds = %71, %18
%74 = load double, double* %3
ret double %74
}

LLVM IR (-O2):
define double @sdtools_logN(double %0, double %1) {
%3 = tail call i64 @sdtools_isinepsilon(double %0)
%4 = icmp eq i64 %3, 0
br i1 %4, label %5, label %56
5: ; preds = %2
%6 = fcmp olt double %0, 1.000000e+00
%7 = fcmp olt double %1, 1.000000e+00
%8 = and i1 %6, %7
br i1 %8, label %56, label %9
9: ; preds = %5
br i1 %6, label %14, label %10
10: ; preds = %14, %9
%11 = phi double [ %0, %9 ], [ %18, %14 ]
%12 = phi double [ 0.000000e+00, %9 ], [ %17, %14 ]
%13 = fcmp ult double %11, %1
br i1 %13, label %26, label %20
14: ; preds = %9, %14
%15 = phi double [ %17, %14 ], [ 0.000000e+00, %9 ]
%16 = phi double [ %18, %14 ], [ %0, %9 ]
%17 = fadd double %15, -1.000000e+00
%18 = fmul double %16, %1
%19 = fcmp olt double %18, 1.000000e+00
br i1 %19, label %14, label %10
20: ; preds = %10, %20
%21 = phi double [ %23, %20 ], [ %12, %10 ]
%22 = phi double [ %24, %20 ], [ %11, %10 ]
%23 = fadd double %21, 1.000000e+00
%24 = fdiv double %22, %1
%25 = fcmp ult double %24, %1
br i1 %25, label %26, label %20
26: ; preds = %20, %10
%27 = phi double [ %11, %10 ], [ %24, %20 ]
%28 = phi double [ %12, %10 ], [ %23, %20 ]
%29 = fmul double %27, %27
br label %30
30: ; preds = %50, %26
%31 = phi i32 [ 0, %26 ], [ %55, %50 ]
%32 = phi double [ 5.000000e-01, %26 ], [ %53, %50 ]
%33 = phi double [ %28, %26 ], [ %52, %50 ]
%34 = phi double [ %29, %26 ], [ %54, %50 ]
%35 = fcmp ult double %34, %1
br i1 %35, label %39, label %36
36: ; preds = %30
%37 = fadd double %33, %32
%38 = fdiv double %34, %1
br label %39
39: ; preds = %36, %30
%40 = phi double [ %38, %36 ], [ %34, %30 ]
%41 = phi double [ %37, %36 ], [ %33, %30 ]
%42 = fmul double %32, 5.000000e-01
%43 = fmul double %40, %40
%44 = icmp eq i32 %31, 38
br i1 %44, label %56, label %45
45: ; preds = %39
%46 = fcmp ult double %43, %1
br i1 %46, label %50, label %47
47: ; preds = %45
%48 = fadd double %41, %42
%49 = fdiv double %43, %1
br label %50
50: ; preds = %47, %45
%51 = phi double [ %49, %47 ], [ %43, %45 ]
%52 = phi double [ %48, %47 ], [ %41, %45 ]
%53 = fmul double %42, 5.000000e-01
%54 = fmul double %51, %51
%55 = add nuw nsw i32 %31, 2
br label %30
56: ; preds = %39, %2, %5
%57 = phi double [ 0.000000e+00, %5 ], [ 0.000000e+00, %2 ], [ %41, %39 ]
ret double %57
}