void digit(char *format, float *scale, int *digflag, float xlo, float xhi,
           int nlab) {
  double sig, delta, x, y, log10(), pow();
  int p, q, width, digits;
  *digflag = 1;
  x = delta = ((double)xhi - (double)xlo) / (nlab - 1);
  sig =
      (1.0e-6) * (((fabs(xlo)) > (fabs(xhi)) ? (fabs(xlo)) : (fabs(xhi)))) / x;
  for (p = -1; x < 1.0;) {
    x *= 10.0;
    p--;
  }
  while (fabs(round(x) - x) > x * sig) {
    x *= 10.0;
    p--;
  }
  while (fabs(round(x) - x) < x * sig) {
    x /= 10.0;
    p++;
  }
  y = pow((double)10, (double)(-p));
  q = (int)(1.0 + log10(((fabs((double)xlo) * y) > (fabs((double)xhi) * y)
                             ? (fabs((double)xlo) * y)
                             : (fabs((double)xhi) * y)) +
                        0.1 * delta * y));
  if (p >= 4 || p + q < -3) {
    digits = q - 1;
    width = q;
    if (q > 1)
      width++;
    if (xlo < 0 || xhi < 0)
      (width)++;
    *scale = pow((double)10, (double)(-p - q + 1));
    if (p >= 4)
      sprintf(format, "%%%d.%dfe+%2.2d", width, digits, p + q - 1);
    else
      sprintf(format, "%%%d.%dfe-%2.2d", width, digits, 1 - (p + q));
    if (nlab == 3) {
      if ((float)(xlo * y) == -1.0 && (float)(xhi * y) == 1.0)
        *digflag = 0;
    } else if (nlab == 2) {
      if (((float)xlo == 0.0 || (float)(xlo * y) == -1.0) &&
          ((float)xhi == 0.0 || (float)(xhi * y) == 1.0))
        *digflag = 0;
    }
  } else {
    if (p >= 0) {
      digits = 0;
      width = p + q;
    } else {
      digits = -p;
      width = 1 + q + ((-p) >= q) * (1 + (-p) - q);
    }
    if (xlo < 0 || xhi < 0)
      (width)++;
    *scale = 1.0;
    sprintf(format, "%%%d.%df", width, digits);
  }
}


x86 assembly (clang, -O0):
<digit>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
movss  %xmm0,-0x1c(%rbp)
movss  %xmm1,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
mov    -0x18(%rbp),%rax
movl   $0x1,(%rax)
movss  -0x20(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x1c(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
subsd  %xmm1,%xmm0
mov    -0x24(%rbp),%eax
sub    $0x1,%eax
cvtsi2sd %eax,%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x38(%rbp)
movsd  %xmm0,-0x40(%rbp)
movss  -0x1c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movaps 0xe57(%rip),%xmm1
pand   %xmm1,%xmm0
movss  -0x20(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movaps 0xe43(%rip),%xmm2
pand   %xmm2,%xmm1
ucomisd %xmm1,%xmm0
jbe    11e9 <digit+0xa9>
movss  -0x1c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movaps 0xe25(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
jmp    1202 <digit+0xc2>
movss  -0x20(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movaps 0xe07(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  %xmm0,-0x60(%rbp)
movsd  -0x60(%rbp),%xmm1
movsd  0xe01(%rip),%xmm0
mulsd  %xmm1,%xmm0
divsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x30(%rbp)
movl   $0xffffffff,-0x4c(%rbp)
movsd  0xdec(%rip),%xmm0
ucomisd -0x40(%rbp),%xmm0
jbe    1257 <digit+0x117>
movsd  0xde1(%rip),%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x4c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x4c(%rbp)
jmp    1224 <digit+0xe4>
jmp    125c <digit+0x11c>
movsd  -0x40(%rbp),%xmm0
call   1040 <round@plt>
subsd  -0x40(%rbp),%xmm0
movaps 0xd8e(%rip),%xmm1
pand   %xmm1,%xmm0
movsd  -0x40(%rbp),%xmm1
mulsd  -0x30(%rbp),%xmm1
ucomisd %xmm1,%xmm0
jbe    12aa <digit+0x16a>
movsd  0xd8e(%rip),%xmm0
mulsd  -0x40(%rbp),%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x4c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x4c(%rbp)
jmp    125c <digit+0x11c>
jmp    12af <digit+0x16f>
movsd  -0x40(%rbp),%xmm0
call   1040 <round@plt>
movaps %xmm0,%xmm1
subsd  -0x40(%rbp),%xmm1
movaps 0xd38(%rip),%xmm0
pand   %xmm0,%xmm1
movsd  -0x40(%rbp),%xmm0
mulsd  -0x30(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1304 <digit+0x1c4>
movsd  -0x40(%rbp),%xmm0
movsd  0xd33(%rip),%xmm1
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x40(%rbp)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
jmp    12af <digit+0x16f>
xor    %eax,%eax
sub    -0x4c(%rbp),%eax
cvtsi2sd %eax,%xmm1
movsd  0xd0b(%rip),%xmm0
call   1030 <pow@plt>
movsd  %xmm0,-0x48(%rbp)
movss  -0x1c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movaps 0xcd1(%rip),%xmm1
pand   %xmm1,%xmm0
mulsd  -0x48(%rbp),%xmm0
movss  -0x20(%rbp),%xmm1
cvtss2sd %xmm1,%xmm1
movaps 0xcb8(%rip),%xmm2
pand   %xmm2,%xmm1
mulsd  -0x48(%rbp),%xmm1
ucomisd %xmm1,%xmm0
jbe    137e <digit+0x23e>
movss  -0x1c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movaps 0xc95(%rip),%xmm1
pand   %xmm1,%xmm0
mulsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
jmp    139c <digit+0x25c>
movss  -0x20(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
movaps 0xc72(%rip),%xmm1
pand   %xmm1,%xmm0
mulsd  -0x48(%rbp),%xmm0
movsd  %xmm0,-0x68(%rbp)
movsd  -0x68(%rbp),%xmm1
movsd  0xc7f(%rip),%xmm0
mulsd  -0x38(%rbp),%xmm0
movsd  -0x48(%rbp),%xmm2
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
call   1050 <log10@plt>
movaps %xmm0,%xmm1
movsd  0xc4d(%rip),%xmm0
addsd  %xmm1,%xmm0
cvttsd2si %xmm0,%eax
mov    %eax,-0x50(%rbp)
cmpl   $0x4,-0x4c(%rbp)
jge    13ef <digit+0x2af>
mov    -0x4c(%rbp),%eax
add    -0x50(%rbp),%eax
cmp    $0xfffffffd,%eax
jge    15ec <digit+0x4ac>
mov    -0x50(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x58(%rbp)
mov    -0x50(%rbp),%eax
mov    %eax,-0x54(%rbp)
cmpl   $0x1,-0x50(%rbp)
jle    1411 <digit+0x2d1>
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x1c(%rbp),%xmm0
ja     142b <digit+0x2eb>
xorps  %xmm0,%xmm0
ucomiss -0x20(%rbp),%xmm0
jbe    1434 <digit+0x2f4>
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
xor    %eax,%eax
sub    -0x4c(%rbp),%eax
sub    -0x50(%rbp),%eax
add    $0x1,%eax
cvtsi2sd %eax,%xmm1
movsd  0xbd5(%rip),%xmm0
call   1030 <pow@plt>
cvtsd2ss %xmm0,%xmm0
mov    -0x10(%rbp),%rax
movss  %xmm0,(%rax)
cmpl   $0x4,-0x4c(%rbp)
jl     148f <digit+0x34f>
mov    -0x8(%rbp),%rdi
mov    -0x54(%rbp),%edx
mov    -0x58(%rbp),%ecx
mov    -0x4c(%rbp),%r8d
add    -0x50(%rbp),%r8d
sub    $0x1,%r8d
lea    0xbb9(%rip),%rsi
mov    $0x0,%al
call   1060 <sprintf@plt>
jmp    14b6 <digit+0x376>
mov    -0x8(%rbp),%rdi
mov    -0x54(%rbp),%edx
mov    -0x58(%rbp),%ecx
mov    -0x4c(%rbp),%eax
add    -0x50(%rbp),%eax
mov    $0x1,%r8d
sub    %eax,%r8d
lea    0xb9d(%rip),%rsi
mov    $0x0,%al
call   1060 <sprintf@plt>
cmpl   $0x3,-0x24(%rbp)
jne    152b <digit+0x3eb>
movss  -0x1c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
mulsd  -0x48(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xb52(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    1526 <digit+0x3e6>
jp     1526 <digit+0x3e6>
movss  -0x20(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
mulsd  -0x48(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xb0c(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    1526 <digit+0x3e6>
jp     1526 <digit+0x3e6>
mov    -0x18(%rbp),%rax
movl   $0x0,(%rax)
jmp    15e7 <digit+0x4a7>
cmpl   $0x2,-0x24(%rbp)
jne    15e2 <digit+0x4a2>
movss  -0x1c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    1556 <digit+0x416>
jp     1556 <digit+0x416>
jmp    1584 <digit+0x444>
movss  -0x1c(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
mulsd  -0x48(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xabc(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    15dd <digit+0x49d>
jp     15dd <digit+0x49d>
movss  -0x20(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    15a5 <digit+0x465>
jp     15a5 <digit+0x465>
jmp    15d3 <digit+0x493>
movss  -0x20(%rbp),%xmm0
cvtss2sd %xmm0,%xmm0
mulsd  -0x48(%rbp),%xmm0
cvtsd2ss %xmm0,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xa55(%rip),%xmm1
ucomisd %xmm1,%xmm0
jne    15dd <digit+0x49d>
jp     15dd <digit+0x49d>
mov    -0x18(%rbp),%rax
movl   $0x0,(%rax)
jmp    15e2 <digit+0x4a2>
jmp    15e7 <digit+0x4a7>
jmp    1688 <digit+0x548>
cmpl   $0x0,-0x4c(%rbp)
jl     160b <digit+0x4cb>
movl   $0x0,-0x58(%rbp)
mov    -0x4c(%rbp),%eax
add    -0x50(%rbp),%eax
mov    %eax,-0x54(%rbp)
jmp    163d <digit+0x4fd>
xor    %eax,%eax
sub    -0x4c(%rbp),%eax
mov    %eax,-0x58(%rbp)
mov    -0x50(%rbp),%eax
add    $0x1,%eax
xor    %ecx,%ecx
sub    -0x4c(%rbp),%ecx
cmp    -0x50(%rbp),%ecx
setge  %cl
and    $0x1,%cl
movzbl %cl,%ecx
xor    %edx,%edx
sub    -0x4c(%rbp),%edx
add    $0x1,%edx
sub    -0x50(%rbp),%edx
imul   %edx,%ecx
add    %ecx,%eax
mov    %eax,-0x54(%rbp)
xorps  %xmm0,%xmm0
ucomiss -0x1c(%rbp),%xmm0
ja     1657 <digit+0x517>
xorps  %xmm0,%xmm0
ucomiss -0x20(%rbp),%xmm0
jbe    1660 <digit+0x520>
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
mov    -0x10(%rbp),%rax
movss  0x9cc(%rip),%xmm0
movss  %xmm0,(%rax)
mov    -0x8(%rbp),%rdi
mov    -0x54(%rbp),%edx
mov    -0x58(%rbp),%ecx
lea    0x9db(%rip),%rsi
mov    $0x0,%al
call   1060 <sprintf@plt>
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<digit>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x88,%rsp
mov    %ecx,%r13d
mov    %rdx,%r14
mov    %rsi,0x18(%rsp)
mov    %rdi,%r15
movl   $0x1,(%rdx)
movss  %xmm1,0x10(%rsp)
cvtss2sd %xmm1,%xmm1
movss  %xmm0,0x14(%rsp)
cvtss2sd %xmm0,%xmm2
movaps %xmm1,%xmm3
subsd  %xmm2,%xmm3
lea    -0x1(%r13),%eax
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
divsd  %xmm0,%xmm3
movaps 0xe6a(%rip),%xmm0
movaps %xmm2,0x60(%rsp)
andps  %xmm0,%xmm2
movaps %xmm1,0x50(%rsp)
andps  %xmm1,%xmm0
movaps %xmm2,0x30(%rsp)
movaps %xmm0,0x70(%rsp)
maxsd  %xmm0,%xmm2
mulsd  0xe54(%rip),%xmm2
divsd  %xmm3,%xmm2
movapd %xmm2,0x20(%rsp)
mov    $0xffffffff,%r12d
movsd  0xe44(%rip),%xmm2
ucomisd %xmm3,%xmm2
movapd %xmm3,%xmm0
jbe    11fe <digit+0xbe>
mov    $0xffffffff,%r12d
movsd  0xe34(%rip),%xmm1
movapd %xmm3,%xmm0
mulsd  %xmm1,%xmm0
add    $0xffffffff,%r12d
ucomisd %xmm0,%xmm2
ja     11f0 <digit+0xb0>
movsd  %xmm0,0x8(%rsp)
movapd %xmm3,0x40(%rsp)
nopw   0x0(%rax,%rax,1)
call   1040 <round@plt>
movsd  0x8(%rsp),%xmm2
subsd  %xmm2,%xmm0
andpd  0xdd9(%rip),%xmm0
movapd 0x20(%rsp),%xmm1
mulsd  %xmm2,%xmm1
ucomisd %xmm1,%xmm0
jbe    1287 <digit+0x147>
mulsd  0xde1(%rip),%xmm2
movsd  %xmm2,0x8(%rsp)
add    $0xffffffff,%r12d
movapd %xmm2,%xmm0
jmp    1210 <digit+0xd0>
nop
divsd  0xdc8(%rip),%xmm2
movsd  %xmm2,0x8(%rsp)
add    $0x1,%r12d
movapd %xmm2,%xmm0
call   1040 <round@plt>
movsd  0x8(%rsp),%xmm2
subsd  %xmm2,%xmm0
andpd  0xd83(%rip),%xmm0
movapd 0x20(%rsp),%xmm1
mulsd  %xmm2,%xmm1
ucomisd %xmm0,%xmm1
ja     1250 <digit+0x110>
mov    %r12d,%ebx
neg    %ebx
xorps  %xmm1,%xmm1
cvtsi2sd %ebx,%xmm1
movsd  0xd7f(%rip),%xmm0
call   1030 <pow@plt>
movapd %xmm0,%xmm2
movapd 0x30(%rsp),%xmm1
mulsd  %xmm0,%xmm1
movapd 0x70(%rsp),%xmm0
mulsd  %xmm2,%xmm0
maxsd  %xmm0,%xmm1
movapd 0x40(%rsp),%xmm0
mulsd  0xd58(%rip),%xmm0
movsd  %xmm2,0x8(%rsp)
mulsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
call   1050 <log10@plt>
addsd  0xd2d(%rip),%xmm0
cvttsd2si %xmm0,%eax
lea    (%r12,%rax,1),%ebp
cmp    $0x3,%r12d
jg     130e <digit+0x1ce>
cmp    $0xfffffffc,%ebp
jle    130e <digit+0x1ce>
test   %r12d,%r12d
js     13f3 <digit+0x2b3>
xor    %ebx,%ebx
jmp    1407 <digit+0x2c7>
mov    %r13,0x40(%rsp)
mov    %r15,%r13
mov    %r14,0x20(%rsp)
lea    -0x1(%rax),%ecx
mov    %ecx,0x30(%rsp)
xor    %ecx,%ecx
cmp    $0x2,%eax
setge  %cl
xorpd  %xmm0,%xmm0
ucomiss 0x14(%rsp),%xmm0
seta   %dl
ucomiss 0x10(%rsp),%xmm0
seta   %bl
or     %dl,%bl
movzbl %bl,%r14d
add    %eax,%r14d
add    %ecx,%r14d
mov    $0x1,%r15d
sub    %ebp,%r15d
xorps  %xmm1,%xmm1
cvtsi2sd %r15d,%xmm1
movsd  0xcbd(%rip),%xmm0
call   1030 <pow@plt>
cvtsd2ss %xmm0,%xmm0
mov    0x18(%rsp),%rax
movss  %xmm0,(%rax)
cmp    $0x4,%r12d
jl     1394 <digit+0x254>
add    $0xffffffff,%ebp
lea    0xcb3(%rip),%rsi
mov    %r13,%rdi
mov    %r14d,%edx
mov    0x30(%rsp),%ecx
mov    %ebp,%r8d
jmp    13a8 <digit+0x268>
lea    0xcad(%rip),%rsi
mov    %r13,%rdi
mov    %r14d,%edx
mov    0x30(%rsp),%ecx
mov    %r15d,%r8d
xor    %eax,%eax
call   1060 <sprintf@plt>
mov    0x40(%rsp),%rcx
cmp    $0x2,%ecx
mov    0x20(%rsp),%rax
je     1451 <digit+0x311>
cmp    $0x3,%ecx
jne    14aa <digit+0x36a>
movapd 0x60(%rsp),%xmm0
mulsd  0x8(%rsp),%xmm0
cvtsd2ss %xmm0,%xmm0
ucomiss 0xc4e(%rip),%xmm0
jne    14aa <digit+0x36a>
jnp    1489 <digit+0x349>
jmp    14aa <digit+0x36a>
mov    $0x1,%ecx
sub    %ebp,%ecx
xor    %edx,%edx
cmp    %eax,%ebx
cmovge %ecx,%edx
lea    (%rax,%rdx,1),%ebp
add    $0x1,%ebp
mov    0x18(%rsp),%rsi
xorpd  %xmm0,%xmm0
ucomiss 0x14(%rsp),%xmm0
seta   %al
ucomiss 0x10(%rsp),%xmm0
seta   %cl
or     %al,%cl
movzbl %cl,%edx
add    %ebp,%edx
movl   $0x3f800000,(%rsi)
lea    0xc24(%rip),%rsi
mov    %r15,%rdi
mov    %ebx,%ecx
xor    %eax,%eax
add    $0x88,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
jmp    1060 <sprintf@plt>
xorps  %xmm0,%xmm0
movss  0x14(%rsp),%xmm1
ucomiss %xmm0,%xmm1
jne    1461 <digit+0x321>
jnp    147c <digit+0x33c>
movapd 0x60(%rsp),%xmm1
mulsd  0x8(%rsp),%xmm1
cvtsd2ss %xmm1,%xmm1
ucomiss 0xbb8(%rip),%xmm1
jne    14aa <digit+0x36a>
jp     14aa <digit+0x36a>
movss  0x10(%rsp),%xmm1
ucomiss %xmm0,%xmm1
jne    1489 <digit+0x349>
jnp    14a4 <digit+0x364>
movsd  0x8(%rsp),%xmm0
mulsd  0x50(%rsp),%xmm0
cvtsd2ss %xmm0,%xmm0
ucomiss 0xb94(%rip),%xmm0
jne    14aa <digit+0x36a>
jp     14aa <digit+0x36a>
movl   $0x0,(%rax)
add    $0x88,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
@.str = [16 x i8] c"%%%d.%dfe+%2.2d\00"
@.str.1 = [16 x i8] c"%%%d.%dfe-%2.2d\00"
@.str.2 = [9 x i8] c"%%%d.%df\00"
define void @digit(i8* %0, float* %1, i32* %2, float %3, float %4, i32 %5) {
%7 = alloca i8*
%8 = alloca float*
%9 = alloca i32*
%10 = alloca float
%11 = alloca float
%12 = alloca i32
%13 = alloca double
%14 = alloca double
%15 = alloca double
%16 = alloca double
%17 = alloca i32
%18 = alloca i32
%19 = alloca i32
%20 = alloca i32
store i8* %0, i8** %7
store float* %1, float** %8
store i32* %2, i32** %9
store float %3, float* %10
store float %4, float* %11
store i32 %5, i32* %12
%21 = load i32*, i32** %9
store i32 1, i32* %21
%22 = load float, float* %11
%23 = fpext float %22 to double
%24 = load float, float* %10
%25 = fpext float %24 to double
%26 = fsub double %23, %25
%27 = load i32, i32* %12
%28 = sub nsw i32 %27, 1
%29 = sitofp i32 %28 to double
%30 = fdiv double %26, %29
store double %30, double* %14
store double %30, double* %15
%31 = load float, float* %10
%32 = fpext float %31 to double
%33 = call double @llvm.fabs.f64(double %32)
%34 = load float, float* %11
%35 = fpext float %34 to double
%36 = call double @llvm.fabs.f64(double %35)
%37 = fcmp ogt double %33, %36
br i1 %37, label %38, label %42
38: ; preds = %6
%39 = load float, float* %10
%40 = fpext float %39 to double
%41 = call double @llvm.fabs.f64(double %40)
br label %46
42: ; preds = %6
%43 = load float, float* %11
%44 = fpext float %43 to double
%45 = call double @llvm.fabs.f64(double %44)
br label %46
46: ; preds = %42, %38
%47 = phi double [ %41, %38 ], [ %45, %42 ]
%48 = fmul double 0x3EB0C6F7A0B5ED8D, %47
%49 = load double, double* %15
%50 = fdiv double %48, %49
store double %50, double* %13
store i32 -1, i32* %17
br label %51
51: ; preds = %54, %46
%52 = load double, double* %15
%53 = fcmp olt double %52, 1.000000e+00
br i1 %53, label %54, label %59
54: ; preds = %51
%55 = load double, double* %15
%56 = fmul double %55, 1.000000e+01
store double %56, double* %15
%57 = load i32, i32* %17
%58 = add nsw i32 %57, -1
store i32 %58, i32* %17
br label %51
59: ; preds = %51
br label %60
60: ; preds = %70, %59
%61 = load double, double* %15
%62 = call double @llvm.round.f64(double %61)
%63 = load double, double* %15
%64 = fsub double %62, %63
%65 = call double @llvm.fabs.f64(double %64)
%66 = load double, double* %15
%67 = load double, double* %13
%68 = fmul double %66, %67
%69 = fcmp ogt double %65, %68
br i1 %69, label %70, label %75
70: ; preds = %60
%71 = load double, double* %15
%72 = fmul double %71, 1.000000e+01
store double %72, double* %15
%73 = load i32, i32* %17
%74 = add nsw i32 %73, -1
store i32 %74, i32* %17
br label %60
75: ; preds = %60
br label %76
76: ; preds = %86, %75
%77 = load double, double* %15
%78 = call double @llvm.round.f64(double %77)
%79 = load double, double* %15
%80 = fsub double %78, %79
%81 = call double @llvm.fabs.f64(double %80)
%82 = load double, double* %15
%83 = load double, double* %13
%84 = fmul double %82, %83
%85 = fcmp olt double %81, %84
br i1 %85, label %86, label %91
86: ; preds = %76
%87 = load double, double* %15
%88 = fdiv double %87, 1.000000e+01
store double %88, double* %15
%89 = load i32, i32* %17
%90 = add nsw i32 %89, 1
store i32 %90, i32* %17
br label %76
91: ; preds = %76
%92 = load i32, i32* %17
%93 = sub nsw i32 0, %92
%94 = sitofp i32 %93 to double
%95 = call double @pow(double 1.000000e+01, double %94)
store double %95, double* %16
%96 = load float, float* %10
%97 = fpext float %96 to double
%98 = call double @llvm.fabs.f64(double %97)
%99 = load double, double* %16
%100 = fmul double %98, %99
%101 = load float, float* %11
%102 = fpext float %101 to double
%103 = call double @llvm.fabs.f64(double %102)
%104 = load double, double* %16
%105 = fmul double %103, %104
%106 = fcmp ogt double %100, %105
br i1 %106, label %107, label %113
107: ; preds = %91
%108 = load float, float* %10
%109 = fpext float %108 to double
%110 = call double @llvm.fabs.f64(double %109)
%111 = load double, double* %16
%112 = fmul double %110, %111
br label %119
113: ; preds = %91
%114 = load float, float* %11
%115 = fpext float %114 to double
%116 = call double @llvm.fabs.f64(double %115)
%117 = load double, double* %16
%118 = fmul double %116, %117
br label %119
119: ; preds = %113, %107
%120 = phi double [ %112, %107 ], [ %118, %113 ]
%121 = load double, double* %14
%122 = fmul double 1.000000e-01, %121
%123 = load double, double* %16
%124 = call double @llvm.fmuladd.f64(double %122, double %123, double %120)
%125 = call double @log10(double %124)
%126 = fadd double 1.000000e+00, %125
%127 = fptosi double %126 to i32
store i32 %127, i32* %18
%128 = load i32, i32* %17
%129 = icmp sge i32 %128, 4
br i1 %129, label %135, label %130
130: ; preds = %119
%131 = load i32, i32* %17
%132 = load i32, i32* %18
%133 = add nsw i32 %131, %132
%134 = icmp slt i32 %133, -3
br i1 %134, label %135, label %237
135: ; preds = %130, %119
%136 = load i32, i32* %18
%137 = sub nsw i32 %136, 1
store i32 %137, i32* %20
%138 = load i32, i32* %18
store i32 %138, i32* %19
%139 = load i32, i32* %18
%140 = icmp sgt i32 %139, 1
br i1 %140, label %141, label %144
141: ; preds = %135
%142 = load i32, i32* %19
%143 = add nsw i32 %142, 1
store i32 %143, i32* %19
br label %144
144: ; preds = %141, %135
%145 = load float, float* %10
%146 = fcmp olt float %145, 0.000000e+00
br i1 %146, label %150, label %147
147: ; preds = %144
%148 = load float, float* %11
%149 = fcmp olt float %148, 0.000000e+00
br i1 %149, label %150, label %153
150: ; preds = %147, %144
%151 = load i32, i32* %19
%152 = add nsw i32 %151, 1
store i32 %152, i32* %19
br label %153
153: ; preds = %150, %147
%154 = load i32, i32* %17
%155 = sub nsw i32 0, %154
%156 = load i32, i32* %18
%157 = sub nsw i32 %155, %156
%158 = add nsw i32 %157, 1
%159 = sitofp i32 %158 to double
%160 = call double @pow(double 1.000000e+01, double %159)
%161 = fptrunc double %160 to float
%162 = load float*, float** %8
store float %161, float* %162
%163 = load i32, i32* %17
%164 = icmp sge i32 %163, 4
br i1 %164, label %165, label %174
165: ; preds = %153
%166 = load i8*, i8** %7
%167 = load i32, i32* %19
%168 = load i32, i32* %20
%169 = load i32, i32* %17
%170 = load i32, i32* %18
%171 = add nsw i32 %169, %170
%172 = sub nsw i32 %171, 1
%173 = call i32 (i8*, i8*, ...) @sprintf(i8* %166, i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i64 0, i64 0), i32 %167, i32 %168, i32 %172)
br label %183
174: ; preds = %153
%175 = load i8*, i8** %7
%176 = load i32, i32* %19
%177 = load i32, i32* %20
%178 = load i32, i32* %17
%179 = load i32, i32* %18
%180 = add nsw i32 %178, %179
%181 = sub nsw i32 1, %180
%182 = call i32 (i8*, i8*, ...) @sprintf(i8* %175, i8* getelementptr inbounds ([16 x i8], [16 x i8]* @.str.1, i64 0, i64 0), i32 %176, i32 %177, i32 %181)
br label %183
183: ; preds = %174, %165
%184 = load i32, i32* %12
%185 = icmp eq i32 %184, 3
br i1 %185, label %186, label %205
186: ; preds = %183
%187 = load float, float* %10
%188 = fpext float %187 to double
%189 = load double, double* %16
%190 = fmul double %188, %189
%191 = fptrunc double %190 to float
%192 = fpext float %191 to double
%193 = fcmp oeq double %192, -1.000000e+00
br i1 %193, label %194, label %204
194: ; preds = %186
%195 = load float, float* %11
%196 = fpext float %195 to double
%197 = load double, double* %16
%198 = fmul double %196, %197
%199 = fptrunc double %198 to float
%200 = fpext float %199 to double
%201 = fcmp oeq double %200, 1.000000e+00
br i1 %201, label %202, label %204
202: ; preds = %194
%203 = load i32*, i32** %9
store i32 0, i32* %203
br label %204
204: ; preds = %202, %194, %186
br label %236
205: ; preds = %183
%206 = load i32, i32* %12
%207 = icmp eq i32 %206, 2
br i1 %207, label %208, label %235
208: ; preds = %205
%209 = load float, float* %10
%210 = fpext float %209 to double
%211 = fcmp oeq double %210, 0.000000e+00
br i1 %211, label %220, label %212
212: ; preds = %208
%213 = load float, float* %10
%214 = fpext float %213 to double
%215 = load double, double* %16
%216 = fmul double %214, %215
%217 = fptrunc double %216 to float
%218 = fpext float %217 to double
%219 = fcmp oeq double %218, -1.000000e+00
br i1 %219, label %220, label %234
220: ; preds = %212, %208
%221 = load float, float* %11
%222 = fpext float %221 to double
%223 = fcmp oeq double %222, 0.000000e+00
br i1 %223, label %232, label %224
224: ; preds = %220
%225 = load float, float* %11
%226 = fpext float %225 to double
%227 = load double, double* %16
%228 = fmul double %226, %227
%229 = fptrunc double %228 to float
%230 = fpext float %229 to double
%231 = fcmp oeq double %230, 1.000000e+00
br i1 %231, label %232, label %234
232: ; preds = %224, %220
%233 = load i32*, i32** %9
store i32 0, i32* %233
br label %234
234: ; preds = %232, %224, %212
br label %235
235: ; preds = %234, %205
br label %236
236: ; preds = %235, %204
br label %276
237: ; preds = %130
%238 = load i32, i32* %17
%239 = icmp sge i32 %238, 0
br i1 %239, label %240, label %244
240: ; preds = %237
store i32 0, i32* %20
%241 = load i32, i32* %17
%242 = load i32, i32* %18
%243 = add nsw i32 %241, %242
store i32 %243, i32* %19
br label %261
244: ; preds = %237
%245 = load i32, i32* %17
%246 = sub nsw i32 0, %245
store i32 %246, i32* %20
%247 = load i32, i32* %18
%248 = add nsw i32 1, %247
%249 = load i32, i32* %17
%250 = sub nsw i32 0, %249
%251 = load i32, i32* %18
%252 = icmp sge i32 %250, %251
%253 = zext i1 %252 to i32
%254 = load i32, i32* %17
%255 = sub nsw i32 0, %254
%256 = add nsw i32 1, %255
%257 = load i32, i32* %18
%258 = sub nsw i32 %256, %257
%259 = mul nsw i32 %253, %258
%260 = add nsw i32 %248, %259
store i32 %260, i32* %19
br label %261
261: ; preds = %244, %240
%262 = load float, float* %10
%263 = fcmp olt float %262, 0.000000e+00
br i1 %263, label %267, label %264
264: ; preds = %261
%265 = load float, float* %11
%266 = fcmp olt float %265, 0.000000e+00
br i1 %266, label %267, label %270
267: ; preds = %264, %261
%268 = load i32, i32* %19
%269 = add nsw i32 %268, 1
store i32 %269, i32* %19
br label %270
270: ; preds = %267, %264
%271 = load float*, float** %8
store float 1.000000e+00, float* %271
%272 = load i8*, i8** %7
%273 = load i32, i32* %19
%274 = load i32, i32* %20
%275 = call i32 (i8*, i8*, ...) @sprintf(i8* %272, i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.2, i64 0, i64 0), i32 %273, i32 %274)
br label %276
276: ; preds = %270, %236
ret void
}

LLVM IR (-O2):
@.str = [16 x i8] c"%%%d.%dfe+%2.2d\00"
@.str.1 = [16 x i8] c"%%%d.%dfe-%2.2d\00"
@.str.2 = [9 x i8] c"%%%d.%df\00"
define void @digit(i8* nocapture writeonly %0, float* nocapture writeonly %1, i32* nocapture writeonly %2, float %3, float %4, i32 %5) {
store i32 1, i32* %2
%7 = fpext float %4 to double
%8 = fpext float %3 to double
%9 = fsub double %7, %8
%10 = add nsw i32 %5, -1
%11 = sitofp i32 %10 to double
%12 = fdiv double %9, %11
%13 = tail call double @llvm.fabs.f64(double %8)
%14 = tail call double @llvm.fabs.f64(double %7)
%15 = fcmp ogt double %13, %14
%16 = select i1 %15, double %13, double %14
%17 = fmul double %16, 0x3EB0C6F7A0B5ED8D
%18 = fdiv double %17, %12
%19 = fcmp olt double %12, 1.000000e+00
br i1 %19, label %28, label %20
20: ; preds = %28, %6
%21 = phi i32 [ -1, %6 ], [ %32, %28 ]
%22 = phi double [ %12, %6 ], [ %31, %28 ]
%23 = tail call double @llvm.round.f64(double %22)
%24 = fsub double %23, %22
%25 = tail call double @llvm.fabs.f64(double %24)
%26 = fmul double %18, %22
%27 = fcmp ogt double %25, %26
br i1 %27, label %40, label %34
28: ; preds = %6, %28
%29 = phi double [ %31, %28 ], [ %12, %6 ]
%30 = phi i32 [ %32, %28 ], [ -1, %6 ]
%31 = fmul double %29, 1.000000e+01
%32 = add nsw i32 %30, -1
%33 = fcmp olt double %31, 1.000000e+00
br i1 %33, label %28, label %20
34: ; preds = %40, %20
%35 = phi double [ %26, %20 ], [ %48, %40 ]
%36 = phi double [ %25, %20 ], [ %47, %40 ]
%37 = phi i32 [ %21, %20 ], [ %44, %40 ]
%38 = phi double [ %22, %20 ], [ %43, %40 ]
%39 = fcmp olt double %36, %35
br i1 %39, label %50, label %60
40: ; preds = %20, %40
%41 = phi double [ %43, %40 ], [ %22, %20 ]
%42 = phi i32 [ %44, %40 ], [ %21, %20 ]
%43 = fmul double %41, 1.000000e+01
%44 = add nsw i32 %42, -1
%45 = tail call double @llvm.round.f64(double %43)
%46 = fsub double %45, %43
%47 = tail call double @llvm.fabs.f64(double %46)
%48 = fmul double %18, %43
%49 = fcmp ogt double %47, %48
br i1 %49, label %40, label %34
50: ; preds = %34, %50
%51 = phi double [ %53, %50 ], [ %38, %34 ]
%52 = phi i32 [ %54, %50 ], [ %37, %34 ]
%53 = fdiv double %51, 1.000000e+01
%54 = add nsw i32 %52, 1
%55 = tail call double @llvm.round.f64(double %53)
%56 = fsub double %55, %53
%57 = tail call double @llvm.fabs.f64(double %56)
%58 = fmul double %18, %53
%59 = fcmp olt double %57, %58
br i1 %59, label %50, label %60
60: ; preds = %50, %34
%61 = phi i32 [ %37, %34 ], [ %54, %50 ]
%62 = sub i32 0, %61
%63 = sitofp i32 %62 to double
%64 = tail call double @pow(double 1.000000e+01, double %63)
%65 = fmul double %13, %64
%66 = fmul double %14, %64
%67 = fcmp ogt double %65, %66
%68 = select i1 %67, double %65, double %66
%69 = fmul double %12, 1.000000e-01
%70 = tail call double @llvm.fmuladd.f64(double %69, double %64, double %68)
%71 = tail call double @log10(double %70)
%72 = fadd double %71, 1.000000e+00
%73 = fptosi double %72 to i32
%74 = icmp sgt i32 %61, 3
%75 = add i32 %61, %73
%76 = icmp slt i32 %75, -3
%77 = select i1 %74, i1 true, i1 %76
br i1 %77, label %78, label %120
78: ; preds = %60
%79 = add nsw i32 %73, -1
%80 = icmp sgt i32 %73, 1
%81 = zext i1 %80 to i32
%82 = fcmp olt float %3, 0.000000e+00
%83 = fcmp olt float %4, 0.000000e+00
%84 = or i1 %82, %83
%85 = zext i1 %84 to i32
%86 = add i32 %73, %85
%87 = add i32 %86, %81
%88 = sub i32 1, %75
%89 = sitofp i32 %88 to double
%90 = tail call double @pow(double 1.000000e+01, double %89)
%91 = fptrunc double %90 to float
store float %91, float* %1
br i1 %74, label %92, label %95
92: ; preds = %78
%93 = add nsw i32 %75, -1
%94 = tail call i32 (i8*, i8*, ...) @sprintf(i8* dereferenceable(1) %0, i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str, i64 0, i64 0), i32 %87, i32 %79, i32 %93)
br label %97
95: ; preds = %78
%96 = tail call i32 (i8*, i8*, ...) @sprintf(i8* dereferenceable(1) %0, i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @.str.1, i64 0, i64 0), i32 %87, i32 %79, i32 %88)
br label %97
97: ; preds = %95, %92
switch i32 %5, label %137 [
i32 3, label %98
i32 2, label %107
]
98: ; preds = %97
%99 = fmul double %64, %8
%100 = fptrunc double %99 to float
%101 = fcmp oeq float %100, -1.000000e+00
br i1 %101, label %102, label %137
102: ; preds = %98
%103 = fmul double %64, %7
%104 = fptrunc double %103 to float
%105 = fcmp oeq float %104, 1.000000e+00
br i1 %105, label %106, label %137
106: ; preds = %102
store i32 0, i32* %2
br label %137
107: ; preds = %97
%108 = fcmp oeq float %3, 0.000000e+00
br i1 %108, label %113, label %109
109: ; preds = %107
%110 = fmul double %64, %8
%111 = fptrunc double %110 to float
%112 = fcmp oeq float %111, -1.000000e+00
br i1 %112, label %113, label %137
113: ; preds = %109, %107
%114 = fcmp oeq float %4, 0.000000e+00
br i1 %114, label %119, label %115
115: ; preds = %113
%116 = fmul double %64, %7
%117 = fptrunc double %116 to float
%118 = fcmp oeq float %117, 1.000000e+00
br i1 %118, label %119, label %137
119: ; preds = %115, %113
store i32 0, i32* %2
br label %137
120: ; preds = %60
%121 = icmp sgt i32 %61, -1
br i1 %121, label %128, label %122
122: ; preds = %120
%123 = add nsw i32 %73, 1
%124 = icmp slt i32 %62, %73
%125 = sub nsw i32 1, %75
%126 = select i1 %124, i32 0, i32 %125
%127 = add nsw i32 %123, %126
br label %128
128: ; preds = %120, %122
%129 = phi i32 [ %127, %122 ], [ %75, %120 ]
%130 = phi i32 [ %62, %122 ], [ 0, %120 ]
%131 = fcmp olt float %3, 0.000000e+00
%132 = fcmp olt float %4, 0.000000e+00
%133 = or i1 %131, %132
%134 = zext i1 %133 to i32
%135 = add nsw i32 %129, %134
store float 1.000000e+00, float* %1
%136 = tail call i32 (i8*, i8*, ...) @sprintf(i8* dereferenceable(1) %0, i8* dereferenceable(1) getelementptr inbounds ([9 x i8], [9 x i8]* @.str.2, i64 0, i64 0), i32 %135, i32 %130)
br label %137
137: ; preds = %97, %106, %102, %98, %109, %115, %119, %128
ret void
}