#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 */
float FLT_MAX;
int /*<<< orphan*/ fprintf(int /*<<< orphan*/, char *);
int /*<<< orphan*/ hsmooth(int *, int, int);
int /*<<< orphan*/ printf(char *, double, ...);
int /*<<< orphan*/ stdout;
float fimg_modetn(float *fimg, int nval, float histmin, int nsmooth) {
  int hist[128], marg[128];
  int nbin = 128;
  int i, j, k, imax;
  int debug = 0;
  float u, fmax, fmin, range, binwid;
  double slope, curva;
  fmax = -FLT_MAX;
  fmin = FLT_MAX;
  for (u = i = 0; i < nval; i++) {
    if (fimg[i] > fmax)
      fmax = fimg[i];
    if (fimg[i] < fmin)
      fmin = fimg[i];
    u += fimg[i];
  }
  u /= nval;
  range = fmax - fmin;
  if (debug)
    printf("fmin=%f fmax=%f range=%f\n", fmin, fmax, range);
  for (k = 0; k < nbin; k++)
    marg[k] = hist[k] = 0;
  for (i = 0; i < nval; i++) {
    k = (nbin * (fimg[i] - fmin)) / range;
    if (k < nbin)
      marg[k]++;
  }
  for (k = 1; k < nbin; k++)
    marg[k] += marg[k - 1];
  if (debug)
    for (k = 0; k < nbin; k++)
      printf("%-10d%10d\n", k, marg[k]);
  for (i = 1; i < nbin; i++)
    if ((float)marg[i] / (float)marg[nbin - 1] > 0.001)
      break;
  for (j = 1; j < nbin; j++)
    if ((float)marg[j] / (float)marg[nbin - 1] > 1.0 - 0.001)
      break;
  if (debug)
    printf("i=%d j=%d\n", i, j);
  fmin = range * i / nbin;
  fmax = range * j / nbin;
  range = fmax - fmin;
  binwid = range / nbin;
  if (debug)
    printf("fmin=%f fmax=%f range=%f\n", fmin, fmax, range);
  for (k = 0; k < nval; k++) {
    i = (fimg[k] - fmin) / binwid;
    if (i < 0 || i >= nbin)
      continue;
    hist[i]++;
  }
  if (debug)
    for (k = 0; k < nbin; k++)
      printf("%-10d%10d\n", k, hist[k]);
  hsmooth(hist, nbin, nsmooth);
  imax = 0;
  for (i = 1; i < nbin - 1; i++) {
    u = fmin + binwid * i;
    if (hist[i] > hist[i - 1] && hist[i] > hist[i + 1] && u > histmin) {
      if (debug)
        printf("peak at bin %d\tordinate=%.2f\t%10d\n", i, u, hist[i]);
      if (!imax || hist[i] > hist[imax])
        imax = i;
    }
  }
  if (debug)
    printf("imax=%d\n", imax);
  if (imax == 0 || imax == nbin - 1) {
    fprintf(stdout, "fimg_mode: returning mean instead of mode\n");
    return u;
  }
  slope = 0.5 * (hist[imax + 1] - hist[imax - 1]);
  curva = hist[imax + 1] + hist[imax - 1] - 2 * hist[imax];
  u = fmin + binwid * imax - binwid * slope / curva;
  if (debug)
    printf("slope=%.2f curva=%.2f binwid=%f mode=%f\n", slope, curva, binwid,
           u);
  return u;
}


x86 assembly (clang, -O0):
<fimg_modetn>:
push   %rbp
mov    %rsp,%rbp
sub    $0x460,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
movss  %xmm0,-0x18(%rbp)
mov    %edx,-0x1c(%rbp)
movl   $0x80,-0x424(%rbp)
movl   $0x0,-0x438(%rbp)
mov    0x2e83(%rip),%rax
movss  (%rax),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x440(%rbp)
ff
mov    0x2e63(%rip),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x444(%rbp)
ff
movl   $0x0,-0x428(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x43c(%rbp)
ff
mov    -0x428(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1257 <fimg_modetn+0x127>
mov    -0x10(%rbp),%rax
movslq -0x428(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
ucomiss -0x440(%rbp),%xmm0
jbe    11ea <fimg_modetn+0xba>
mov    -0x10(%rbp),%rax
movslq -0x428(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x440(%rbp)
ff
mov    -0x10(%rbp),%rax
movslq -0x428(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
movss  -0x444(%rbp),%xmm0
ff
ucomiss %xmm1,%xmm0
jbe    1223 <fimg_modetn+0xf3>
mov    -0x10(%rbp),%rax
movslq -0x428(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x444(%rbp)
ff
mov    -0x10(%rbp),%rax
movslq -0x428(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
addss  -0x43c(%rbp),%xmm0
ff
movss  %xmm0,-0x43c(%rbp)
ff
mov    -0x428(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x428(%rbp)
jmp    11a6 <fimg_modetn+0x76>
cvtsi2ssl -0x14(%rbp),%xmm1
movss  -0x43c(%rbp),%xmm0
ff
divss  %xmm1,%xmm0
movss  %xmm0,-0x43c(%rbp)
ff
movss  -0x440(%rbp),%xmm0
ff
subss  -0x444(%rbp),%xmm0
ff
movss  %xmm0,-0x448(%rbp)
ff
cmpl   $0x0,-0x438(%rbp)
je     12c7 <fimg_modetn+0x197>
movss  -0x444(%rbp),%xmm0
ff
cvtss2sd %xmm0,%xmm0
movss  -0x440(%rbp),%xmm1
ff
cvtss2sd %xmm1,%xmm1
movss  -0x448(%rbp),%xmm2
ff
cvtss2sd %xmm2,%xmm2
lea    0xd58(%rip),%rdi
mov    $0x3,%al
call   1030 <printf@plt>
movl   $0x0,-0x430(%rbp)
mov    -0x430(%rbp),%eax
cmp    -0x424(%rbp),%eax
jge    131b <fimg_modetn+0x1eb>
movslq -0x430(%rbp),%rax
movl   $0x0,-0x220(%rbp,%rax,4)
movslq -0x430(%rbp),%rax
movl   $0x0,-0x420(%rbp,%rax,4)
mov    -0x430(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x430(%rbp)
jmp    12d1 <fimg_modetn+0x1a1>
movl   $0x0,-0x428(%rbp)
mov    -0x428(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    13ad <fimg_modetn+0x27d>
cvtsi2ssl -0x424(%rbp),%xmm0
ff
mov    -0x10(%rbp),%rax
movslq -0x428(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
subss  -0x444(%rbp),%xmm1
ff
mulss  %xmm1,%xmm0
divss  -0x448(%rbp),%xmm0
ff
cvttss2si %xmm0,%eax
mov    %eax,-0x430(%rbp)
mov    -0x430(%rbp),%eax
cmp    -0x424(%rbp),%eax
jge    1394 <fimg_modetn+0x264>
movslq -0x430(%rbp),%rax
mov    -0x420(%rbp,%rax,4),%ecx
add    $0x1,%ecx
mov    %ecx,-0x420(%rbp,%rax,4)
jmp    1399 <fimg_modetn+0x269>
mov    -0x428(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x428(%rbp)
jmp    1325 <fimg_modetn+0x1f5>
movl   $0x1,-0x430(%rbp)
mov    -0x430(%rbp),%eax
cmp    -0x424(%rbp),%eax
jge    1404 <fimg_modetn+0x2d4>
mov    -0x430(%rbp),%eax
sub    $0x1,%eax
cltq
mov    -0x420(%rbp,%rax,4),%ecx
movslq -0x430(%rbp),%rax
add    -0x420(%rbp,%rax,4),%ecx
mov    %ecx,-0x420(%rbp,%rax,4)
mov    -0x430(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x430(%rbp)
jmp    13b7 <fimg_modetn+0x287>
cmpl   $0x0,-0x438(%rbp)
je     146a <fimg_modetn+0x33a>
movl   $0x0,-0x430(%rbp)
mov    -0x430(%rbp),%eax
cmp    -0x424(%rbp),%eax
jge    1465 <fimg_modetn+0x335>
cvtsi2sdl -0x430(%rbp),%xmm0
ff
movslq -0x430(%rbp),%rax
mov    -0x420(%rbp,%rax,4),%esi
lea    0xbe8(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
mov    -0x430(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x430(%rbp)
jmp    141b <fimg_modetn+0x2eb>
jmp    146a <fimg_modetn+0x33a>
movl   $0x1,-0x428(%rbp)
mov    -0x428(%rbp),%eax
cmp    -0x424(%rbp),%eax
jge    14e2 <fimg_modetn+0x3b2>
movslq -0x428(%rbp),%rax
cvtsi2ssl -0x420(%rbp,%rax,4),%xmm0
ff ff
mov    -0x424(%rbp),%eax
sub    $0x1,%eax
cltq
cvtsi2ssl -0x420(%rbp,%rax,4),%xmm1
ff ff
divss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xb46(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    14c9 <fimg_modetn+0x399>
jmp    14e2 <fimg_modetn+0x3b2>
jmp    14ce <fimg_modetn+0x39e>
mov    -0x428(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x428(%rbp)
jmp    1474 <fimg_modetn+0x344>
movl   $0x1,-0x42c(%rbp)
mov    -0x42c(%rbp),%eax
cmp    -0x424(%rbp),%eax
jge    155a <fimg_modetn+0x42a>
movslq -0x42c(%rbp),%rax
cvtsi2ssl -0x420(%rbp,%rax,4),%xmm0
ff ff
mov    -0x424(%rbp),%eax
sub    $0x1,%eax
cltq
cvtsi2ssl -0x420(%rbp,%rax,4),%xmm1
ff ff
divss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movsd  0xad6(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1541 <fimg_modetn+0x411>
jmp    155a <fimg_modetn+0x42a>
jmp    1546 <fimg_modetn+0x416>
mov    -0x42c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x42c(%rbp)
jmp    14ec <fimg_modetn+0x3bc>
cmpl   $0x0,-0x438(%rbp)
je     1583 <fimg_modetn+0x453>
cvtsi2sdl -0x428(%rbp),%xmm0
ff
mov    -0x42c(%rbp),%esi
lea    0xac1(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
movss  -0x448(%rbp),%xmm0
ff
cvtsi2ssl -0x428(%rbp),%xmm1
ff
mulss  %xmm1,%xmm0
cvtsi2ssl -0x424(%rbp),%xmm1
ff
divss  %xmm1,%xmm0
movss  %xmm0,-0x444(%rbp)
ff
movss  -0x448(%rbp),%xmm0
ff
cvtsi2ssl -0x42c(%rbp),%xmm1
ff
mulss  %xmm1,%xmm0
cvtsi2ssl -0x424(%rbp),%xmm1
ff
divss  %xmm1,%xmm0
movss  %xmm0,-0x440(%rbp)
ff
movss  -0x440(%rbp),%xmm0
ff
subss  -0x444(%rbp),%xmm0
ff
movss  %xmm0,-0x448(%rbp)
ff
movss  -0x448(%rbp),%xmm0
ff
cvtsi2ssl -0x424(%rbp),%xmm1
ff
divss  %xmm1,%xmm0
movss  %xmm0,-0x44c(%rbp)
ff
cmpl   $0x0,-0x438(%rbp)
je     1646 <fimg_modetn+0x516>
movss  -0x444(%rbp),%xmm0
ff
cvtss2sd %xmm0,%xmm0
movss  -0x440(%rbp),%xmm1
ff
cvtss2sd %xmm1,%xmm1
movss  -0x448(%rbp),%xmm2
ff
cvtss2sd %xmm2,%xmm2
lea    0x9d9(%rip),%rdi
mov    $0x3,%al
call   1030 <printf@plt>
movl   $0x0,-0x430(%rbp)
mov    -0x430(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    16d9 <fimg_modetn+0x5a9>
mov    -0x10(%rbp),%rax
movslq -0x430(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
subss  -0x444(%rbp),%xmm0
ff
divss  -0x44c(%rbp),%xmm0
ff
cvttss2si %xmm0,%eax
mov    %eax,-0x428(%rbp)
cmpl   $0x0,-0x428(%rbp)
jl     16a8 <fimg_modetn+0x578>
mov    -0x428(%rbp),%eax
cmp    -0x424(%rbp),%eax
jl     16ad <fimg_modetn+0x57d>
jmp    16c5 <fimg_modetn+0x595>
movslq -0x428(%rbp),%rax
mov    -0x220(%rbp,%rax,4),%ecx
add    $0x1,%ecx
mov    %ecx,-0x220(%rbp,%rax,4)
mov    -0x430(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x430(%rbp)
jmp    1650 <fimg_modetn+0x520>
cmpl   $0x0,-0x438(%rbp)
je     173f <fimg_modetn+0x60f>
movl   $0x0,-0x430(%rbp)
mov    -0x430(%rbp),%eax
cmp    -0x424(%rbp),%eax
jge    173a <fimg_modetn+0x60a>
cvtsi2sdl -0x430(%rbp),%xmm0
ff
movslq -0x430(%rbp),%rax
mov    -0x220(%rbp,%rax,4),%esi
lea    0x913(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
mov    -0x430(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x430(%rbp)
jmp    16f0 <fimg_modetn+0x5c0>
jmp    173f <fimg_modetn+0x60f>
lea    -0x220(%rbp),%rdi
mov    -0x424(%rbp),%esi
mov    -0x1c(%rbp),%edx
call   1040 <hsmooth@plt>
movl   $0x0,-0x434(%rbp)
movl   $0x1,-0x428(%rbp)
mov    -0x428(%rbp),%eax
mov    -0x424(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    189d <fimg_modetn+0x76d>
movss  -0x444(%rbp),%xmm1
ff
movss  -0x44c(%rbp),%xmm0
ff
cvtsi2ssl -0x428(%rbp),%xmm2
ff
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
movss  %xmm0,-0x43c(%rbp)
ff
movslq -0x428(%rbp),%rax
mov    -0x220(%rbp,%rax,4),%eax
mov    -0x428(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
cmp    -0x220(%rbp,%rcx,4),%eax
jle    1884 <fimg_modetn+0x754>
movslq -0x428(%rbp),%rax
mov    -0x220(%rbp,%rax,4),%eax
mov    -0x428(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
cmp    -0x220(%rbp,%rcx,4),%eax
jle    1884 <fimg_modetn+0x754>
movss  -0x43c(%rbp),%xmm0
ff
ucomiss -0x18(%rbp),%xmm0
jbe    1884 <fimg_modetn+0x754>
cmpl   $0x0,-0x438(%rbp)
je     1844 <fimg_modetn+0x714>
cvtsi2sdl -0x428(%rbp),%xmm0
ff
movss  -0x43c(%rbp),%xmm1
ff
cvtss2sd %xmm1,%xmm1
movslq -0x428(%rbp),%rax
mov    -0x220(%rbp,%rax,4),%esi
lea    0x80b(%rip),%rdi
mov    $0x2,%al
call   1030 <printf@plt>
cmpl   $0x0,-0x434(%rbp)
je     1873 <fimg_modetn+0x743>
movslq -0x428(%rbp),%rax
mov    -0x220(%rbp,%rax,4),%eax
movslq -0x434(%rbp),%rcx
cmp    -0x220(%rbp,%rcx,4),%eax
jle    187f <fimg_modetn+0x74f>
mov    -0x428(%rbp),%eax
mov    %eax,-0x434(%rbp)
jmp    1884 <fimg_modetn+0x754>
jmp    1889 <fimg_modetn+0x759>
mov    -0x428(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x428(%rbp)
jmp    1768 <fimg_modetn+0x638>
cmpl   $0x0,-0x438(%rbp)
je     18c0 <fimg_modetn+0x790>
cvtsi2sdl -0x434(%rbp),%xmm0
ff
lea    0x7b2(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
cmpl   $0x0,-0x434(%rbp)
je     18e4 <fimg_modetn+0x7b4>
mov    -0x434(%rbp),%eax
mov    -0x424(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jne    190b <fimg_modetn+0x7db>
mov    0x26ed(%rip),%rax
mov    (%rax),%edi
lea    0x780(%rip),%rsi
call   1050 <fprintf@plt>
movss  -0x43c(%rbp),%xmm0
movss  %xmm0,-0x4(%rbp)
jmp    1a2c <fimg_modetn+0x8fc>
mov    -0x434(%rbp),%eax
add    $0x1,%eax
cltq
mov    -0x220(%rbp,%rax,4),%eax
mov    -0x434(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
sub    -0x220(%rbp,%rcx,4),%eax
cvtsi2sd %eax,%xmm1
movsd  0x6d4(%rip),%xmm0
mulsd  %xmm1,%xmm0
movsd  %xmm0,-0x458(%rbp)
ff
mov    -0x434(%rbp),%eax
add    $0x1,%eax
cltq
mov    -0x220(%rbp,%rax,4),%eax
mov    -0x434(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
add    -0x220(%rbp,%rcx,4),%eax
movslq -0x434(%rbp),%rcx
mov    -0x220(%rbp,%rcx,4),%ecx
shl    $0x1,%ecx
sub    %ecx,%eax
cvtsi2sd %eax,%xmm0
movsd  %xmm0,-0x460(%rbp)
ff
movss  -0x444(%rbp),%xmm1
ff
movss  -0x44c(%rbp),%xmm0
ff
cvtsi2ssl -0x434(%rbp),%xmm2
ff
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
movss  -0x44c(%rbp),%xmm1
ff
cvtss2sd %xmm1,%xmm1
mulsd  -0x458(%rbp),%xmm1
ff
divsd  -0x460(%rbp),%xmm1
ff
subsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
movss  %xmm0,-0x43c(%rbp)
ff
cmpl   $0x0,-0x438(%rbp)
je     1a1f <fimg_modetn+0x8ef>
movsd  -0x458(%rbp),%xmm0
ff
movsd  -0x460(%rbp),%xmm1
ff
movss  -0x44c(%rbp),%xmm2
cvtss2sd %xmm2,%xmm2
movss  -0x43c(%rbp),%xmm3
ff
cvtss2sd %xmm3,%xmm3
lea    0x687(%rip),%rdi
mov    $0x4,%al
call   1030 <printf@plt>
movss  -0x43c(%rbp),%xmm0
ff
movss  %xmm0,-0x4(%rbp)
movss  -0x4(%rbp),%xmm0
add    $0x460,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<fimg_modetn>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
sub    $0x430,%rsp
mov    %edx,%r14d
mov    %esi,%r15d
mov    %rdi,%rbx
mov    0x2e99(%rip),%rax
movss  (%rax),%xmm3
movaps 0xea6(%rip),%xmm4
xorps  %xmm3,%xmm4
mov    %esi,%r12d
test   %esi,%esi
movss  %xmm0,0xc(%rsp)
jle    1182 <fimg_modetn+0x52>
lea    -0x1(%r12),%rcx
mov    %r12d,%eax
and    $0x3,%eax
cmp    $0x3,%rcx
jae    11c3 <fimg_modetn+0x93>
xor    %ecx,%ecx
jmp    121c <fimg_modetn+0xec>
lea    0x230(%rsp),%rdi
xor    %ebp,%ebp
mov    $0x200,%edx
xor    %esi,%esi
movaps %xmm3,0x20(%rsp)
movaps %xmm4,0x10(%rsp)
call   1030 <memset@plt>
lea    0x30(%rsp),%rdi
mov    $0x200,%edx
xor    %esi,%esi
call   1030 <memset@plt>
movaps 0x10(%rsp),%xmm4
subss  0x20(%rsp),%xmm4
jmp    12e1 <fimg_modetn+0x1b1>
mov    %r12d,%edx
and    $0xfffffffc,%edx
xor    %ecx,%ecx
nopl   0x0(%rax,%rax,1)
movss  (%rbx,%rcx,4),%xmm0
movss  0x4(%rbx,%rcx,4),%xmm1
movaps %xmm0,%xmm2
maxss  %xmm4,%xmm2
minss  %xmm3,%xmm0
movaps %xmm1,%xmm3
maxss  %xmm2,%xmm3
minss  %xmm0,%xmm1
movss  0x8(%rbx,%rcx,4),%xmm0
movaps %xmm0,%xmm2
maxss  %xmm3,%xmm2
minss  %xmm1,%xmm0
movss  0xc(%rbx,%rcx,4),%xmm3
movaps %xmm3,%xmm4
maxss  %xmm2,%xmm4
minss  %xmm0,%xmm3
add    $0x4,%rcx
cmp    %rcx,%rdx
jne    11d0 <fimg_modetn+0xa0>
movaps %xmm4,%xmm0
movaps %xmm3,%xmm1
test   %rax,%rax
je     124f <fimg_modetn+0x11f>
lea    (%rbx,%rcx,4),%rcx
xor    %edx,%edx
nopl   (%rax)
movss  (%rcx,%rdx,4),%xmm1
movaps %xmm1,%xmm0
maxss  %xmm4,%xmm0
minss  %xmm3,%xmm1
add    $0x1,%rdx
movaps %xmm1,%xmm3
movaps %xmm0,%xmm4
cmp    %rdx,%rax
jne    1230 <fimg_modetn+0x100>
movss  %xmm1,0x10(%rsp)
movss  %xmm0,0x20(%rsp)
lea    0x230(%rsp),%rdi
xor    %ebp,%ebp
mov    $0x200,%edx
xor    %esi,%esi
call   1030 <memset@plt>
lea    0x30(%rsp),%rdi
mov    $0x200,%edx
xor    %esi,%esi
call   1030 <memset@plt>
movss  0x10(%rsp),%xmm2
movss  0x20(%rsp),%xmm4
subss  %xmm2,%xmm4
test   %r15d,%r15d
jle    12e1 <fimg_modetn+0x1b1>
xor    %eax,%eax
movss  0xd6f(%rip),%xmm0
jmp    12b9 <fimg_modetn+0x189>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
add    $0x1,%rax
cmp    %rax,%r12
je     12dd <fimg_modetn+0x1ad>
movss  (%rbx,%rax,4),%xmm1
subss  %xmm2,%xmm1
mulss  %xmm0,%xmm1
divss  %xmm4,%xmm1
cvttss2si %xmm1,%ecx
cmp    $0x7f,%ecx
jg     12b0 <fimg_modetn+0x180>
movslq %ecx,%rcx
addl   $0x1,0x30(%rsp,%rcx,4)
jmp    12b0 <fimg_modetn+0x180>
mov    0x30(%rsp),%ebp
mov    $0x4,%eax
cs nopw 0x0(%rax,%rax,1)
add    0x24(%rsp,%rax,4),%ebp
mov    %ebp,0x24(%rsp,%rax,4)
add    0x28(%rsp,%rax,4),%ebp
mov    %ebp,0x28(%rsp,%rax,4)
add    0x2c(%rsp,%rax,4),%ebp
mov    %ebp,0x2c(%rsp,%rax,4)
cmp    $0x80,%rax
je     131e <fimg_modetn+0x1ee>
add    0x30(%rsp,%rax,4),%ebp
mov    %ebp,0x30(%rsp,%rax,4)
add    $0x4,%rax
jmp    12f0 <fimg_modetn+0x1c0>
xorps  %xmm0,%xmm0
cvtsi2ssl 0x22c(%rsp),%xmm0
mov    $0x2,%eax
movsd  0xce1(%rip),%xmm1
movss  0xcd1(%rip),%xmm3
nop
xorps  %xmm2,%xmm2
cvtsi2ssl 0x2c(%rsp,%rax,4),%xmm2
divss  %xmm0,%xmm2
cvtss2sd %xmm2,%xmm2
ucomisd %xmm1,%xmm2
ja     137c <fimg_modetn+0x24c>
cmp    $0x80,%rax
je     1386 <fimg_modetn+0x256>
xorps  %xmm2,%xmm2
cvtsi2ssl 0x30(%rsp,%rax,4),%xmm2
divss  %xmm0,%xmm2
cvtss2sd %xmm2,%xmm2
ucomisd %xmm1,%xmm2
ja     1380 <fimg_modetn+0x250>
add    $0x2,%rax
jmp    1340 <fimg_modetn+0x210>
add    $0xffffffffffffffff,%rax
cvtsi2ss %eax,%xmm5
jmp    1389 <fimg_modetn+0x259>
movaps %xmm3,%xmm5
mov    $0x2,%eax
movsd  0xc8a(%rip),%xmm1
cs nopw 0x0(%rax,%rax,1)
xorps  %xmm2,%xmm2
cvtsi2ssl 0x2c(%rsp,%rax,4),%xmm2
divss  %xmm0,%xmm2
cvtss2sd %xmm2,%xmm2
ucomisd %xmm1,%xmm2
ja     13dc <fimg_modetn+0x2ac>
cmp    $0x80,%rax
je     13e7 <fimg_modetn+0x2b7>
xorps  %xmm2,%xmm2
cvtsi2ssl 0x30(%rsp,%rax,4),%xmm2
divss  %xmm0,%xmm2
cvtss2sd %xmm2,%xmm2
ucomisd %xmm1,%xmm2
ja     13e0 <fimg_modetn+0x2b0>
add    $0x2,%rax
jmp    13a0 <fimg_modetn+0x270>
add    $0xffffffffffffffff,%rax
xorps  %xmm3,%xmm3
cvtsi2ss %eax,%xmm3
mulss  %xmm4,%xmm5
movss  0xc21(%rip),%xmm0
mulss  %xmm0,%xmm5
mulss  %xmm4,%xmm3
mulss  %xmm0,%xmm3
subss  %xmm5,%xmm3
mulss  %xmm0,%xmm3
test   %r15d,%r15d
jle    143b <fimg_modetn+0x30b>
xor    %eax,%eax
jmp    1419 <fimg_modetn+0x2e9>
add    $0x1,%rax
cmp    %rax,%r12
je     143b <fimg_modetn+0x30b>
movss  (%rbx,%rax,4),%xmm0
subss  %xmm5,%xmm0
divss  %xmm3,%xmm0
cvttss2si %xmm0,%ecx
cmp    $0x7f,%ecx
ja     1410 <fimg_modetn+0x2e0>
mov    %ecx,%ecx
addl   $0x1,0x230(%rsp,%rcx,4)
01
jmp    1410 <fimg_modetn+0x2e0>
lea    0x230(%rsp),%rdi
mov    $0x80,%esi
mov    %r14d,%edx
movss  %xmm3,0x20(%rsp)
movss  %xmm5,0x10(%rsp)
call   1040 <hsmooth@plt>
movss  0x10(%rsp),%xmm1
movss  0x20(%rsp),%xmm2
xor    %eax,%eax
mov    $0x2,%ecx
mov    0x230(%rsp),%edx
movss  0xc(%rsp),%xmm0
jmp    148d <fimg_modetn+0x35d>
mov    %esi,%eax
add    $0x1,%rcx
cmp    $0x80,%rcx
je     14cd <fimg_modetn+0x39d>
mov    %edx,%edi
lea    -0x1(%rcx),%rsi
xorps  %xmm3,%xmm3
cvtsi2ss %esi,%xmm3
mulss  %xmm2,%xmm3
addss  %xmm1,%xmm3
mov    0x22c(%rsp,%rcx,4),%edx
cmp    %edi,%edx
jle    1480 <fimg_modetn+0x350>
cmp    0x230(%rsp,%rcx,4),%edx
jle    1480 <fimg_modetn+0x350>
ucomiss %xmm0,%xmm3
jbe    1480 <fimg_modetn+0x350>
test   %eax,%eax
je     147e <fimg_modetn+0x34e>
movslq %eax,%rdi
cmp    0x230(%rsp,%rdi,4),%edx
jg     147e <fimg_modetn+0x34e>
jmp    1480 <fimg_modetn+0x350>
cmp    $0x7f,%eax
je     14d6 <fimg_modetn+0x3a6>
test   %eax,%eax
jne    14f9 <fimg_modetn+0x3c9>
mov    0x2afb(%rip),%rax
mov    (%rax),%edi
lea    0xb4a(%rip),%rsi
movss  %xmm3,0xc(%rsp)
call   1050 <fprintf@plt>
movss  0xc(%rsp),%xmm0
jmp    155b <fimg_modetn+0x42b>
movslq %eax,%rcx
mov    0x234(%rsp,%rcx,4),%edx
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
mulss  %xmm2,%xmm0
addss  %xmm1,%xmm0
cvtss2sd %xmm0,%xmm0
mov    0x22c(%rsp,%rcx,4),%eax
mov    %edx,%esi
sub    %eax,%esi
xorps  %xmm1,%xmm1
cvtsi2sd %esi,%xmm1
mulsd  0xaf8(%rip),%xmm1
mov    0x230(%rsp,%rcx,4),%ecx
cvtss2sd %xmm2,%xmm2
mulsd  %xmm1,%xmm2
add    %ecx,%ecx
add    %edx,%eax
sub    %ecx,%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
divsd  %xmm1,%xmm2
addsd  %xmm0,%xmm2
xorps  %xmm0,%xmm0
cvtsd2ss %xmm2,%xmm0
add    $0x430,%rsp
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

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

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