float fprime(b, l, t)
float b, t;
long int l;
{
  float a;
  a = ((float)(l + 1) * power(b, l) - 1.0 - t);
  return (a == 0.0 ? 1.0 : a);
}


x86 assembly (clang, -O0):
<fprime>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
movsd  %xmm1,-0x28(%rbp)
movaps %xmm0,%xmm1
movsd  -0x28(%rbp),%xmm0
cvtsd2ss %xmm1,%xmm1
cvtsd2ss %xmm0,%xmm0
movss  %xmm1,-0x4(%rbp)
mov    %rdi,-0x10(%rbp)
movss  %xmm0,-0x14(%rbp)
mov    -0x10(%rbp),%rax
add    $0x1,%rax
cvtsi2ss %rax,%xmm0
movss  %xmm0,-0x1c(%rbp)
movss  -0x4(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
mov    -0x10(%rbp),%rdi
mov    $0x1,%al
call   1030 <power@plt>
movss  -0x1c(%rbp),%xmm0
cvtsi2ss %eax,%xmm1
mulss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xe86(%rip),%xmm1
subsd  %xmm1,%xmm0
movss  -0x14(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x18(%rbp)
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    11c2 <fprime+0xb2>
jp     11c2 <fprime+0xb2>
movsd  0xe48(%rip),%xmm0
movsd  %xmm0,-0x30(%rbp)
jmp    11d0 <fprime+0xc0>
movss  -0x18(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movsd  %xmm0,-0x30(%rbp)
movsd  -0x30(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<fprime>:
push   %rax
cvtsd2ss %xmm0,%xmm0
cvtsd2ss %xmm1,%xmm1
movss  %xmm1,0x4(%rsp)
lea    0x1(%rdi),%rax
xorps  %xmm1,%xmm1
cvtsi2ss %rax,%xmm1
movss  %xmm1,(%rsp)
cvtss2sd %xmm0,%xmm0
mov    $0x1,%al
call   1030 <power@plt>
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
mulss  (%rsp),%xmm0
cvtss2sd %xmm0,%xmm0
addsd  0xead(%rip),%xmm0
movss  0x4(%rsp),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
xorps  %xmm1,%xmm1
cvtsd2ss %xmm0,%xmm1
xorps  %xmm2,%xmm2
cmpeqss %xmm1,%xmm2
movss  0xe90(%rip),%xmm0
andps  %xmm2,%xmm0
andnps %xmm1,%xmm2
orps   %xmm2,%xmm0
pop    %rax
ret

LLVM IR (-O0):
define float @fprime(double %0, i64 %1, double %2) {
%4 = alloca float
%5 = alloca i64
%6 = alloca float
%7 = alloca float
%8 = fptrunc double %0 to float
%9 = fptrunc double %2 to float
store float %8, float* %4
store i64 %1, i64* %5
store float %9, float* %6
%10 = load i64, i64* %5
%11 = add nsw i64 %10, 1
%12 = sitofp i64 %11 to float
%13 = load float, float* %4
%14 = fpext float %13 to double
%15 = load i64, i64* %5
%16 = call i32 (double, i64, ...) bitcast (i32 (...)* @power to i32 (double, i64, ...)*)(double %14, i64 %15)
%17 = sitofp i32 %16 to float
%18 = fmul float %12, %17
%19 = fpext float %18 to double
%20 = fsub double %19, 1.000000e+00
%21 = load float, float* %6
%22 = fpext float %21 to double
%23 = fsub double %20, %22
%24 = fptrunc double %23 to float
store float %24, float* %7
%25 = load float, float* %7
%26 = fpext float %25 to double
%27 = fcmp oeq double %26, 0.000000e+00
br i1 %27, label %28, label %29
28: ; preds = %3
br label %32
29: ; preds = %3
%30 = load float, float* %7
%31 = fpext float %30 to double
br label %32
32: ; preds = %29, %28
%33 = phi double [ 1.000000e+00, %28 ], [ %31, %29 ]
%34 = fptrunc double %33 to float
ret float %34
}

LLVM IR (-O2):
define float @fprime(double %0, i64 %1, double %2) {
%4 = fptrunc double %0 to float
%5 = fptrunc double %2 to float
%6 = add nsw i64 %1, 1
%7 = sitofp i64 %6 to float
%8 = fpext float %4 to double
%9 = tail call i32 (double, i64, ...) bitcast (i32 (...)* @power to i32 (double, i64, ...)*)(double %8, i64 %1)
%10 = sitofp i32 %9 to float
%11 = fmul float %7, %10
%12 = fpext float %11 to double
%13 = fadd double %12, -1.000000e+00
%14 = fpext float %5 to double
%15 = fsub double %13, %14
%16 = fptrunc double %15 to float
%17 = fcmp oeq float %16, 0.000000e+00
%18 = select i1 %17, float 1.000000e+00, float %16
ret float %18
}