double expm(double p, double ak) {
  int i, j;
  double p1, pt, r;
  static double tp[25];
  static int tp1 = 0;
  if (tp1 == 0) {
    tp1 = 1;
    tp[0] = 1.;
    for (i = 1; i < 25; i++)
      tp[i] = 2. * tp[i - 1];
  }
  if (ak == 1.)
    return 0.;
  for (i = 0; i < 25; i++)
    if (tp[i] > p)
      break;
  pt = tp[i - 1];
  p1 = p;
  r = 1.;
  for (j = 1; j <= i; j++) {
    if (p1 >= pt) {
      r = 16. * r;
      r = r - (int)(r / ak) * ak;
      p1 = p1 - pt;
    }
    pt = 0.5 * pt;
    if (pt >= 1.) {
      r = r * r;
      r = r - (int)(r / ak) * ak;
    }
  }
  return r;
}


x86 assembly (clang, -O0):
<expm>:
push   %rbp
mov    %rsp,%rbp
movsd  %xmm0,-0x10(%rbp)
movsd  %xmm1,-0x18(%rbp)
cmpl   $0x0,0x2fe3(%rip)
jne    1186 <expm+0x86>
movl   $0x1,0x2fd3(%rip)
movsd  0xed3(%rip),%xmm0
movsd  %xmm0,0x2efb(%rip)
movl   $0x1,-0x1c(%rbp)
cmpl   $0x19,-0x1c(%rbp)
jge    1181 <expm+0x81>
mov    -0x1c(%rbp),%eax
sub    $0x1,%eax
movslq %eax,%rcx
movsd  0xec1(%rip),%xmm0
lea    0x2ed2(%rip),%rax
mulsd  (%rax,%rcx,8),%xmm0
movslq -0x1c(%rbp),%rcx
lea    0x2ec2(%rip),%rax
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    113c <expm+0x3c>
jmp    1186 <expm+0x86>
movsd  -0x18(%rbp),%xmm0
movsd  0xe6d(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    11b0 <expm+0xb0>
jp     11b0 <expm+0xb0>
xorps  %xmm0,%xmm0
movsd  %xmm0,-0x8(%rbp)
jmp    133e <expm+0x23e>
movl   $0x0,-0x1c(%rbp)
cmpl   $0x19,-0x1c(%rbp)
jge    11f4 <expm+0xf4>
movslq -0x1c(%rbp),%rcx
lea    0x2e64(%rip),%rax
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x10(%rbp),%xmm0
jbe    11e1 <expm+0xe1>
jmp    11f4 <expm+0xf4>
jmp    11e6 <expm+0xe6>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    11b7 <expm+0xb7>
mov    -0x1c(%rbp),%eax
sub    $0x1,%eax
movslq %eax,%rcx
lea    0x2e2c(%rip),%rax
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x10(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  0xde0(%rip),%xmm0
movsd  %xmm0,-0x38(%rbp)
movl   $0x1,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x1c(%rbp),%eax
jg     1334 <expm+0x234>
movsd  -0x28(%rbp),%xmm0
ucomisd -0x30(%rbp),%xmm0
jb     12a9 <expm+0x1a9>
movsd  0xdb8(%rip),%xmm0
mulsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm1
movsd  -0x38(%rbp),%xmm0
divsd  -0x18(%rbp),%xmm0
cvttsd2si %xmm0,%eax
cvtsi2sd %eax,%xmm0
movsd  -0x18(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x28(%rbp),%xmm0
subsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  0xd5f(%rip),%xmm0
mulsd  -0x30(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
movsd  0xd38(%rip),%xmm1
ucomisd %xmm1,%xmm0
jb     1321 <expm+0x221>
movsd  -0x38(%rbp),%xmm0
mulsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  -0x38(%rbp),%xmm1
movsd  -0x38(%rbp),%xmm0
divsd  -0x18(%rbp),%xmm0
cvttsd2si %xmm0,%eax
cvtsi2sd %eax,%xmm0
movsd  -0x18(%rbp),%xmm2
movq   %xmm0,%rax
movabs $0x8000000000000000,%rcx
xor    %rcx,%rax
movq   %rax,%xmm0
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
jmp    1326 <expm+0x226>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    122c <expm+0x12c>
movsd  -0x38(%rbp),%xmm0
movsd  %xmm0,-0x8(%rbp)
movsd  -0x8(%rbp),%xmm0
pop    %rbp
ret

x86 assembly (clang, -O2):
<expm>:
cmpb   $0x0,0x2ff1(%rip)
jne    12bd <expm+0x1bd>
movb   $0x1,0x2fe4(%rip)
movabs $0x3ff0000000000000,%rax
mov    %rax,0x2f0b(%rip)
movabs $0x4000000000000000,%rax
mov    %rax,0x2f02(%rip)
movabs $0x4010000000000000,%rax
mov    %rax,0x2ef9(%rip)
movabs $0x4020000000000000,%rax
mov    %rax,0x2ef0(%rip)
movabs $0x4030000000000000,%rax
mov    %rax,0x2ee7(%rip)
movabs $0x4040000000000000,%rax
mov    %rax,0x2ede(%rip)
movabs $0x4050000000000000,%rax
mov    %rax,0x2ed5(%rip)
movabs $0x4060000000000000,%rax
mov    %rax,0x2ecc(%rip)
movabs $0x4070000000000000,%rax
mov    %rax,0x2ec3(%rip)
movabs $0x4080000000000000,%rax
mov    %rax,0x2eba(%rip)
movabs $0x4090000000000000,%rax
mov    %rax,0x2eb1(%rip)
movabs $0x40a0000000000000,%rax
mov    %rax,0x2ea8(%rip)
movabs $0x40b0000000000000,%rax
mov    %rax,0x2e9f(%rip)
movabs $0x40c0000000000000,%rax
mov    %rax,0x2e96(%rip)
movabs $0x40d0000000000000,%rax
mov    %rax,0x2e8d(%rip)
movabs $0x40e0000000000000,%rax
mov    %rax,0x2e84(%rip)
movabs $0x40f0000000000000,%rax
mov    %rax,0x2e7b(%rip)
movabs $0x4100000000000000,%rax
mov    %rax,0x2e72(%rip)
movabs $0x4110000000000000,%rax
mov    %rax,0x2e69(%rip)
movabs $0x4120000000000000,%rax
mov    %rax,0x2e60(%rip)
movabs $0x4130000000000000,%rax
mov    %rax,0x2e57(%rip)
movabs $0x4140000000000000,%rax
mov    %rax,0x2e4e(%rip)
movabs $0x4150000000000000,%rax
mov    %rax,0x2e45(%rip)
movabs $0x4160000000000000,%rax
mov    %rax,0x2e3c(%rip)
movabs $0x4170000000000000,%rax
mov    %rax,0x2e33(%rip)
xorpd  %xmm2,%xmm2
ucomisd 0xd37(%rip),%xmm1
jne    12d2 <expm+0x1d2>
jp     12d2 <expm+0x1d2>
movapd %xmm2,%xmm0
ret
movsd  0x2d56(%rip),%xmm2
ucomisd %xmm0,%xmm2
jbe    12e9 <expm+0x1e9>
movsd  0xd18(%rip),%xmm0
ret
movsd  0x2d47(%rip),%xmm2
mov    $0x1,%eax
ucomisd %xmm0,%xmm2
ja     14fa <expm+0x3fa>
movsd  0x2d38(%rip),%xmm2
mov    $0x2,%eax
ucomisd %xmm0,%xmm2
ja     14fa <expm+0x3fa>
movsd  0x2d29(%rip),%xmm2
mov    $0x3,%eax
ucomisd %xmm0,%xmm2
ja     14fa <expm+0x3fa>
movsd  0x2d1a(%rip),%xmm2
mov    $0x4,%eax
ucomisd %xmm0,%xmm2
ja     14fa <expm+0x3fa>
movsd  0x2d0b(%rip),%xmm2
mov    $0x5,%eax
ucomisd %xmm0,%xmm2
ja     14fa <expm+0x3fa>
movsd  0x2cfc(%rip),%xmm2
mov    $0x6,%eax
ucomisd %xmm0,%xmm2
ja     14fa <expm+0x3fa>
movsd  0x2ced(%rip),%xmm2
mov    $0x7,%eax
ucomisd %xmm0,%xmm2
ja     14fa <expm+0x3fa>
movsd  0x2cde(%rip),%xmm2
mov    $0x8,%eax
ucomisd %xmm0,%xmm2
ja     14fa <expm+0x3fa>
movsd  0x2ccf(%rip),%xmm2
mov    $0x9,%eax
ucomisd %xmm0,%xmm2
ja     14fa <expm+0x3fa>
movsd  0x2cc0(%rip),%xmm2
mov    $0xa,%eax
ucomisd %xmm0,%xmm2
ja     14fa <expm+0x3fa>
movsd  0x2cb1(%rip),%xmm2
mov    $0xb,%eax
ucomisd %xmm0,%xmm2
ja     14fa <expm+0x3fa>
movsd  0x2ca2(%rip),%xmm2
mov    $0xc,%eax
ucomisd %xmm0,%xmm2
ja     14fa <expm+0x3fa>
movsd  0x2c93(%rip),%xmm2
mov    $0xd,%eax
ucomisd %xmm0,%xmm2
ja     14fa <expm+0x3fa>
movsd  0x2c84(%rip),%xmm2
mov    $0xe,%eax
ucomisd %xmm0,%xmm2
ja     14fa <expm+0x3fa>
movsd  0x2c75(%rip),%xmm2
mov    $0xf,%eax
ucomisd %xmm0,%xmm2
ja     14fa <expm+0x3fa>
movsd  0x2c66(%rip),%xmm2
mov    $0x10,%eax
ucomisd %xmm0,%xmm2
ja     14fa <expm+0x3fa>
movsd  0x2c57(%rip),%xmm2
mov    $0x11,%eax
ucomisd %xmm0,%xmm2
ja     14fa <expm+0x3fa>
movsd  0x2c48(%rip),%xmm2
mov    $0x12,%eax
ucomisd %xmm0,%xmm2
ja     14fa <expm+0x3fa>
movsd  0x2c3d(%rip),%xmm2
mov    $0x13,%eax
ucomisd %xmm0,%xmm2
ja     14fa <expm+0x3fa>
movsd  0x2c32(%rip),%xmm2
mov    $0x14,%eax
ucomisd %xmm0,%xmm2
ja     14fa <expm+0x3fa>
movsd  0x2c27(%rip),%xmm2
mov    $0x15,%eax
ucomisd %xmm0,%xmm2
ja     14fa <expm+0x3fa>
movsd  0x2c1c(%rip),%xmm2
mov    $0x16,%eax
ucomisd %xmm0,%xmm2
ja     14fa <expm+0x3fa>
movsd  0x2c11(%rip),%xmm2
mov    $0x17,%eax
ucomisd %xmm0,%xmm2
ja     14fa <expm+0x3fa>
movsd  0x2c06(%rip),%xmm2
mov    $0x18,%eax
ucomisd %xmm0,%xmm2
ja     14fa <expm+0x3fa>
mov    $0x19,%eax
lea    -0x1(%rax),%ecx
lea    0x2b2c(%rip),%rdx
movsd  (%rdx,%rcx,8),%xmm3
movsd  0xaef(%rip),%xmm4
movsd  0xaf7(%rip),%xmm5
movsd  0xae7(%rip),%xmm6
movapd %xmm4,%xmm2
jmp    1539 <expm+0x439>
nopw   0x0(%rax,%rax,1)
add    $0xffffffff,%eax
je     12cd <expm+0x1cd>
ucomisd %xmm3,%xmm0
jb     155f <expm+0x45f>
mulsd  %xmm6,%xmm2
movapd %xmm2,%xmm7
divsd  %xmm1,%xmm7
cvttpd2dq %xmm7,%xmm7
cvtdq2pd %xmm7,%xmm7
mulsd  %xmm1,%xmm7
subsd  %xmm7,%xmm2
subsd  %xmm3,%xmm0
mulsd  %xmm5,%xmm3
ucomisd %xmm4,%xmm3
jb     1530 <expm+0x430>
mulsd  %xmm2,%xmm2
movapd %xmm2,%xmm7
divsd  %xmm1,%xmm7
cvttpd2dq %xmm7,%xmm7
cvtdq2pd %xmm7,%xmm7
mulsd  %xmm1,%xmm7
subsd  %xmm7,%xmm2
jmp    1530 <expm+0x430>

LLVM IR (-O0):
@expm.tp = internal global [25 x double] zeroinitializer
@expm.tp1 = internal global i32 0
define double @expm(double %0, double %1) {
%3 = alloca double
%4 = alloca double
%5 = alloca double
%6 = alloca i32
%7 = alloca i32
%8 = alloca double
%9 = alloca double
%10 = alloca double
store double %0, double* %4
store double %1, double* %5
%11 = load i32, i32* @expm.tp1
%12 = icmp eq i32 %11, 0
br i1 %12, label %13, label %31
13: ; preds = %2
store i32 1, i32* @expm.tp1
store double 1.000000e+00, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 0)
store i32 1, i32* %6
br label %14
14: ; preds = %27, %13
%15 = load i32, i32* %6
%16 = icmp slt i32 %15, 25
br i1 %16, label %17, label %30
17: ; preds = %14
%18 = load i32, i32* %6
%19 = sub nsw i32 %18, 1
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds [25 x double], [25 x double]* @expm.tp, i64 0, i64 %20
%22 = load double, double* %21
%23 = fmul double 2.000000e+00, %22
%24 = load i32, i32* %6
%25 = sext i32 %24 to i64
%26 = getelementptr inbounds [25 x double], [25 x double]* @expm.tp, i64 0, i64 %25
store double %23, double* %26
br label %27
27: ; preds = %17
%28 = load i32, i32* %6
%29 = add nsw i32 %28, 1
store i32 %29, i32* %6
br label %14
30: ; preds = %14
br label %31
31: ; preds = %30, %2
%32 = load double, double* %5
%33 = fcmp oeq double %32, 1.000000e+00
br i1 %33, label %34, label %35
34: ; preds = %31
store double 0.000000e+00, double* %3
br label %105
35: ; preds = %31
store i32 0, i32* %6
br label %36
36: ; preds = %48, %35
%37 = load i32, i32* %6
%38 = icmp slt i32 %37, 25
br i1 %38, label %39, label %51
39: ; preds = %36
%40 = load i32, i32* %6
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds [25 x double], [25 x double]* @expm.tp, i64 0, i64 %41
%43 = load double, double* %42
%44 = load double, double* %4
%45 = fcmp ogt double %43, %44
br i1 %45, label %46, label %47
46: ; preds = %39
br label %51
47: ; preds = %39
br label %48
48: ; preds = %47
%49 = load i32, i32* %6
%50 = add nsw i32 %49, 1
store i32 %50, i32* %6
br label %36
51: ; preds = %46, %36
%52 = load i32, i32* %6
%53 = sub nsw i32 %52, 1
%54 = sext i32 %53 to i64
%55 = getelementptr inbounds [25 x double], [25 x double]* @expm.tp, i64 0, i64 %54
%56 = load double, double* %55
store double %56, double* %9
%57 = load double, double* %4
store double %57, double* %8
store double 1.000000e+00, double* %10
store i32 1, i32* %7
br label %58
58: ; preds = %100, %51
%59 = load i32, i32* %7
%60 = load i32, i32* %6
%61 = icmp sle i32 %59, %60
br i1 %61, label %62, label %103
62: ; preds = %58
%63 = load double, double* %8
%64 = load double, double* %9
%65 = fcmp oge double %63, %64
br i1 %65, label %66, label %81
66: ; preds = %62
%67 = load double, double* %10
%68 = fmul double 1.600000e+01, %67
store double %68, double* %10
%69 = load double, double* %10
%70 = load double, double* %10
%71 = load double, double* %5
%72 = fdiv double %70, %71
%73 = fptosi double %72 to i32
%74 = sitofp i32 %73 to double
%75 = load double, double* %5
%76 = fneg double %74
%77 = call double @llvm.fmuladd.f64(double %76, double %75, double %69)
store double %77, double* %10
%78 = load double, double* %8
%79 = load double, double* %9
%80 = fsub double %78, %79
store double %80, double* %8
br label %81
81: ; preds = %66, %62
%82 = load double, double* %9
%83 = fmul double 5.000000e-01, %82
store double %83, double* %9
%84 = load double, double* %9
%85 = fcmp oge double %84, 1.000000e+00
br i1 %85, label %86, label %99
86: ; preds = %81
%87 = load double, double* %10
%88 = load double, double* %10
%89 = fmul double %87, %88
store double %89, double* %10
%90 = load double, double* %10
%91 = load double, double* %10
%92 = load double, double* %5
%93 = fdiv double %91, %92
%94 = fptosi double %93 to i32
%95 = sitofp i32 %94 to double
%96 = load double, double* %5
%97 = fneg double %95
%98 = call double @llvm.fmuladd.f64(double %97, double %96, double %90)
store double %98, double* %10
br label %99
99: ; preds = %86, %81
br label %100
100: ; preds = %99
%101 = load i32, i32* %7
%102 = add nsw i32 %101, 1
store i32 %102, i32* %7
br label %58
103: ; preds = %58
%104 = load double, double* %10
store double %104, double* %3
br label %105
105: ; preds = %103, %34
%106 = load double, double* %3
ret double %106
}

LLVM IR (-O2):
@expm.tp = internal unnamed_addr global [25 x double] zeroinitializer
@expm.tp1 = internal unnamed_addr global i1 false
define double @expm(double %0, double %1) {
%3 = load i1, i1* @expm.tp1
br i1 %3, label %5, label %4
4: ; preds = %2
store i1 true, i1* @expm.tp1
store double 1.000000e+00, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 0)
store double 2.000000e+00, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 1)
store double 4.000000e+00, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 2)
store double 8.000000e+00, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 3)
store double 1.600000e+01, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 4)
store double 3.200000e+01, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 5)
store double 6.400000e+01, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 6)
store double 1.280000e+02, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 7)
store double 2.560000e+02, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 8)
store double 5.120000e+02, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 9)
store double 1.024000e+03, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 10)
store double 2.048000e+03, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 11)
store double 4.096000e+03, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 12)
store double 8.192000e+03, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 13)
store double 1.638400e+04, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 14)
store double 3.276800e+04, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 15)
store double 6.553600e+04, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 16)
store double 1.310720e+05, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 17)
store double 2.621440e+05, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 18)
store double 5.242880e+05, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 19)
store double 0x4130000000000000, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 20)
store double 0x4140000000000000, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 21)
store double 0x4150000000000000, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 22)
store double 0x4160000000000000, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 23)
store double 0x4170000000000000, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 24)
br label %5
5: ; preds = %4, %2
%6 = fcmp oeq double %1, 1.000000e+00
br i1 %6, label %119, label %7
7: ; preds = %5
%8 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 0)
%9 = fcmp ogt double %8, %0
br i1 %9, label %119, label %10
10: ; preds = %7
%11 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 1)
%12 = fcmp ogt double %11, %0
br i1 %12, label %83, label %13
13: ; preds = %10
%14 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 2)
%15 = fcmp ogt double %14, %0
br i1 %15, label %83, label %16
16: ; preds = %13
%17 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 3)
%18 = fcmp ogt double %17, %0
br i1 %18, label %83, label %19
19: ; preds = %16
%20 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 4)
%21 = fcmp ogt double %20, %0
br i1 %21, label %83, label %22
22: ; preds = %19
%23 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 5)
%24 = fcmp ogt double %23, %0
br i1 %24, label %83, label %25
25: ; preds = %22
%26 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 6)
%27 = fcmp ogt double %26, %0
br i1 %27, label %83, label %28
28: ; preds = %25
%29 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 7)
%30 = fcmp ogt double %29, %0
br i1 %30, label %83, label %31
31: ; preds = %28
%32 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 8)
%33 = fcmp ogt double %32, %0
br i1 %33, label %83, label %34
34: ; preds = %31
%35 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 9)
%36 = fcmp ogt double %35, %0
br i1 %36, label %83, label %37
37: ; preds = %34
%38 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 10)
%39 = fcmp ogt double %38, %0
br i1 %39, label %83, label %40
40: ; preds = %37
%41 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 11)
%42 = fcmp ogt double %41, %0
br i1 %42, label %83, label %43
43: ; preds = %40
%44 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 12)
%45 = fcmp ogt double %44, %0
br i1 %45, label %83, label %46
46: ; preds = %43
%47 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 13)
%48 = fcmp ogt double %47, %0
br i1 %48, label %83, label %49
49: ; preds = %46
%50 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 14)
%51 = fcmp ogt double %50, %0
br i1 %51, label %83, label %52
52: ; preds = %49
%53 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 15)
%54 = fcmp ogt double %53, %0
br i1 %54, label %83, label %55
55: ; preds = %52
%56 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 16)
%57 = fcmp ogt double %56, %0
br i1 %57, label %83, label %58
58: ; preds = %55
%59 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 17)
%60 = fcmp ogt double %59, %0
br i1 %60, label %83, label %61
61: ; preds = %58
%62 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 18)
%63 = fcmp ogt double %62, %0
br i1 %63, label %83, label %64
64: ; preds = %61
%65 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 19)
%66 = fcmp ogt double %65, %0
br i1 %66, label %83, label %67
67: ; preds = %64
%68 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 20)
%69 = fcmp ogt double %68, %0
br i1 %69, label %83, label %70
70: ; preds = %67
%71 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 21)
%72 = fcmp ogt double %71, %0
br i1 %72, label %83, label %73
73: ; preds = %70
%74 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 22)
%75 = fcmp ogt double %74, %0
br i1 %75, label %83, label %76
76: ; preds = %73
%77 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 23)
%78 = fcmp ogt double %77, %0
br i1 %78, label %83, label %79
79: ; preds = %76
%80 = load double, double* getelementptr inbounds ([25 x double], [25 x double]* @expm.tp, i64 0, i64 24)
%81 = fcmp ogt double %80, %0
br i1 %81, label %83, label %82
82: ; preds = %79
br label %83
83: ; preds = %82, %79, %76, %73, %70, %67, %64, %61, %58, %55, %52, %49, %46, %43, %40, %37, %34, %31, %28, %25, %22, %19, %16, %13, %10
%84 = phi i32 [ 1, %10 ], [ 2, %13 ], [ 3, %16 ], [ 4, %19 ], [ 5, %22 ], [ 6, %25 ], [ 7, %28 ], [ 8, %31 ], [ 9, %34 ], [ 10, %37 ], [ 11, %40 ], [ 12, %43 ], [ 13, %46 ], [ 14, %49 ], [ 15, %52 ], [ 16, %55 ], [ 17, %58 ], [ 18, %61 ], [ 19, %64 ], [ 20, %67 ], [ 21, %70 ], [ 22, %73 ], [ 23, %76 ], [ 24, %79 ], [ 25, %82 ]
%85 = add nsw i32 %84, -1
%86 = zext i32 %85 to i64
%87 = getelementptr inbounds [25 x double], [25 x double]* @expm.tp, i64 0, i64 %86
%88 = load double, double* %87
br label %89
89: ; preds = %83, %115
%90 = phi double [ %116, %115 ], [ 1.000000e+00, %83 ]
%91 = phi double [ %106, %115 ], [ %88, %83 ]
%92 = phi double [ %104, %115 ], [ %0, %83 ]
%93 = phi i32 [ %117, %115 ], [ 1, %83 ]
%94 = fcmp ult double %92, %91
br i1 %94, label %103, label %95
95: ; preds = %89
%96 = fmul double %90, 1.600000e+01
%97 = fdiv double %96, %1
%98 = fptosi double %97 to i32
%99 = sitofp i32 %98 to double
%100 = fneg double %99
%101 = tail call double @llvm.fmuladd.f64(double %100, double %1, double %96)
%102 = fsub double %92, %91
br label %103
103: ; preds = %95, %89
%104 = phi double [ %102, %95 ], [ %92, %89 ]
%105 = phi double [ %101, %95 ], [ %90, %89 ]
%106 = fmul double %91, 5.000000e-01
%107 = fcmp ult double %106, 1.000000e+00
br i1 %107, label %115, label %108
108: ; preds = %103
%109 = fmul double %105, %105
%110 = fdiv double %109, %1
%111 = fptosi double %110 to i32
%112 = sitofp i32 %111 to double
%113 = fneg double %112
%114 = tail call double @llvm.fmuladd.f64(double %113, double %1, double %109)
br label %115
115: ; preds = %103, %108
%116 = phi double [ %114, %108 ], [ %105, %103 ]
%117 = add nuw nsw i32 %93, 1
%118 = icmp eq i32 %93, %84
br i1 %118, label %119, label %89
119: ; preds = %115, %7, %5
%120 = phi double [ 0.000000e+00, %5 ], [ 1.000000e+00, %7 ], [ %116, %115 ]
ret double %120
}