#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 */
int fabs(double);
double floor(double);
scalar_t__ isdigit(char);
int log10(double);
double pow(int, int);
int /*<<< orphan*/ sprintf(char *, char *, ...);
int /*<<< orphan*/ strcpy(char *, char *);
int strlen(char *);
char *NumericDisplay(double in, int N, int SigFig, int latex) {
  static char format[16], outputA[128], outputB[128], outputC[128],
      outputD[128];
  double x, AccLevel;
  char *output;
  int DecimalLevel, DPmax, i, j, k, l;
  if (N == 0)
    output = outputA;
  else if (N == 1)
    output = outputB;
  else if (N == 2)
    output = outputC;
  else
    output = outputD;
  if ((fabs(in) < 1e10) && (fabs(in) > 1e-3)) {
    x = fabs(in);
    AccLevel = x * (1.0 + pow(10, -SigFig));
    DPmax = SigFig - log10(x);
    for (DecimalLevel = 0; DecimalLevel < DPmax; DecimalLevel++)
      if ((x - ((floor(x * pow(10, DecimalLevel)) / pow(10, DecimalLevel)) -
                x)) < AccLevel)
        break;
    sprintf(format, "%%.%df", DecimalLevel);
    sprintf(output, format, in);
  } else {
    if (in == 0) {
      sprintf(output, "0");
    } else {
      x = fabs(in);
      x /= pow(10, (int)log10(x));
      AccLevel = x * (1.0 + pow(10, -SigFig));
      for (DecimalLevel = 0; DecimalLevel < SigFig; DecimalLevel++)
        if ((x - ((floor(x * pow(10, DecimalLevel)) / pow(10, DecimalLevel)) -
                  x)) < AccLevel)
          break;
      sprintf(format, "%%.%de", DecimalLevel);
      sprintf(output, format, in);
      if (latex) {
        for (i = 0;
             ((output[i] != '\0') && (output[i] != 'e') && (output[i] != 'E'));
             i++)
          ;
        if (output[i] != '\0') {
          for (j = i, k = i + 32; output[j] != '\0'; j++)
            output[j + 32] = output[j];
          output[j + 32] = '\0';
          if ((i == 1) && (output[0] == '1')) {
            strcpy(output, "10^{");
            i = strlen(output);
          } else {
            strcpy(output + i, "\\times10^{");
            i += strlen(output + i);
          }
          k++;
          if (output[k] == '+')
            k++;
          for (l = 0, j = k; output[j] != '\0'; j++) {
            if ((output[j] > '0') && (output[j] <= '9'))
              l = 1;
            if ((l == 1) || (output[j] != '0'))
              output[i++] = output[j];
          }
          output[i++] = '}';
          output[i++] = '\0';
        }
      }
    }
  }
  for (i = 0; ((output[i] != '\0') && (output[i] != '.')); i++)
    ;
  if (output[i] != '.')
    return output;
  for (j = i + 1; isdigit(output[j]); j++)
    ;
  if (i == j)
    return output;
  for (k = j - 1; output[k] == '0'; k--)
    ;
  if (k == i)
    k--;
  k++;
  if (k == j)
    return output;
  for (l = 0; output[j + l] != '\0'; l++)
    output[k + l] = output[j + l];
  output[k + l] = '\0';
  return output;
}


x86 assembly (clang, -O0):
<NumericDisplay>:
push   %rbp
mov    %rsp,%rbp
sub    $0xa0,%rsp
movsd  %xmm0,-0x10(%rbp)
mov    %edi,-0x14(%rbp)
mov    %esi,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
cmpl   $0x0,-0x14(%rbp)
jne    11b3 <NumericDisplay+0x33>
lea    0x2ed6(%rip),%rax
mov    %rax,-0x38(%rbp)
jmp    11fc <NumericDisplay+0x7c>
cmpl   $0x1,-0x14(%rbp)
jne    11cd <NumericDisplay+0x4d>
lea    0x2f3c(%rip),%rax
mov    %rax,-0x38(%rbp)
jmp    11f7 <NumericDisplay+0x77>
cmpl   $0x2,-0x14(%rbp)
jne    11e7 <NumericDisplay+0x67>
lea    0x2fa2(%rip),%rax
mov    %rax,-0x38(%rbp)
jmp    11f2 <NumericDisplay+0x72>
lea    0x3012(%rip),%rax
mov    %rax,-0x38(%rbp)
jmp    11f7 <NumericDisplay+0x77>
jmp    11fc <NumericDisplay+0x7c>
movsd  -0x10(%rbp),%xmm0
call   1060 <fabs@plt>
cvtsi2sd %eax,%xmm1
movsd  0xdee(%rip),%xmm0
ucomisd %xmm1,%xmm0
jbe    136b <NumericDisplay+0x1eb>
movsd  -0x10(%rbp),%xmm0
call   1060 <fabs@plt>
cvtsi2sd %eax,%xmm0
movsd  0xdd6(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    136b <NumericDisplay+0x1eb>
movsd  -0x10(%rbp),%xmm0
call   1060 <fabs@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x60(%rbp)
xor    %esi,%esi
sub    -0x18(%rbp),%esi
mov    $0xa,%edi
call   1070 <pow@plt>
movaps %xmm0,%xmm2
movsd  -0x60(%rbp),%xmm0
movsd  0xd98(%rip),%xmm1
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
mov    -0x18(%rbp),%eax
mov    %eax,-0x54(%rbp)
movsd  -0x28(%rbp),%xmm0
call   1080 <log10@plt>
mov    %eax,%ecx
mov    -0x54(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x40(%rbp)
movl   $0x0,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x40(%rbp),%eax
jge    1337 <NumericDisplay+0x1b7>
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x70(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x3c(%rbp),%esi
mov    $0xa,%edi
call   1070 <pow@plt>
movaps %xmm0,%xmm1
movsd  -0x78(%rbp),%xmm0
mulsd  %xmm1,%xmm0
call   10a0 <floor@plt>
movsd  %xmm0,-0x68(%rbp)
mov    -0x3c(%rbp),%esi
mov    $0xa,%edi
call   1070 <pow@plt>
movsd  -0x70(%rbp),%xmm1
movaps %xmm0,%xmm2
movsd  -0x68(%rbp),%xmm0
divsd  %xmm2,%xmm0
subsd  -0x28(%rbp),%xmm0
subsd  %xmm0,%xmm1
movsd  -0x30(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    1324 <NumericDisplay+0x1a4>
jmp    1337 <NumericDisplay+0x1b7>
jmp    1329 <NumericDisplay+0x1a9>
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    12a6 <NumericDisplay+0x126>
mov    -0x3c(%rbp),%edx
lea    0x2d2f(%rip),%rdi
lea    0xcd0(%rip),%rsi
mov    $0x0,%al
call   1090 <sprintf@plt>
mov    -0x38(%rbp),%rdi
movsd  -0x10(%rbp),%xmm0
lea    0x2d11(%rip),%rsi
mov    $0x1,%al
call   1090 <sprintf@plt>
jmp    174e <NumericDisplay+0x5ce>
movsd  -0x10(%rbp),%xmm0
xorps  %xmm1,%xmm1
ucomisd %xmm1,%xmm0
jne    139a <NumericDisplay+0x21a>
jp     139a <NumericDisplay+0x21a>
mov    -0x38(%rbp),%rdi
lea    0xc91(%rip),%rsi
mov    $0x0,%al
call   1090 <sprintf@plt>
jmp    1749 <NumericDisplay+0x5c9>
movsd  -0x10(%rbp),%xmm0
call   1060 <fabs@plt>
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
call   1080 <log10@plt>
mov    %eax,%esi
mov    $0xa,%edi
call   1070 <pow@plt>
movaps %xmm0,%xmm1
movsd  -0x28(%rbp),%xmm0
divsd  %xmm1,%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x80(%rbp)
xor    %esi,%esi
sub    -0x18(%rbp),%esi
mov    $0xa,%edi
call   1070 <pow@plt>
movaps %xmm0,%xmm2
movsd  -0x80(%rbp),%xmm0
movsd  0xc13(%rip),%xmm1
addsd  %xmm2,%xmm1
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x30(%rbp)
movl   $0x0,-0x3c(%rbp)
mov    -0x3c(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    14b4 <NumericDisplay+0x334>
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x28(%rbp),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
mov    -0x3c(%rbp),%esi
mov    $0xa,%edi
call   1070 <pow@plt>
movaps %xmm0,%xmm1
movsd  -0x98(%rbp),%xmm0
ff
mulsd  %xmm1,%xmm0
call   10a0 <floor@plt>
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x3c(%rbp),%esi
mov    $0xa,%edi
call   1070 <pow@plt>
movsd  -0x90(%rbp),%xmm1
ff
movaps %xmm0,%xmm2
movsd  -0x88(%rbp),%xmm0
ff
divsd  %xmm2,%xmm0
subsd  -0x28(%rbp),%xmm0
subsd  %xmm0,%xmm1
movsd  -0x30(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    14a1 <NumericDisplay+0x321>
jmp    14b4 <NumericDisplay+0x334>
jmp    14a6 <NumericDisplay+0x326>
mov    -0x3c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x3c(%rbp)
jmp    1411 <NumericDisplay+0x291>
mov    -0x3c(%rbp),%edx
lea    0x2bb2(%rip),%rdi
lea    0xb5c(%rip),%rsi
mov    $0x0,%al
call   1090 <sprintf@plt>
mov    -0x38(%rbp),%rdi
movsd  -0x10(%rbp),%xmm0
lea    0x2b94(%rip),%rsi
mov    $0x1,%al
call   1090 <sprintf@plt>
cmpl   $0x0,-0x1c(%rbp)
je     1744 <NumericDisplay+0x5c4>
movl   $0x0,-0x44(%rbp)
mov    -0x38(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x99(%rbp)
je     1546 <NumericDisplay+0x3c6>
mov    -0x38(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x65,%ecx
mov    %al,-0x99(%rbp)
je     1546 <NumericDisplay+0x3c6>
mov    -0x38(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x45,%eax
setne  %al
mov    %al,-0x99(%rbp)
mov    -0x99(%rbp),%al
test   $0x1,%al
jne    1559 <NumericDisplay+0x3d9>
jmp    156c <NumericDisplay+0x3ec>
jmp    155e <NumericDisplay+0x3de>
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    14f4 <NumericDisplay+0x374>
mov    -0x38(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     173f <NumericDisplay+0x5bf>
mov    -0x44(%rbp),%eax
mov    %eax,-0x48(%rbp)
mov    -0x44(%rbp),%eax
add    $0x20,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x38(%rbp),%rax
movslq -0x48(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     15ce <NumericDisplay+0x44e>
mov    -0x38(%rbp),%rax
movslq -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x38(%rbp),%rax
mov    -0x48(%rbp),%ecx
add    $0x20,%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    1590 <NumericDisplay+0x410>
mov    -0x38(%rbp),%rax
mov    -0x48(%rbp),%ecx
add    $0x20,%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
cmpl   $0x1,-0x44(%rbp)
jne    161a <NumericDisplay+0x49a>
mov    -0x38(%rbp),%rax
movsbl (%rax),%eax
cmp    $0x31,%eax
jne    161a <NumericDisplay+0x49a>
mov    -0x38(%rbp),%rdi
lea    0xa2a(%rip),%rsi
call   1040 <strcpy@plt>
mov    -0x38(%rbp),%rdi
call   1050 <strlen@plt>
mov    %eax,-0x44(%rbp)
jmp    1647 <NumericDisplay+0x4c7>
mov    -0x38(%rbp),%rdi
movslq -0x44(%rbp),%rax
add    %rax,%rdi
lea    0x9fc(%rip),%rsi
call   1040 <strcpy@plt>
mov    -0x38(%rbp),%rdi
movslq -0x44(%rbp),%rax
add    %rax,%rdi
call   1050 <strlen@plt>
add    -0x44(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x38(%rbp),%rax
movslq -0x4c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2b,%eax
jne    166e <NumericDisplay+0x4ee>
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
movl   $0x0,-0x50(%rbp)
mov    -0x4c(%rbp),%eax
mov    %eax,-0x48(%rbp)
mov    -0x38(%rbp),%rax
movslq -0x48(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     1713 <NumericDisplay+0x593>
mov    -0x38(%rbp),%rax
movslq -0x48(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jle    16c1 <NumericDisplay+0x541>
mov    -0x38(%rbp),%rax
movslq -0x48(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x39,%eax
jg     16c1 <NumericDisplay+0x541>
movl   $0x1,-0x50(%rbp)
cmpl   $0x1,-0x50(%rbp)
je     16e0 <NumericDisplay+0x560>
mov    -0x38(%rbp),%rax
movslq -0x48(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
je     1700 <NumericDisplay+0x580>
mov    -0x38(%rbp),%rax
movslq -0x48(%rbp),%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x38(%rbp),%rax
mov    -0x44(%rbp),%ecx
mov    %ecx,%esi
add    $0x1,%esi
mov    %esi,-0x44(%rbp)
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
jmp    1705 <NumericDisplay+0x585>
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    167b <NumericDisplay+0x4fb>
mov    -0x38(%rbp),%rax
mov    -0x44(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x44(%rbp)
movslq %ecx,%rcx
movb   $0x7d,(%rax,%rcx,1)
mov    -0x38(%rbp),%rax
mov    -0x44(%rbp),%ecx
mov    %ecx,%edx
add    $0x1,%edx
mov    %edx,-0x44(%rbp)
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
jmp    1744 <NumericDisplay+0x5c4>
jmp    1749 <NumericDisplay+0x5c9>
jmp    174e <NumericDisplay+0x5ce>
movl   $0x0,-0x44(%rbp)
mov    -0x38(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsbl (%rax,%rcx,1),%ecx
xor    %eax,%eax
cmp    $0x0,%ecx
mov    %al,-0x9a(%rbp)
je     178a <NumericDisplay+0x60a>
mov    -0x38(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2e,%eax
setne  %al
mov    %al,-0x9a(%rbp)
mov    -0x9a(%rbp),%al
test   $0x1,%al
jne    179d <NumericDisplay+0x61d>
jmp    17b0 <NumericDisplay+0x630>
jmp    17a2 <NumericDisplay+0x622>
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    1755 <NumericDisplay+0x5d5>
mov    -0x38(%rbp),%rax
movslq -0x44(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x2e,%eax
je     17d2 <NumericDisplay+0x652>
mov    -0x38(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    18f2 <NumericDisplay+0x772>
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
mov    -0x38(%rbp),%rax
movslq -0x48(%rbp),%rcx
movsbl (%rax,%rcx,1),%edi
call   1030 <isdigit@plt>
cmp    $0x0,%rax
je     1809 <NumericDisplay+0x689>
jmp    17fb <NumericDisplay+0x67b>
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    17db <NumericDisplay+0x65b>
mov    -0x44(%rbp),%eax
cmp    -0x48(%rbp),%eax
jne    1822 <NumericDisplay+0x6a2>
mov    -0x38(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    18f2 <NumericDisplay+0x772>
mov    -0x48(%rbp),%eax
sub    $0x1,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x38(%rbp),%rax
movslq -0x4c(%rbp),%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x30,%eax
jne    1853 <NumericDisplay+0x6d3>
jmp    1845 <NumericDisplay+0x6c5>
mov    -0x4c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x4c(%rbp)
jmp    182b <NumericDisplay+0x6ab>
mov    -0x4c(%rbp),%eax
cmp    -0x44(%rbp),%eax
jne    1868 <NumericDisplay+0x6e8>
mov    -0x4c(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x4c(%rbp)
mov    -0x4c(%rbp),%eax
cmp    -0x48(%rbp),%eax
jne    188a <NumericDisplay+0x70a>
mov    -0x38(%rbp),%rax
mov    %rax,-0x8(%rbp)
jmp    18f2 <NumericDisplay+0x772>
movl   $0x0,-0x50(%rbp)
mov    -0x38(%rbp),%rax
mov    -0x48(%rbp),%ecx
add    -0x50(%rbp),%ecx
movslq %ecx,%rcx
movsbl (%rax,%rcx,1),%eax
cmp    $0x0,%eax
je     18d9 <NumericDisplay+0x759>
mov    -0x38(%rbp),%rax
mov    -0x48(%rbp),%ecx
add    -0x50(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,1),%dl
mov    -0x38(%rbp),%rax
mov    -0x4c(%rbp),%ecx
add    -0x50(%rbp),%ecx
movslq %ecx,%rcx
mov    %dl,(%rax,%rcx,1)
mov    -0x50(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x50(%rbp)
jmp    1891 <NumericDisplay+0x711>
mov    -0x38(%rbp),%rax
mov    -0x4c(%rbp),%ecx
add    -0x50(%rbp),%ecx
movslq %ecx,%rcx
movb   $0x0,(%rax,%rcx,1)
mov    -0x38(%rbp),%rax
mov    %rax,-0x8(%rbp)
mov    -0x8(%rbp),%rax
add    $0xa0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<NumericDisplay>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0x20,%rsp
mov    %edx,%r14d
mov    %esi,%ebx
cmp    $0x2,%edi
ja     11a6 <NumericDisplay+0x26>
movslq %edi,%rax
lea    0x2c68(%rip),%rcx
mov    (%rcx,%rax,8),%r15
jmp    11ad <NumericDisplay+0x2d>
lea    0x3053(%rip),%r15
movsd  %xmm0,0x8(%rsp)
call   1060 <fabs@plt>
movsd  0x8(%rsp),%xmm0
call   1060 <fabs@plt>
test   %eax,%eax
jle    128a <NumericDisplay+0x10a>
movsd  0x8(%rsp),%xmm0
call   1060 <fabs@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  %xmm0,(%rsp)
mov    %ebx,%esi
neg    %esi
mov    $0xa,%edi
call   1070 <pow@plt>
movsd  %xmm0,0x10(%rsp)
movsd  (%rsp),%xmm0
call   1080 <log10@plt>
sub    %eax,%ebx
test   %ebx,%ebx
jle    12ac <NumericDisplay+0x12c>
movsd  0x10(%rsp),%xmm0
addsd  0xde8(%rip),%xmm0
movsd  (%rsp),%xmm1
mulsd  %xmm1,%xmm0
xor    %ebp,%ebp
movsd  %xmm0,0x10(%rsp)
nopl   0x0(%rax)
mov    $0xa,%edi
mov    %ebp,%esi
call   1070 <pow@plt>
mulsd  (%rsp),%xmm0
call   10a0 <floor@plt>
movsd  %xmm0,0x18(%rsp)
mov    $0xa,%edi
mov    %ebp,%esi
call   1070 <pow@plt>
movsd  (%rsp),%xmm1
movsd  0x18(%rsp),%xmm2
divsd  %xmm0,%xmm2
movapd %xmm1,%xmm0
subsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
movsd  0x10(%rsp),%xmm2
ucomisd %xmm0,%xmm2
ja     12ae <NumericDisplay+0x12e>
add    $0x1,%ebp
cmp    %ebp,%ebx
jne    1230 <NumericDisplay+0xb0>
mov    %ebx,%ebp
jmp    12ae <NumericDisplay+0x12e>
xorpd  %xmm0,%xmm0
movsd  0x8(%rsp),%xmm1
ucomisd %xmm0,%xmm1
jne    13ab <NumericDisplay+0x22b>
jp     13ab <NumericDisplay+0x22b>
movw   $0x30,(%r15)
jmp    12db <NumericDisplay+0x15b>
xor    %ebp,%ebp
lea    0x2dbb(%rip),%rbx
lea    0xd4c(%rip),%rsi
mov    %rbx,%rdi
mov    %ebp,%edx
xor    %eax,%eax
call   1090 <sprintf@plt>
mov    %r15,%rdi
mov    %rbx,%rsi
movsd  0x8(%rsp),%xmm0
mov    $0x1,%al
call   1090 <sprintf@plt>
xor    %r14d,%r14d
xchg   %ax,%ax
movzbl (%r15,%r14,1),%eax
test   %al,%al
je     1488 <NumericDisplay+0x308>
cmp    $0x2e,%al
je     12f7 <NumericDisplay+0x177>
add    $0x1,%r14
jmp    12e0 <NumericDisplay+0x160>
mov    %r14d,%eax
lea    (%r15,%rax,1),%r12
add    $0x1,%r12
mov    %r14d,%ebx
not    %ebx
xor    %ebp,%ebp
nopl   0x0(%rax)
movsbl (%r12,%rbp,1),%edi
call   1030 <isdigit@plt>
add    $0x1,%rbp
add    $0xffffffff,%ebx
test   %rax,%rax
jne    1310 <NumericDisplay+0x190>
test   %ebp,%ebp
je     1488 <NumericDisplay+0x308>
mov    %rbp,%rax
neg    %rax
mov    %r14d,%ecx
add    %rbp,%rcx
lea    (%r14,%rbp,1),%edx
add    $0xffffffff,%edx
movslq %edx,%rdx
add    %r15,%rdx
mov    $0xffffffff,%esi
nopl   0x0(%rax)
add    $0x1,%ebx
add    $0x1,%esi
add    $0x1,%eax
cmpb   $0x30,(%rdx)
lea    -0x1(%rdx),%rdx
je     1350 <NumericDisplay+0x1d0>
cmp    $0x1,%eax
sbb    %eax,%eax
cmp    %esi,%eax
je     1488 <NumericDisplay+0x308>
mov    %ecx,%ecx
mov    (%r15,%rcx,1),%dl
test   %dl,%dl
je     147a <NumericDisplay+0x2fa>
mov    %eax,%ecx
sub    %ebx,%ecx
movslq %ecx,%rcx
add    %r15,%rcx
mov    %r14d,%edi
add    %rbp,%rdi
xor    %esi,%esi
nop
mov    %dl,(%rcx,%rsi,1)
lea    (%rdi,%rsi,1),%edx
add    $0x1,%edx
add    $0x1,%rsi
movzbl (%r15,%rdx,1),%edx
test   %dl,%dl
jne    1390 <NumericDisplay+0x210>
jmp    147c <NumericDisplay+0x2fc>
movapd %xmm1,%xmm0
call   1060 <fabs@plt>
xorps  %xmm0,%xmm0
cvtsi2sd %eax,%xmm0
movsd  %xmm0,(%rsp)
call   1080 <log10@plt>
mov    $0xa,%edi
mov    %eax,%esi
call   1070 <pow@plt>
movsd  %xmm0,0x18(%rsp)
mov    %ebx,%esi
neg    %esi
mov    $0xa,%edi
call   1070 <pow@plt>
test   %ebx,%ebx
jle    1498 <NumericDisplay+0x318>
movsd  (%rsp),%xmm1
divsd  0x18(%rsp),%xmm1
addsd  0xc00(%rip),%xmm0
mulsd  %xmm1,%xmm0
xor    %ebp,%ebp
movsd  %xmm1,(%rsp)
movsd  %xmm0,0x10(%rsp)
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
mov    $0xa,%edi
mov    %ebp,%esi
call   1070 <pow@plt>
mulsd  (%rsp),%xmm0
call   10a0 <floor@plt>
movsd  %xmm0,0x18(%rsp)
mov    $0xa,%edi
mov    %ebp,%esi
call   1070 <pow@plt>
movsd  (%rsp),%xmm1
movsd  0x18(%rsp),%xmm2
divsd  %xmm0,%xmm2
subsd  %xmm1,%xmm2
movapd %xmm1,%xmm0
subsd  %xmm2,%xmm0
movsd  0x10(%rsp),%xmm2
ucomisd %xmm0,%xmm2
ja     149a <NumericDisplay+0x31a>
add    $0x1,%ebp
cmp    %ebp,%ebx
jne    1420 <NumericDisplay+0x2a0>
mov    %ebx,%ebp
jmp    149a <NumericDisplay+0x31a>
xor    %esi,%esi
add    %eax,%esi
sub    %ebx,%esi
movslq %esi,%rax
movb   $0x0,(%r15,%rax,1)
mov    %r15,%rax
add    $0x20,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret
xor    %ebp,%ebp
lea    0x2bcf(%rip),%rbx
lea    0xb67(%rip),%rsi
mov    %rbx,%rdi
mov    %ebp,%edx
xor    %eax,%eax
call   1090 <sprintf@plt>
mov    %r15,%rdi
mov    %rbx,%rsi
movsd  0x8(%rsp),%xmm0
mov    $0x1,%al
call   1090 <sprintf@plt>
test   %r14d,%r14d
je     12db <NumericDisplay+0x15b>
xor    %ebp,%ebp
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movzbl (%r15,%rbp,1),%eax
test   %al,%al
je     12db <NumericDisplay+0x15b>
cmp    $0x65,%al
je     14fb <NumericDisplay+0x37b>
cmp    $0x45,%al
je     14fb <NumericDisplay+0x37b>
add    $0x1,%rbp
jmp    14e0 <NumericDisplay+0x360>
mov    %ebp,%ebx
mov    (%r15,%rbx,1),%cl
mov    %rbp,%rax
test   %cl,%cl
je     1523 <NumericDisplay+0x3a3>
mov    %rbx,%rax
nopl   0x0(%rax,%rax,1)
mov    %cl,0x20(%r15,%rax,1)
movzbl 0x1(%r15,%rax,1),%ecx
add    $0x1,%rax
test   %cl,%cl
jne    1510 <NumericDisplay+0x390>
add    $0x20,%eax
movb   $0x0,(%r15,%rax,1)
cmp    $0x1,%ebp
jne    1554 <NumericDisplay+0x3d4>
cmpb   $0x31,(%r15)
jne    1554 <NumericDisplay+0x3d4>
lea    0xadf(%rip),%rsi
mov    %r15,%rdi
call   1040 <strcpy@plt>
mov    %r15,%rdi
call   1050 <strlen@plt>
mov    $0x22,%ecx
jmp    1573 <NumericDisplay+0x3f3>
add    %r15,%rbx
lea    0xab8(%rip),%rsi
mov    %rbx,%rdi
call   1040 <strcpy@plt>
mov    %rbx,%rdi
call   1050 <strlen@plt>
add    %ebp,%eax
lea    0x21(%rbp),%ecx
mov    %ecx,%edx
add    $0x22,%ebp
cmpb   $0x2b,(%r15,%rdx,1)
cmovne %ecx,%ebp
mov    (%r15,%rbp,1),%dil
test   %dil,%dil
je     15cd <NumericDisplay+0x44d>
lea    (%r15,%rbp,1),%rcx
add    $0x1,%rcx
xor    %edx,%edx
mov    $0x1,%esi
jmp    15b6 <NumericDisplay+0x436>
nopw   0x0(%rax,%rax,1)
movslq %eax,%rbp
add    $0x1,%eax
mov    %dil,(%r15,%rbp,1)
movzbl (%rcx),%edi
add    $0x1,%rcx
test   %dil,%dil
je     15cd <NumericDisplay+0x44d>
lea    -0x31(%rdi),%ebp
cmp    $0x9,%bpl
cmovb  %esi,%edx
cmp    $0x1,%edx
je     15a0 <NumericDisplay+0x420>
cmp    $0x30,%dil
je     15aa <NumericDisplay+0x42a>
jmp    15a0 <NumericDisplay+0x420>
cltq
movw   $0x7d,(%r15,%rax,1)
jmp    12db <NumericDisplay+0x15b>

LLVM IR (-O0):
@NumericDisplay.format = internal global [16 x i8] zeroinitializer
@NumericDisplay.outputA = internal global [128 x i8] zeroinitializer
@NumericDisplay.outputB = internal global [128 x i8] zeroinitializer
@NumericDisplay.outputC = internal global [128 x i8] zeroinitializer
@NumericDisplay.outputD = internal global [128 x i8] zeroinitializer
@.str = [7 x i8] c"%%.%df\00"
@.str.1 = [2 x i8] c"0\00"
@.str.2 = [7 x i8] c"%%.%de\00"
@.str.3 = [5 x i8] c"10^{\00"
@.str.4 = [11 x i8] c"\\times10^{\00"
define i8* @NumericDisplay(double %0, i32 %1, i32 %2, i32 %3) {
%5 = alloca i8*
%6 = alloca double
%7 = alloca i32
%8 = alloca i32
%9 = alloca i32
%10 = alloca double
%11 = alloca double
%12 = alloca i8*
%13 = alloca i32
%14 = alloca i32
%15 = alloca i32
%16 = alloca i32
%17 = alloca i32
%18 = alloca i32
store double %0, double* %6
store i32 %1, i32* %7
store i32 %2, i32* %8
store i32 %3, i32* %9
%19 = load i32, i32* %7
%20 = icmp eq i32 %19, 0
br i1 %20, label %21, label %22
21: ; preds = %4
store i8* getelementptr inbounds ([128 x i8], [128 x i8]* @NumericDisplay.outputA, i64 0, i64 0), i8** %12
br label %33
22: ; preds = %4
%23 = load i32, i32* %7
%24 = icmp eq i32 %23, 1
br i1 %24, label %25, label %26
25: ; preds = %22
store i8* getelementptr inbounds ([128 x i8], [128 x i8]* @NumericDisplay.outputB, i64 0, i64 0), i8** %12
br label %32
26: ; preds = %22
%27 = load i32, i32* %7
%28 = icmp eq i32 %27, 2
br i1 %28, label %29, label %30
29: ; preds = %26
store i8* getelementptr inbounds ([128 x i8], [128 x i8]* @NumericDisplay.outputC, i64 0, i64 0), i8** %12
br label %31
30: ; preds = %26
store i8* getelementptr inbounds ([128 x i8], [128 x i8]* @NumericDisplay.outputD, i64 0, i64 0), i8** %12
br label %31
31: ; preds = %30, %29
br label %32
32: ; preds = %31, %25
br label %33
33: ; preds = %32, %21
%34 = load double, double* %6
%35 = call i32 @fabs(double %34)
%36 = sitofp i32 %35 to double
%37 = fcmp olt double %36, 1.000000e+10
br i1 %37, label %38, label %87
38: ; preds = %33
%39 = load double, double* %6
%40 = call i32 @fabs(double %39)
%41 = sitofp i32 %40 to double
%42 = fcmp ogt double %41, 1.000000e-03
br i1 %42, label %43, label %87
43: ; preds = %38
%44 = load double, double* %6
%45 = call i32 @fabs(double %44)
%46 = sitofp i32 %45 to double
store double %46, double* %10
%47 = load double, double* %10
%48 = load i32, i32* %8
%49 = sub nsw i32 0, %48
%50 = call double @pow(i32 10, i32 %49)
%51 = fadd double 1.000000e+00, %50
%52 = fmul double %47, %51
store double %52, double* %11
%53 = load i32, i32* %8
%54 = load double, double* %10
%55 = call i32 @log10(double %54)
%56 = sub nsw i32 %53, %55
store i32 %56, i32* %14
store i32 0, i32* %13
br label %57
57: ; preds = %78, %43
%58 = load i32, i32* %13
%59 = load i32, i32* %14
%60 = icmp slt i32 %58, %59
br i1 %60, label %61, label %81
61: ; preds = %57
%62 = load double, double* %10
%63 = load double, double* %10
%64 = load i32, i32* %13
%65 = call double @pow(i32 10, i32 %64)
%66 = fmul double %63, %65
%67 = call double @llvm.floor.f64(double %66)
%68 = load i32, i32* %13
%69 = call double @pow(i32 10, i32 %68)
%70 = fdiv double %67, %69
%71 = load double, double* %10
%72 = fsub double %70, %71
%73 = fsub double %62, %72
%74 = load double, double* %11
%75 = fcmp olt double %73, %74
br i1 %75, label %76, label %77
76: ; preds = %61
br label %81
77: ; preds = %61
br label %78
78: ; preds = %77
%79 = load i32, i32* %13
%80 = add nsw i32 %79, 1
store i32 %80, i32* %13
br label %57
81: ; preds = %76, %57
%82 = load i32, i32* %13
%83 = call i32 (i8*, i8*, ...) @sprintf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @NumericDisplay.format, i64 0, i64 0), i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i64 0, i64 0), i32 %82)
%84 = load i8*, i8** %12
%85 = load double, double* %6
%86 = call i32 (i8*, i8*, ...) @sprintf(i8* %84, i8* getelementptr inbounds ([16 x i8], [16 x i8]* @NumericDisplay.format, i64 0, i64 0), double %85)
br label %317
87: ; preds = %38, %33
%88 = load double, double* %6
%89 = fcmp oeq double %88, 0.000000e+00
br i1 %89, label %90, label %93
90: ; preds = %87
%91 = load i8*, i8** %12
%92 = call i32 (i8*, i8*, ...) @sprintf(i8* %91, i8* getelementptr inbounds ([2 x i8], [2 x i8]* @.str.1, i64 0, i64 0))
br label %316
93: ; preds = %87
%94 = load double, double* %6
%95 = call i32 @fabs(double %94)
%96 = sitofp i32 %95 to double
store double %96, double* %10
%97 = load double, double* %10
%98 = call i32 @log10(double %97)
%99 = call double @pow(i32 10, i32 %98)
%100 = load double, double* %10
%101 = fdiv double %100, %99
store double %101, double* %10
%102 = load double, double* %10
%103 = load i32, i32* %8
%104 = sub nsw i32 0, %103
%105 = call double @pow(i32 10, i32 %104)
%106 = fadd double 1.000000e+00, %105
%107 = fmul double %102, %106
store double %107, double* %11
store i32 0, i32* %13
br label %108
108: ; preds = %129, %93
%109 = load i32, i32* %13
%110 = load i32, i32* %8
%111 = icmp slt i32 %109, %110
br i1 %111, label %112, label %132
112: ; preds = %108
%113 = load double, double* %10
%114 = load double, double* %10
%115 = load i32, i32* %13
%116 = call double @pow(i32 10, i32 %115)
%117 = fmul double %114, %116
%118 = call double @llvm.floor.f64(double %117)
%119 = load i32, i32* %13
%120 = call double @pow(i32 10, i32 %119)
%121 = fdiv double %118, %120
%122 = load double, double* %10
%123 = fsub double %121, %122
%124 = fsub double %113, %123
%125 = load double, double* %11
%126 = fcmp olt double %124, %125
br i1 %126, label %127, label %128
127: ; preds = %112
br label %132
128: ; preds = %112
br label %129
129: ; preds = %128
%130 = load i32, i32* %13
%131 = add nsw i32 %130, 1
store i32 %131, i32* %13
br label %108
132: ; preds = %127, %108
%133 = load i32, i32* %13
%134 = call i32 (i8*, i8*, ...) @sprintf(i8* getelementptr inbounds ([16 x i8], [16 x i8]* @NumericDisplay.format, i64 0, i64 0), i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str.2, i64 0, i64 0), i32 %133)
%135 = load i8*, i8** %12
%136 = load double, double* %6
%137 = call i32 (i8*, i8*, ...) @sprintf(i8* %135, i8* getelementptr inbounds ([16 x i8], [16 x i8]* @NumericDisplay.format, i64 0, i64 0), double %136)
%138 = load i32, i32* %9
%139 = icmp ne i32 %138, 0
br i1 %139, label %140, label %315
140: ; preds = %132
store i32 0, i32* %15
br label %141
141: ; preds = %168, %140
%142 = load i8*, i8** %12
%143 = load i32, i32* %15
%144 = sext i32 %143 to i64
%145 = getelementptr inbounds i8, i8* %142, i64 %144
%146 = load i8, i8* %145
%147 = sext i8 %146 to i32
%148 = icmp ne i32 %147, 0
br i1 %148, label %149, label %165
149: ; preds = %141
%150 = load i8*, i8** %12
%151 = load i32, i32* %15
%152 = sext i32 %151 to i64
%153 = getelementptr inbounds i8, i8* %150, i64 %152
%154 = load i8, i8* %153
%155 = sext i8 %154 to i32
%156 = icmp ne i32 %155, 101
br i1 %156, label %157, label %165
157: ; preds = %149
%158 = load i8*, i8** %12
%159 = load i32, i32* %15
%160 = sext i32 %159 to i64
%161 = getelementptr inbounds i8, i8* %158, i64 %160
%162 = load i8, i8* %161
%163 = sext i8 %162 to i32
%164 = icmp ne i32 %163, 69
br label %165
165: ; preds = %157, %149, %141
%166 = phi i1 [ false, %149 ], [ false, %141 ], [ %164, %157 ]
br i1 %166, label %167, label %171
167: ; preds = %165
br label %168
168: ; preds = %167
%169 = load i32, i32* %15
%170 = add nsw i32 %169, 1
store i32 %170, i32* %15
br label %141
171: ; preds = %165
%172 = load i8*, i8** %12
%173 = load i32, i32* %15
%174 = sext i32 %173 to i64
%175 = getelementptr inbounds i8, i8* %172, i64 %174
%176 = load i8, i8* %175
%177 = sext i8 %176 to i32
%178 = icmp ne i32 %177, 0
br i1 %178, label %179, label %314
179: ; preds = %171
%180 = load i32, i32* %15
store i32 %180, i32* %16
%181 = load i32, i32* %15
%182 = add nsw i32 %181, 32
store i32 %182, i32* %17
br label %183
183: ; preds = %202, %179
%184 = load i8*, i8** %12
%185 = load i32, i32* %16
%186 = sext i32 %185 to i64
%187 = getelementptr inbounds i8, i8* %184, i64 %186
%188 = load i8, i8* %187
%189 = sext i8 %188 to i32
%190 = icmp ne i32 %189, 0
br i1 %190, label %191, label %205
191: ; preds = %183
%192 = load i8*, i8** %12
%193 = load i32, i32* %16
%194 = sext i32 %193 to i64
%195 = getelementptr inbounds i8, i8* %192, i64 %194
%196 = load i8, i8* %195
%197 = load i8*, i8** %12
%198 = load i32, i32* %16
%199 = add nsw i32 %198, 32
%200 = sext i32 %199 to i64
%201 = getelementptr inbounds i8, i8* %197, i64 %200
store i8 %196, i8* %201
br label %202
202: ; preds = %191
%203 = load i32, i32* %16
%204 = add nsw i32 %203, 1
store i32 %204, i32* %16
br label %183
205: ; preds = %183
%206 = load i8*, i8** %12
%207 = load i32, i32* %16
%208 = add nsw i32 %207, 32
%209 = sext i32 %208 to i64
%210 = getelementptr inbounds i8, i8* %206, i64 %209
store i8 0, i8* %210
%211 = load i32, i32* %15
%212 = icmp eq i32 %211, 1
br i1 %212, label %213, label %224
213: ; preds = %205
%214 = load i8*, i8** %12
%215 = getelementptr inbounds i8, i8* %214, i64 0
%216 = load i8, i8* %215
%217 = sext i8 %216 to i32
%218 = icmp eq i32 %217, 49
br i1 %218, label %219, label %224
219: ; preds = %213
%220 = load i8*, i8** %12
%221 = call i32 @strcpy(i8* %220, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.3, i64 0, i64 0))
%222 = load i8*, i8** %12
%223 = call i32 @strlen(i8* %222)
store i32 %223, i32* %15
br label %237
224: ; preds = %213, %205
%225 = load i8*, i8** %12
%226 = load i32, i32* %15
%227 = sext i32 %226 to i64
%228 = getelementptr inbounds i8, i8* %225, i64 %227
%229 = call i32 @strcpy(i8* %228, i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.4, i64 0, i64 0))
%230 = load i8*, i8** %12
%231 = load i32, i32* %15
%232 = sext i32 %231 to i64
%233 = getelementptr inbounds i8, i8* %230, i64 %232
%234 = call i32 @strlen(i8* %233)
%235 = load i32, i32* %15
%236 = add nsw i32 %235, %234
store i32 %236, i32* %15
br label %237
237: ; preds = %224, %219
%238 = load i32, i32* %17
%239 = add nsw i32 %238, 1
store i32 %239, i32* %17
%240 = load i8*, i8** %12
%241 = load i32, i32* %17
%242 = sext i32 %241 to i64
%243 = getelementptr inbounds i8, i8* %240, i64 %242
%244 = load i8, i8* %243
%245 = sext i8 %244 to i32
%246 = icmp eq i32 %245, 43
br i1 %246, label %247, label %250
247: ; preds = %237
%248 = load i32, i32* %17
%249 = add nsw i32 %248, 1
store i32 %249, i32* %17
br label %250
250: ; preds = %247, %237
store i32 0, i32* %18
%251 = load i32, i32* %17
store i32 %251, i32* %16
br label %252
252: ; preds = %300, %250
%253 = load i8*, i8** %12
%254 = load i32, i32* %16
%255 = sext i32 %254 to i64
%256 = getelementptr inbounds i8, i8* %253, i64 %255
%257 = load i8, i8* %256
%258 = sext i8 %257 to i32
%259 = icmp ne i32 %258, 0
br i1 %259, label %260, label %303
260: ; preds = %252
%261 = load i8*, i8** %12
%262 = load i32, i32* %16
%263 = sext i32 %262 to i64
%264 = getelementptr inbounds i8, i8* %261, i64 %263
%265 = load i8, i8* %264
%266 = sext i8 %265 to i32
%267 = icmp sgt i32 %266, 48
br i1 %267, label %268, label %277
268: ; preds = %260
%269 = load i8*, i8** %12
%270 = load i32, i32* %16
%271 = sext i32 %270 to i64
%272 = getelementptr inbounds i8, i8* %269, i64 %271
%273 = load i8, i8* %272
%274 = sext i8 %273 to i32
%275 = icmp sle i32 %274, 57
br i1 %275, label %276, label %277
276: ; preds = %268
store i32 1, i32* %18
br label %277
277: ; preds = %276, %268, %260
%278 = load i32, i32* %18
%279 = icmp eq i32 %278, 1
br i1 %279, label %288, label %280
280: ; preds = %277
%281 = load i8*, i8** %12
%282 = load i32, i32* %16
%283 = sext i32 %282 to i64
%284 = getelementptr inbounds i8, i8* %281, i64 %283
%285 = load i8, i8* %284
%286 = sext i8 %285 to i32
%287 = icmp ne i32 %286, 48
br i1 %287, label %288, label %299
288: ; preds = %280, %277
%289 = load i8*, i8** %12
%290 = load i32, i32* %16
%291 = sext i32 %290 to i64
%292 = getelementptr inbounds i8, i8* %289, i64 %291
%293 = load i8, i8* %292
%294 = load i8*, i8** %12
%295 = load i32, i32* %15
%296 = add nsw i32 %295, 1
store i32 %296, i32* %15
%297 = sext i32 %295 to i64
%298 = getelementptr inbounds i8, i8* %294, i64 %297
store i8 %293, i8* %298
br label %299
299: ; preds = %288, %280
br label %300
300: ; preds = %299
%301 = load i32, i32* %16
%302 = add nsw i32 %301, 1
store i32 %302, i32* %16
br label %252
303: ; preds = %252
%304 = load i8*, i8** %12
%305 = load i32, i32* %15
%306 = add nsw i32 %305, 1
store i32 %306, i32* %15
%307 = sext i32 %305 to i64
%308 = getelementptr inbounds i8, i8* %304, i64 %307
store i8 125, i8* %308
%309 = load i8*, i8** %12
%310 = load i32, i32* %15
%311 = add nsw i32 %310, 1
store i32 %311, i32* %15
%312 = sext i32 %310 to i64
%313 = getelementptr inbounds i8, i8* %309, i64 %312
store i8 0, i8* %313
br label %314
314: ; preds = %303, %171
br label %315
315: ; preds = %314, %132
br label %316
316: ; preds = %315, %90
br label %317
317: ; preds = %316, %81
store i32 0, i32* %15
br label %318
318: ; preds = %337, %317
%319 = load i8*, i8** %12
%320 = load i32, i32* %15
%321 = sext i32 %320 to i64
%322 = getelementptr inbounds i8, i8* %319, i64 %321
%323 = load i8, i8* %322
%324 = sext i8 %323 to i32
%325 = icmp ne i32 %324, 0
br i1 %325, label %326, label %334
326: ; preds = %318
%327 = load i8*, i8** %12
%328 = load i32, i32* %15
%329 = sext i32 %328 to i64
%330 = getelementptr inbounds i8, i8* %327, i64 %329
%331 = load i8, i8* %330
%332 = sext i8 %331 to i32
%333 = icmp ne i32 %332, 46
br label %334
334: ; preds = %326, %318
%335 = phi i1 [ false, %318 ], [ %333, %326 ]
br i1 %335, label %336, label %340
336: ; preds = %334
br label %337
337: ; preds = %336
%338 = load i32, i32* %15
%339 = add nsw i32 %338, 1
store i32 %339, i32* %15
br label %318
340: ; preds = %334
%341 = load i8*, i8** %12
%342 = load i32, i32* %15
%343 = sext i32 %342 to i64
%344 = getelementptr inbounds i8, i8* %341, i64 %343
%345 = load i8, i8* %344
%346 = sext i8 %345 to i32
%347 = icmp ne i32 %346, 46
br i1 %347, label %348, label %350
348: ; preds = %340
%349 = load i8*, i8** %12
store i8* %349, i8** %5
br label %437
350: ; preds = %340
%351 = load i32, i32* %15
%352 = add nsw i32 %351, 1
store i32 %352, i32* %16
br label %353
353: ; preds = %362, %350
%354 = load i8*, i8** %12
%355 = load i32, i32* %16
%356 = sext i32 %355 to i64
%357 = getelementptr inbounds i8, i8* %354, i64 %356
%358 = load i8, i8* %357
%359 = call i64 @isdigit(i8 signext %358)
%360 = icmp ne i64 %359, 0
br i1 %360, label %361, label %365
361: ; preds = %353
br label %362
362: ; preds = %361
%363 = load i32, i32* %16
%364 = add nsw i32 %363, 1
store i32 %364, i32* %16
br label %353
365: ; preds = %353
%366 = load i32, i32* %15
%367 = load i32, i32* %16
%368 = icmp eq i32 %366, %367
br i1 %368, label %369, label %371
369: ; preds = %365
%370 = load i8*, i8** %12
store i8* %370, i8** %5
br label %437
371: ; preds = %365
%372 = load i32, i32* %16
%373 = sub nsw i32 %372, 1
store i32 %373, i32* %17
br label %374
374: ; preds = %383, %371
%375 = load i8*, i8** %12
%376 = load i32, i32* %17
%377 = sext i32 %376 to i64
%378 = getelementptr inbounds i8, i8* %375, i64 %377
%379 = load i8, i8* %378
%380 = sext i8 %379 to i32
%381 = icmp eq i32 %380, 48
br i1 %381, label %382, label %386
382: ; preds = %374
br label %383
383: ; preds = %382
%384 = load i32, i32* %17
%385 = add nsw i32 %384, -1
store i32 %385, i32* %17
br label %374
386: ; preds = %374
%387 = load i32, i32* %17
%388 = load i32, i32* %15
%389 = icmp eq i32 %387, %388
br i1 %389, label %390, label %393
390: ; preds = %386
%391 = load i32, i32* %17
%392 = add nsw i32 %391, -1
store i32 %392, i32* %17
br label %393
393: ; preds = %390, %386
%394 = load i32, i32* %17
%395 = add nsw i32 %394, 1
store i32 %395, i32* %17
%396 = load i32, i32* %17
%397 = load i32, i32* %16
%398 = icmp eq i32 %396, %397
br i1 %398, label %399, label %401
399: ; preds = %393
%400 = load i8*, i8** %12
store i8* %400, i8** %5
br label %437
401: ; preds = %393
store i32 0, i32* %18
br label %402
402: ; preds = %426, %401
%403 = load i8*, i8** %12
%404 = load i32, i32* %16
%405 = load i32, i32* %18
%406 = add nsw i32 %404, %405
%407 = sext i32 %406 to i64
%408 = getelementptr inbounds i8, i8* %403, i64 %407
%409 = load i8, i8* %408
%410 = sext i8 %409 to i32
%411 = icmp ne i32 %410, 0
br i1 %411, label %412, label %429
412: ; preds = %402
%413 = load i8*, i8** %12
%414 = load i32, i32* %16
%415 = load i32, i32* %18
%416 = add nsw i32 %414, %415
%417 = sext i32 %416 to i64
%418 = getelementptr inbounds i8, i8* %413, i64 %417
%419 = load i8, i8* %418
%420 = load i8*, i8** %12
%421 = load i32, i32* %17
%422 = load i32, i32* %18
%423 = add nsw i32 %421, %422
%424 = sext i32 %423 to i64
%425 = getelementptr inbounds i8, i8* %420, i64 %424
store i8 %419, i8* %425
br label %426
426: ; preds = %412
%427 = load i32, i32* %18
%428 = add nsw i32 %427, 1
store i32 %428, i32* %18
br label %402
429: ; preds = %402
%430 = load i8*, i8** %12
%431 = load i32, i32* %17
%432 = load i32, i32* %18
%433 = add nsw i32 %431, %432
%434 = sext i32 %433 to i64
%435 = getelementptr inbounds i8, i8* %430, i64 %434
store i8 0, i8* %435
%436 = load i8*, i8** %12
store i8* %436, i8** %5
br label %437
437: ; preds = %429, %399, %369, %348
%438 = load i8*, i8** %5
ret i8* %438
}

LLVM IR (-O2):
@NumericDisplay.format = internal global [16 x i8] zeroinitializer
@NumericDisplay.outputA = internal global [128 x i8] zeroinitializer
@NumericDisplay.outputB = internal global [128 x i8] zeroinitializer
@NumericDisplay.outputC = internal global [128 x i8] zeroinitializer
@NumericDisplay.outputD = internal global [128 x i8] zeroinitializer
@.str = [7 x i8] c"%%.%df\00"
@.str.2 = [7 x i8] c"%%.%de\00"
@.str.3 = [5 x i8] c"10^{\00"
@.str.4 = [11 x i8] c"\\times10^{\00"
@switch.table.NumericDisplay = [3 x i8*] [i8* getelementptr inbounds ([128 x i8], [128 x i8]* @NumericDisplay.outputA, i64 0, i64 0), i8* getelementptr inbounds ([128 x i8], [128 x i8]* @NumericDisplay.outputB, i64 0, i64 0), i8* getelementptr inbounds ([128 x i8], [128 x i8]* @NumericDisplay.outputC, i64 0, i64 0)]
define i8* @NumericDisplay(double %0, i32 %1, i32 %2, i32 %3) {
%5 = icmp ult i32 %1, 3
br i1 %5, label %6, label %10
6: ; preds = %4
%7 = sext i32 %1 to i64
%8 = getelementptr inbounds [3 x i8*], [3 x i8*]* @switch.table.NumericDisplay, i64 0, i64 %7
%9 = load i8*, i8** %8
br label %10
10: ; preds = %4, %6
%11 = phi i8* [ %9, %6 ], [ getelementptr inbounds ([128 x i8], [128 x i8]* @NumericDisplay.outputD, i64 0, i64 0), %4 ]
%12 = tail call i32 @fabs(double %0)
%13 = tail call i32 @fabs(double %0)
%14 = icmp sgt i32 %13, 0
br i1 %14, label %15, label %42
15: ; preds = %10
%16 = tail call i32 @fabs(double %0)
%17 = sitofp i32 %16 to double
%18 = sub nsw i32 0, %2
%19 = tail call double @pow(i32 10, i32 %18)
%20 = fadd double %19, 1.000000e+00
%21 = fmul double %20, %17
%22 = tail call i32 @log10(double %17)
%23 = sub i32 %2, %22
%24 = icmp sgt i32 %23, 0
br i1 %24, label %25, label %38
25: ; preds = %15, %35
%26 = phi i32 [ %36, %35 ], [ 0, %15 ]
%27 = tail call double @pow(i32 10, i32 %26)
%28 = fmul double %27, %17
%29 = tail call double @llvm.floor.f64(double %28)
%30 = tail call double @pow(i32 10, i32 %26)
%31 = fdiv double %29, %30
%32 = fsub double %17, %31
%33 = fadd double %32, %17
%34 = fcmp olt double %33, %21
br i1 %34, label %38, label %35
35: ; preds = %25
%36 = add nuw nsw i32 %26, 1
%37 = icmp eq i32 %36, %23
br i1 %37, label %38, label %25
38: ; preds = %35, %25, %15
%39 = phi i32 [ 0, %15 ], [ %26, %25 ], [ %23, %35 ]
%40 = tail call i32 (i8*, i8*, ...) @sprintf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @NumericDisplay.format, i64 0, i64 0), i8* dereferenceable(1) getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i64 0, i64 0), i32 %39)
%41 = tail call i32 (i8*, i8*, ...) @sprintf(i8* dereferenceable(1) %11, i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @NumericDisplay.format, i64 0, i64 0), double %0)
br label %154
42: ; preds = %10
%43 = fcmp oeq double %0, 0.000000e+00
br i1 %43, label %44, label %46
44: ; preds = %42
%45 = bitcast i8* %11 to i16*
store i16 48, i16* %45
br label %154
46: ; preds = %42
%47 = tail call i32 @fabs(double %0)
%48 = sitofp i32 %47 to double
%49 = tail call i32 @log10(double %48)
%50 = tail call double @pow(i32 10, i32 %49)
%51 = fdiv double %48, %50
%52 = sub nsw i32 0, %2
%53 = tail call double @pow(i32 10, i32 %52)
%54 = fadd double %53, 1.000000e+00
%55 = fmul double %51, %54
%56 = icmp sgt i32 %2, 0
br i1 %56, label %57, label %70
57: ; preds = %46, %67
%58 = phi i32 [ %68, %67 ], [ 0, %46 ]
%59 = tail call double @pow(i32 10, i32 %58)
%60 = fmul double %51, %59
%61 = tail call double @llvm.floor.f64(double %60)
%62 = tail call double @pow(i32 10, i32 %58)
%63 = fdiv double %61, %62
%64 = fsub double %63, %51
%65 = fsub double %51, %64
%66 = fcmp olt double %65, %55
br i1 %66, label %70, label %67
67: ; preds = %57
%68 = add nuw nsw i32 %58, 1
%69 = icmp eq i32 %68, %2
br i1 %69, label %70, label %57
70: ; preds = %67, %57, %46
%71 = phi i32 [ 0, %46 ], [ %58, %57 ], [ %2, %67 ]
%72 = tail call i32 (i8*, i8*, ...) @sprintf(i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @NumericDisplay.format, i64 0, i64 0), i8* dereferenceable(1) getelementptr inbounds ([7 x i8], [7 x i8]* @.str.2, i64 0, i64 0), i32 %71)
%73 = tail call i32 (i8*, i8*, ...) @sprintf(i8* dereferenceable(1) %11, i8* dereferenceable(1) getelementptr inbounds ([16 x i8], [16 x i8]* @NumericDisplay.format, i64 0, i64 0), double %0)
%74 = icmp eq i32 %3, 0
br i1 %74, label %154, label %75
75: ; preds = %70, %85
%76 = phi i64 [ %86, %85 ], [ 0, %70 ]
%77 = getelementptr inbounds i8, i8* %11, i64 %76
%78 = load i8, i8* %77
switch i8 %78, label %85 [
i8 0, label %154
i8 69, label %79
i8 101, label %79
]
79: ; preds = %75, %75
%80 = trunc i64 %76 to i32
%81 = and i64 %76, 4294967295
%82 = getelementptr inbounds i8, i8* %11, i64 %81
%83 = load i8, i8* %82
%84 = icmp eq i8 %83, 0
br i1 %84, label %96, label %87
85: ; preds = %75
%86 = add nuw i64 %76, 1
br label %75
87: ; preds = %79, %87
%88 = phi i64 [ %92, %87 ], [ %81, %79 ]
%89 = phi i8 [ %94, %87 ], [ %83, %79 ]
%90 = add nuw nsw i64 %88, 32
%91 = getelementptr inbounds i8, i8* %11, i64 %90
store i8 %89, i8* %91
%92 = add nuw nsw i64 %88, 1
%93 = getelementptr inbounds i8, i8* %11, i64 %92
%94 = load i8, i8* %93
%95 = icmp eq i8 %94, 0
br i1 %95, label %96, label %87
96: ; preds = %87, %79
%97 = phi i64 [ %76, %79 ], [ %92, %87 ]
%98 = add i64 %97, 32
%99 = and i64 %98, 4294967295
%100 = getelementptr inbounds i8, i8* %11, i64 %99
store i8 0, i8* %100
%101 = icmp eq i32 %80, 1
br i1 %101, label %102, label %108
102: ; preds = %96
%103 = load i8, i8* %11
%104 = icmp eq i8 %103, 49
br i1 %104, label %105, label %108
105: ; preds = %102
%106 = tail call i32 @strcpy(i8* %11, i8* getelementptr inbounds ([5 x i8], [5 x i8]* @.str.3, i64 0, i64 0))
%107 = tail call i32 @strlen(i8* %11)
br label %113
108: ; preds = %102, %96
%109 = tail call i32 @strcpy(i8* %82, i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.4, i64 0, i64 0))
%110 = tail call i32 @strlen(i8* %82)
%111 = add nsw i32 %110, %80
%112 = add i32 %80, 33
br label %113
113: ; preds = %108, %105
%114 = phi i32 [ 34, %105 ], [ %112, %108 ]
%115 = phi i32 [ %107, %105 ], [ %111, %108 ]
%116 = zext i32 %114 to i64
%117 = getelementptr inbounds i8, i8* %11, i64 %116
%118 = load i8, i8* %117
%119 = icmp eq i8 %118, 43
%120 = add nuw nsw i32 %80, 34
%121 = select i1 %119, i32 %120, i32 %114
%122 = zext i32 %121 to i64
%123 = getelementptr inbounds i8, i8* %11, i64 %122
%124 = load i8, i8* %123
%125 = icmp eq i8 %124, 0
br i1 %125, label %147, label %126
126: ; preds = %113, %141
%127 = phi i64 [ %143, %141 ], [ %122, %113 ]
%128 = phi i8 [ %145, %141 ], [ %124, %113 ]
%129 = phi i32 [ %133, %141 ], [ 0, %113 ]
%130 = phi i32 [ %142, %141 ], [ %115, %113 ]
%131 = add i8 %128, -49
%132 = icmp ult i8 %131, 9
%133 = select i1 %132, i32 1, i32 %129
%134 = icmp ne i32 %133, 1
%135 = icmp eq i8 %128, 48
%136 = select i1 %134, i1 %135, i1 false
br i1 %136, label %141, label %137
137: ; preds = %126
%138 = add nsw i32 %130, 1
%139 = sext i32 %130 to i64
%140 = getelementptr inbounds i8, i8* %11, i64 %139
store i8 %128, i8* %140
br label %141
141: ; preds = %126, %137
%142 = phi i32 [ %138, %137 ], [ %130, %126 ]
%143 = add nuw i64 %127, 1
%144 = getelementptr inbounds i8, i8* %11, i64 %143
%145 = load i8, i8* %144
%146 = icmp eq i8 %145, 0
br i1 %146, label %147, label %126
147: ; preds = %141, %113
%148 = phi i32 [ %115, %113 ], [ %142, %141 ]
%149 = add nsw i32 %148, 1
%150 = sext i32 %148 to i64
%151 = getelementptr inbounds i8, i8* %11, i64 %150
store i8 125, i8* %151
%152 = sext i32 %149 to i64
%153 = getelementptr inbounds i8, i8* %11, i64 %152
store i8 0, i8* %153
br label %154
154: ; preds = %75, %44, %147, %70, %38
br label %155
155: ; preds = %154, %162
%156 = phi i64 [ %163, %162 ], [ 0, %154 ]
%157 = getelementptr inbounds i8, i8* %11, i64 %156
%158 = load i8, i8* %157
switch i8 %158, label %162 [
i8 46, label %159
i8 0, label %216
]
159: ; preds = %155
%160 = trunc i64 %156 to i32
%161 = and i64 %156, 4294967295
br label %164
162: ; preds = %155
%163 = add nuw i64 %156, 1
br label %155
164: ; preds = %159, %164
%165 = phi i64 [ %161, %159 ], [ %166, %164 ]
%166 = add nuw nsw i64 %165, 1
%167 = getelementptr inbounds i8, i8* %11, i64 %166
%168 = load i8, i8* %167
%169 = tail call i64 @isdigit(i8 signext %168)
%170 = icmp eq i64 %169, 0
br i1 %170, label %171, label %164
171: ; preds = %164
%172 = trunc i64 %165 to i32
%173 = trunc i64 %166 to i32
%174 = icmp eq i32 %160, %173
br i1 %174, label %216, label %175
175: ; preds = %171
%176 = shl i64 %165, 32
%177 = ashr exact i64 %176, 32
br label %178
178: ; preds = %175, %178
%179 = phi i64 [ %177, %175 ], [ %183, %178 ]
%180 = getelementptr inbounds i8, i8* %11, i64 %179
%181 = load i8, i8* %180
%182 = icmp eq i8 %181, 48
%183 = add i64 %179, -1
br i1 %182, label %178, label %184
184: ; preds = %178
%185 = trunc i64 %179 to i32
%186 = icmp eq i32 %185, %160
%187 = sext i1 %186 to i32
%188 = add nsw i32 %185, %187
%189 = add nsw i32 %188, 1
%190 = icmp eq i32 %188, %172
br i1 %190, label %216, label %191
191: ; preds = %184
%192 = and i64 %166, 4294967295
%193 = getelementptr inbounds i8, i8* %11, i64 %192
%194 = load i8, i8* %193
%195 = icmp eq i8 %194, 0
br i1 %195, label %211, label %196
196: ; preds = %191
%197 = sext i32 %189 to i64
br label %198
198: ; preds = %196, %198
%199 = phi i64 [ 0, %196 ], [ %203, %198 ]
%200 = phi i8 [ %194, %196 ], [ %207, %198 ]
%201 = add nsw i64 %199, %197
%202 = getelementptr inbounds i8, i8* %11, i64 %201
store i8 %200, i8* %202
%203 = add nuw i64 %199, 1
%204 = add i64 %203, %166
%205 = and i64 %204, 4294967295
%206 = getelementptr inbounds i8, i8* %11, i64 %205
%207 = load i8, i8* %206
%208 = icmp eq i8 %207, 0
br i1 %208, label %209, label %198
209: ; preds = %198
%210 = trunc i64 %203 to i32
br label %211
211: ; preds = %209, %191
%212 = phi i32 [ 0, %191 ], [ %210, %209 ]
%213 = add nsw i32 %212, %189
%214 = sext i32 %213 to i64
%215 = getelementptr inbounds i8, i8* %11, i64 %214
store i8 0, i8* %215
br label %216
216: ; preds = %155, %184, %171, %211
ret i8* %11
}