#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*/ printf(char *, double, ...);
int /*<<< orphan*/ stdout;
float fimg_mode(float *fimg, int nval) {
  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]);
  imax = 0;
  for (i = 1; i < nbin - 1; i++) {
    if (hist[i] > hist[i - 1] && hist[i] > hist[i + 1]) {
      if (debug)
        printf("peak at i=%d\n", 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_mode>:
push   %rbp
mov    %rsp,%rbp
sub    $0x460,%rsp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
movl   $0x80,-0x424(%rbp)
movl   $0x0,-0x438(%rbp)
mov    0x2e9b(%rip),%rax
movss  (%rax),%xmm0
movd   %xmm0,%eax
xor    $0x80000000,%eax
movd   %eax,%xmm0
movss  %xmm0,-0x440(%rbp)
ff
mov    0x2e7b(%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    123f <fimg_mode+0x11f>
mov    -0x10(%rbp),%rax
movslq -0x428(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
ucomiss -0x440(%rbp),%xmm0
jbe    11d2 <fimg_mode+0xb2>
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    120b <fimg_mode+0xeb>
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    118e <fimg_mode+0x6e>
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     12af <fimg_mode+0x18f>
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    0xd70(%rip),%rdi
mov    $0x3,%al
call   1030 <printf@plt>
movl   $0x0,-0x430(%rbp)
mov    -0x430(%rbp),%eax
cmp    -0x424(%rbp),%eax
jge    1303 <fimg_mode+0x1e3>
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    12b9 <fimg_mode+0x199>
movl   $0x0,-0x428(%rbp)
mov    -0x428(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    1395 <fimg_mode+0x275>
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    137c <fimg_mode+0x25c>
movslq -0x430(%rbp),%rax
mov    -0x420(%rbp,%rax,4),%ecx
add    $0x1,%ecx
mov    %ecx,-0x420(%rbp,%rax,4)
jmp    1381 <fimg_mode+0x261>
mov    -0x428(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x428(%rbp)
jmp    130d <fimg_mode+0x1ed>
movl   $0x1,-0x430(%rbp)
mov    -0x430(%rbp),%eax
cmp    -0x424(%rbp),%eax
jge    13ec <fimg_mode+0x2cc>
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    139f <fimg_mode+0x27f>
cmpl   $0x0,-0x438(%rbp)
je     1452 <fimg_mode+0x332>
movl   $0x0,-0x430(%rbp)
mov    -0x430(%rbp),%eax
cmp    -0x424(%rbp),%eax
jge    144d <fimg_mode+0x32d>
cvtsi2sdl -0x430(%rbp),%xmm0
ff
movslq -0x430(%rbp),%rax
mov    -0x420(%rbp,%rax,4),%esi
lea    0xc00(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
mov    -0x430(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x430(%rbp)
jmp    1403 <fimg_mode+0x2e3>
jmp    1452 <fimg_mode+0x332>
movl   $0x1,-0x428(%rbp)
mov    -0x428(%rbp),%eax
cmp    -0x424(%rbp),%eax
jge    14ca <fimg_mode+0x3aa>
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  0xb5e(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    14b1 <fimg_mode+0x391>
jmp    14ca <fimg_mode+0x3aa>
jmp    14b6 <fimg_mode+0x396>
mov    -0x428(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x428(%rbp)
jmp    145c <fimg_mode+0x33c>
movl   $0x1,-0x42c(%rbp)
mov    -0x42c(%rbp),%eax
cmp    -0x424(%rbp),%eax
jge    1542 <fimg_mode+0x422>
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  0xaee(%rip),%xmm1
ucomisd %xmm1,%xmm0
jbe    1529 <fimg_mode+0x409>
jmp    1542 <fimg_mode+0x422>
jmp    152e <fimg_mode+0x40e>
mov    -0x42c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x42c(%rbp)
jmp    14d4 <fimg_mode+0x3b4>
cmpl   $0x0,-0x438(%rbp)
je     156b <fimg_mode+0x44b>
cvtsi2sdl -0x428(%rbp),%xmm0
ff
mov    -0x42c(%rbp),%esi
lea    0xad9(%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     162e <fimg_mode+0x50e>
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    0x9f1(%rip),%rdi
mov    $0x3,%al
call   1030 <printf@plt>
movl   $0x0,-0x430(%rbp)
mov    -0x430(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    16c1 <fimg_mode+0x5a1>
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     1690 <fimg_mode+0x570>
mov    -0x428(%rbp),%eax
cmp    -0x424(%rbp),%eax
jl     1695 <fimg_mode+0x575>
jmp    16ad <fimg_mode+0x58d>
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    1638 <fimg_mode+0x518>
cmpl   $0x0,-0x438(%rbp)
je     1727 <fimg_mode+0x607>
movl   $0x0,-0x430(%rbp)
mov    -0x430(%rbp),%eax
cmp    -0x424(%rbp),%eax
jge    1722 <fimg_mode+0x602>
cvtsi2sdl -0x430(%rbp),%xmm0
ff
movslq -0x430(%rbp),%rax
mov    -0x220(%rbp,%rax,4),%esi
lea    0x92b(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
mov    -0x430(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x430(%rbp)
jmp    16d8 <fimg_mode+0x5b8>
jmp    1727 <fimg_mode+0x607>
movl   $0x0,-0x434(%rbp)
movl   $0x1,-0x428(%rbp)
mov    -0x428(%rbp),%eax
mov    -0x424(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    181c <fimg_mode+0x6fc>
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    1803 <fimg_mode+0x6e3>
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    1803 <fimg_mode+0x6e3>
cmpl   $0x0,-0x438(%rbp)
je     17c3 <fimg_mode+0x6a3>
cvtsi2sdl -0x428(%rbp),%xmm0
ff
lea    0x88c(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
cmpl   $0x0,-0x434(%rbp)
je     17f2 <fimg_mode+0x6d2>
movslq -0x428(%rbp),%rax
mov    -0x220(%rbp,%rax,4),%eax
movslq -0x434(%rbp),%rcx
cmp    -0x220(%rbp,%rcx,4),%eax
jle    17fe <fimg_mode+0x6de>
mov    -0x428(%rbp),%eax
mov    %eax,-0x434(%rbp)
jmp    1803 <fimg_mode+0x6e3>
jmp    1808 <fimg_mode+0x6e8>
mov    -0x428(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x428(%rbp)
jmp    173b <fimg_mode+0x61b>
cmpl   $0x0,-0x438(%rbp)
je     183f <fimg_mode+0x71f>
cvtsi2sdl -0x434(%rbp),%xmm0
ff
lea    0x81e(%rip),%rdi
mov    $0x1,%al
call   1030 <printf@plt>
cmpl   $0x0,-0x434(%rbp)
je     1863 <fimg_mode+0x743>
mov    -0x434(%rbp),%eax
mov    -0x424(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jne    188a <fimg_mode+0x76a>
mov    0x276e(%rip),%rax
mov    (%rax),%edi
lea    0x7ec(%rip),%rsi
call   1040 <fprintf@plt>
movss  -0x43c(%rbp),%xmm0
ff
movss  %xmm0,-0x4(%rbp)
jmp    19ab <fimg_mode+0x88b>
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  0x755(%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     199e <fimg_mode+0x87e>
movsd  -0x458(%rbp),%xmm0
ff
movsd  -0x460(%rbp),%xmm1
ff
movss  -0x44c(%rbp),%xmm2
ff
cvtss2sd %xmm2,%xmm2
movss  -0x43c(%rbp),%xmm3
ff
cvtss2sd %xmm3,%xmm3
lea    0x6f3(%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_mode>:
push   %rbp
push   %r15
push   %r14
push   %rbx
sub    $0x438,%rsp
mov    %esi,%r14d
mov    %rdi,%rbx
mov    0x2eae(%rip),%rax
movss  (%rax),%xmm5
movaps 0xebb(%rip),%xmm4
xorps  %xmm5,%xmm4
mov    %esi,%r15d
test   %esi,%esi
jle    115c <fimg_mode+0x3c>
cmp    $0x1,%r14d
jne    1161 <fimg_mode+0x41>
xorps  %xmm3,%xmm3
xor    %eax,%eax
jmp    11a5 <fimg_mode+0x85>
xorps  %xmm3,%xmm3
jmp    11c5 <fimg_mode+0xa5>
mov    %r15d,%ecx
and    $0xfffffffe,%ecx
xorps  %xmm3,%xmm3
xor    %eax,%eax
movaps %xmm5,%xmm0
nop
movss  (%rbx,%rax,4),%xmm1
movss  0x4(%rbx,%rax,4),%xmm5
movaps %xmm1,%xmm2
maxss  %xmm4,%xmm2
addss  %xmm1,%xmm3
minss  %xmm0,%xmm1
movaps %xmm5,%xmm4
maxss  %xmm2,%xmm4
addss  %xmm5,%xmm3
minss  %xmm1,%xmm5
add    $0x2,%rax
movaps %xmm5,%xmm0
cmp    %rax,%rcx
jne    1170 <fimg_mode+0x50>
test   $0x1,%r15b
je     11c5 <fimg_mode+0xa5>
movss  (%rbx,%rax,4),%xmm0
movaps %xmm0,%xmm1
maxss  %xmm4,%xmm1
addss  %xmm0,%xmm3
minss  %xmm5,%xmm0
movaps %xmm1,%xmm4
movaps %xmm0,%xmm5
movaps %xmm5,0x10(%rsp)
movaps %xmm4,0x20(%rsp)
movss  %xmm3,0xc(%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>
movaps 0x10(%rsp),%xmm3
movaps 0x20(%rsp),%xmm6
movss  0xc(%rsp),%xmm5
xorps  %xmm0,%xmm0
cvtsi2ss %r14d,%xmm0
subss  %xmm3,%xmm6
test   %r14d,%r14d
jle    1261 <fimg_mode+0x141>
xor    %eax,%eax
movss  0xde9(%rip),%xmm1
jmp    1239 <fimg_mode+0x119>
nopl   0x0(%rax)
add    $0x1,%rax
cmp    %rax,%r15
je     125d <fimg_mode+0x13d>
movss  (%rbx,%rax,4),%xmm2
subss  %xmm3,%xmm2
mulss  %xmm1,%xmm2
divss  %xmm6,%xmm2
cvttss2si %xmm2,%ecx
cmp    $0x7f,%ecx
jg     1230 <fimg_mode+0x110>
movslq %ecx,%rcx
addl   $0x1,0x30(%rsp,%rcx,4)
jmp    1230 <fimg_mode+0x110>
mov    0x30(%rsp),%ebp
divss  %xmm0,%xmm5
mov    $0x4,%eax
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     129e <fimg_mode+0x17e>
add    0x30(%rsp,%rax,4),%ebp
mov    %ebp,0x30(%rsp,%rax,4)
add    $0x4,%rax
jmp    1270 <fimg_mode+0x150>
xorps  %xmm2,%xmm2
cvtsi2ssl 0x22c(%rsp),%xmm2
mov    $0x2,%eax
movsd  0xd61(%rip),%xmm1
movss  0xd51(%rip),%xmm0
nop
xorps  %xmm3,%xmm3
cvtsi2ssl 0x2c(%rsp,%rax,4),%xmm3
divss  %xmm2,%xmm3
cvtss2sd %xmm3,%xmm3
ucomisd %xmm1,%xmm3
ja     12fc <fimg_mode+0x1dc>
cmp    $0x80,%rax
je     1309 <fimg_mode+0x1e9>
xorps  %xmm3,%xmm3
cvtsi2ssl 0x30(%rsp,%rax,4),%xmm3
divss  %xmm2,%xmm3
cvtss2sd %xmm3,%xmm3
ucomisd %xmm1,%xmm3
ja     1300 <fimg_mode+0x1e0>
add    $0x2,%rax
jmp    12c0 <fimg_mode+0x1a0>
add    $0xffffffffffffffff,%rax
xorps  %xmm1,%xmm1
cvtsi2ss %eax,%xmm1
jmp    130c <fimg_mode+0x1ec>
movaps %xmm0,%xmm1
mov    $0x2,%eax
movsd  0xd07(%rip),%xmm3
nopl   0x0(%rax)
xorps  %xmm4,%xmm4
cvtsi2ssl 0x2c(%rsp,%rax,4),%xmm4
divss  %xmm2,%xmm4
cvtss2sd %xmm4,%xmm4
ucomisd %xmm3,%xmm4
ja     135c <fimg_mode+0x23c>
cmp    $0x80,%rax
je     1367 <fimg_mode+0x247>
xorps  %xmm4,%xmm4
cvtsi2ssl 0x30(%rsp,%rax,4),%xmm4
divss  %xmm2,%xmm4
cvtss2sd %xmm4,%xmm4
ucomisd %xmm3,%xmm4
ja     1360 <fimg_mode+0x240>
add    $0x2,%rax
jmp    1320 <fimg_mode+0x200>
add    $0xffffffffffffffff,%rax
xorps  %xmm0,%xmm0
cvtsi2ss %eax,%xmm0
xor    %eax,%eax
mulss  %xmm6,%xmm1
movss  0xc9f(%rip),%xmm2
mulss  %xmm2,%xmm1
mulss  %xmm6,%xmm0
mulss  %xmm2,%xmm0
subss  %xmm1,%xmm0
mulss  %xmm2,%xmm0
mov    $0x0,%ecx
test   %r14d,%r14d
jle    13d2 <fimg_mode+0x2b2>
xor    %ecx,%ecx
jmp    13a9 <fimg_mode+0x289>
nopw   0x0(%rax,%rax,1)
add    $0x1,%rcx
cmp    %rcx,%r15
je     13cb <fimg_mode+0x2ab>
movss  (%rbx,%rcx,4),%xmm2
subss  %xmm1,%xmm2
divss  %xmm0,%xmm2
cvttss2si %xmm2,%edx
cmp    $0x7f,%edx
ja     13a0 <fimg_mode+0x280>
mov    %edx,%edx
addl   $0x1,0x230(%rsp,%rdx,4)
01
jmp    13a0 <fimg_mode+0x280>
mov    0x230(%rsp),%ecx
mov    $0x2,%edx
jmp    13ed <fimg_mode+0x2cd>
lea    -0x1(%rdx),%eax
nopl   0x0(%rax)
add    $0x1,%rdx
cmp    $0x80,%rdx
je     1415 <fimg_mode+0x2f5>
mov    %ecx,%esi
mov    0x22c(%rsp,%rdx,4),%ecx
cmp    %esi,%ecx
jle    13e0 <fimg_mode+0x2c0>
cmp    0x230(%rsp,%rdx,4),%ecx
jle    13e0 <fimg_mode+0x2c0>
test   %eax,%eax
je     13d9 <fimg_mode+0x2b9>
movslq %eax,%rsi
cmp    0x230(%rsp,%rsi,4),%ecx
jg     13d9 <fimg_mode+0x2b9>
jmp    13e0 <fimg_mode+0x2c0>
cmp    $0x7f,%eax
je     141e <fimg_mode+0x2fe>
test   %eax,%eax
jne    1441 <fimg_mode+0x321>
mov    0x2bb3(%rip),%rax
mov    (%rax),%edi
lea    0xc02(%rip),%rsi
movss  %xmm5,0xc(%rsp)
call   1040 <fprintf@plt>
movss  0xc(%rsp),%xmm0
jmp    14a3 <fimg_mode+0x383>
movslq %eax,%rcx
mov    0x234(%rsp,%rcx,4),%edx
xorps  %xmm2,%xmm2
cvtsi2ss %eax,%xmm2
mulss  %xmm0,%xmm2
addss  %xmm1,%xmm2
xorps  %xmm1,%xmm1
cvtss2sd %xmm2,%xmm1
mov    0x22c(%rsp,%rcx,4),%eax
mov    %edx,%esi
sub    %eax,%esi
xorps  %xmm2,%xmm2
cvtsi2sd %esi,%xmm2
mulsd  0xbad(%rip),%xmm2
mov    0x230(%rsp,%rcx,4),%ecx
cvtss2sd %xmm0,%xmm0
mulsd  %xmm2,%xmm0
add    %ecx,%ecx
add    %edx,%eax
sub    %ecx,%eax
xorps  %xmm2,%xmm2
cvtsi2sd %eax,%xmm2
divsd  %xmm2,%xmm0
addsd  %xmm1,%xmm0
cvtsd2ss %xmm0,%xmm0
add    $0x438,%rsp
pop    %rbx
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 = [14 x i8] c"peak at i=%d\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_mode(float* %0, i32 %1) {
%3 = alloca float
%4 = alloca float*
%5 = alloca i32
%6 = alloca [128 x i32]
%7 = alloca [128 x i32]
%8 = alloca i32
%9 = alloca i32
%10 = alloca i32
%11 = alloca i32
%12 = alloca i32
%13 = alloca i32
%14 = alloca float
%15 = alloca float
%16 = alloca float
%17 = alloca float
%18 = alloca float
%19 = alloca double
%20 = alloca double
store float* %0, float** %4
store i32 %1, i32* %5
store i32 128, i32* %8
store i32 0, i32* %13
%21 = load float, float* @FLT_MAX
%22 = fneg float %21
store float %22, float* %15
%23 = load float, float* @FLT_MAX
store float %23, float* %16
store i32 0, i32* %9
store float 0.000000e+00, float* %14
br label %24
24: ; preds = %64, %2
%25 = load i32, i32* %9
%26 = load i32, i32* %5
%27 = icmp slt i32 %25, %26
br i1 %27, label %28, label %67
28: ; preds = %24
%29 = load float*, float** %4
%30 = load i32, i32* %9
%31 = sext i32 %30 to i64
%32 = getelementptr inbounds float, float* %29, i64 %31
%33 = load float, float* %32
%34 = load float, float* %15
%35 = fcmp ogt float %33, %34
br i1 %35, label %36, label %42
36: ; preds = %28
%37 = load float*, float** %4
%38 = load i32, i32* %9
%39 = sext i32 %38 to i64
%40 = getelementptr inbounds float, float* %37, i64 %39
%41 = load float, float* %40
store float %41, float* %15
br label %42
42: ; preds = %36, %28
%43 = load float*, float** %4
%44 = load i32, i32* %9
%45 = sext i32 %44 to i64
%46 = getelementptr inbounds float, float* %43, i64 %45
%47 = load float, float* %46
%48 = load float, float* %16
%49 = fcmp olt float %47, %48
br i1 %49, label %50, label %56
50: ; preds = %42
%51 = load float*, float** %4
%52 = load i32, i32* %9
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds float, float* %51, i64 %53
%55 = load float, float* %54
store float %55, float* %16
br label %56
56: ; preds = %50, %42
%57 = load float*, float** %4
%58 = load i32, i32* %9
%59 = sext i32 %58 to i64
%60 = getelementptr inbounds float, float* %57, i64 %59
%61 = load float, float* %60
%62 = load float, float* %14
%63 = fadd float %62, %61
store float %63, float* %14
br label %64
64: ; preds = %56
%65 = load i32, i32* %9
%66 = add nsw i32 %65, 1
store i32 %66, i32* %9
br label %24
67: ; preds = %24
%68 = load i32, i32* %5
%69 = sitofp i32 %68 to float
%70 = load float, float* %14
%71 = fdiv float %70, %69
store float %71, float* %14
%72 = load float, float* %15
%73 = load float, float* %16
%74 = fsub float %72, %73
store float %74, float* %17
%75 = load i32, i32* %13
%76 = icmp ne i32 %75, 0
br i1 %76, label %77, label %85
77: ; preds = %67
%78 = load float, float* %16
%79 = fpext float %78 to double
%80 = load float, float* %15
%81 = fpext float %80 to double
%82 = load float, float* %17
%83 = fpext float %82 to double
%84 = call i32 (i8*, double, ...) @printf(i8* getelementptr inbounds ([26 x i8], [26 x i8]* @.str, i64 0, i64 0), double %79, double %81, double %83)
br label %85
85: ; preds = %77, %67
store i32 0, i32* %11
br label %86
86: ; preds = %97, %85
%87 = load i32, i32* %11
%88 = load i32, i32* %8
%89 = icmp slt i32 %87, %88
br i1 %89, label %90, label %100
90: ; preds = %86
%91 = load i32, i32* %11
%92 = sext i32 %91 to i64
%93 = getelementptr inbounds [128 x i32], [128 x i32]* %6, i64 0, i64 %92
store i32 0, i32* %93
%94 = load i32, i32* %11
%95 = sext i32 %94 to i64
%96 = getelementptr inbounds [128 x i32], [128 x i32]* %7, i64 0, i64 %95
store i32 0, i32* %96
br label %97
97: ; preds = %90
%98 = load i32, i32* %11
%99 = add nsw i32 %98, 1
store i32 %99, i32* %11
br label %86
100: ; preds = %86
store i32 0, i32* %9
br label %101
101: ; preds = %129, %100
%102 = load i32, i32* %9
%103 = load i32, i32* %5
%104 = icmp slt i32 %102, %103
br i1 %104, label %105, label %132
105: ; preds = %101
%106 = load i32, i32* %8
%107 = sitofp i32 %106 to float
%108 = load float*, float** %4
%109 = load i32, i32* %9
%110 = sext i32 %109 to i64
%111 = getelementptr inbounds float, float* %108, i64 %110
%112 = load float, float* %111
%113 = load float, float* %16
%114 = fsub float %112, %113
%115 = fmul float %107, %114
%116 = load float, float* %17
%117 = fdiv float %115, %116
%118 = fptosi float %117 to i32
store i32 %118, i32* %11
%119 = load i32, i32* %11
%120 = load i32, i32* %8
%121 = icmp slt i32 %119, %120
br i1 %121, label %122, label %128
122: ; preds = %105
%123 = load i32, i32* %11
%124 = sext i32 %123 to i64
%125 = getelementptr inbounds [128 x i32], [128 x i32]* %7, i64 0, i64 %124
%126 = load i32, i32* %125
%127 = add nsw i32 %126, 1
store i32 %127, i32* %125
br label %128
128: ; preds = %122, %105
br label %129
129: ; preds = %128
%130 = load i32, i32* %9
%131 = add nsw i32 %130, 1
store i32 %131, i32* %9
br label %101
132: ; preds = %101
store i32 1, i32* %11
br label %133
133: ; preds = %148, %132
%134 = load i32, i32* %11
%135 = load i32, i32* %8
%136 = icmp slt i32 %134, %135
br i1 %136, label %137, label %151
137: ; preds = %133
%138 = load i32, i32* %11
%139 = sub nsw i32 %138, 1
%140 = sext i32 %139 to i64
%141 = getelementptr inbounds [128 x i32], [128 x i32]* %7, i64 0, i64 %140
%142 = load i32, i32* %141
%143 = load i32, i32* %11
%144 = sext i32 %143 to i64
%145 = getelementptr inbounds [128 x i32], [128 x i32]* %7, i64 0, i64 %144
%146 = load i32, i32* %145
%147 = add nsw i32 %146, %142
store i32 %147, i32* %145
br label %148
148: ; preds = %137
%149 = load i32, i32* %11
%150 = add nsw i32 %149, 1
store i32 %150, i32* %11
br label %133
151: ; preds = %133
%152 = load i32, i32* %13
%153 = icmp ne i32 %152, 0
br i1 %153, label %154, label %171
154: ; preds = %151
store i32 0, i32* %11
br label %155
155: ; preds = %167, %154
%156 = load i32, i32* %11
%157 = load i32, i32* %8
%158 = icmp slt i32 %156, %157
br i1 %158, label %159, label %170
159: ; preds = %155
%160 = load i32, i32* %11
%161 = sitofp i32 %160 to double
%162 = load i32, i32* %11
%163 = sext i32 %162 to i64
%164 = getelementptr inbounds [128 x i32], [128 x i32]* %7, i64 0, i64 %163
%165 = load i32, i32* %164
%166 = call i32 (i8*, double, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i64 0, i64 0), double %161, i32 %165)
br label %167
167: ; preds = %159
%168 = load i32, i32* %11
%169 = add nsw i32 %168, 1
store i32 %169, i32* %11
br label %155
170: ; preds = %155
br label %171
171: ; preds = %170, %151
store i32 1, i32* %9
br label %172
172: ; preds = %193, %171
%173 = load i32, i32* %9
%174 = load i32, i32* %8
%175 = icmp slt i32 %173, %174
br i1 %175, label %176, label %196
176: ; preds = %172
%177 = load i32, i32* %9
%178 = sext i32 %177 to i64
%179 = getelementptr inbounds [128 x i32], [128 x i32]* %7, i64 0, i64 %178
%180 = load i32, i32* %179
%181 = sitofp i32 %180 to float
%182 = load i32, i32* %8
%183 = sub nsw i32 %182, 1
%184 = sext i32 %183 to i64
%185 = getelementptr inbounds [128 x i32], [128 x i32]* %7, i64 0, i64 %184
%186 = load i32, i32* %185
%187 = sitofp i32 %186 to float
%188 = fdiv float %181, %187
%189 = fpext float %188 to double
%190 = fcmp ogt double %189, 1.000000e-03
br i1 %190, label %191, label %192
191: ; preds = %176
br label %196
192: ; preds = %176
br label %193
193: ; preds = %192
%194 = load i32, i32* %9
%195 = add nsw i32 %194, 1
store i32 %195, i32* %9
br label %172
196: ; preds = %191, %172
store i32 1, i32* %10
br label %197
197: ; preds = %218, %196
%198 = load i32, i32* %10
%199 = load i32, i32* %8
%200 = icmp slt i32 %198, %199
br i1 %200, label %201, label %221
201: ; preds = %197
%202 = load i32, i32* %10
%203 = sext i32 %202 to i64
%204 = getelementptr inbounds [128 x i32], [128 x i32]* %7, i64 0, i64 %203
%205 = load i32, i32* %204
%206 = sitofp i32 %205 to float
%207 = load i32, i32* %8
%208 = sub nsw i32 %207, 1
%209 = sext i32 %208 to i64
%210 = getelementptr inbounds [128 x i32], [128 x i32]* %7, i64 0, i64 %209
%211 = load i32, i32* %210
%212 = sitofp i32 %211 to float
%213 = fdiv float %206, %212
%214 = fpext float %213 to double
%215 = fcmp ogt double %214, 0x3FEFF7CED916872B
br i1 %215, label %216, label %217
216: ; preds = %201
br label %221
217: ; preds = %201
br label %218
218: ; preds = %217
%219 = load i32, i32* %10
%220 = add nsw i32 %219, 1
store i32 %220, i32* %10
br label %197
221: ; preds = %216, %197
%222 = load i32, i32* %13
%223 = icmp ne i32 %222, 0
br i1 %223, label %224, label %229
224: ; preds = %221
%225 = load i32, i32* %9
%226 = sitofp i32 %225 to double
%227 = load i32, i32* %10
%228 = call i32 (i8*, double, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.2, i64 0, i64 0), double %226, i32 %227)
br label %229
229: ; preds = %224, %221
%230 = load float, float* %17
%231 = load i32, i32* %9
%232 = sitofp i32 %231 to float
%233 = fmul float %230, %232
%234 = load i32, i32* %8
%235 = sitofp i32 %234 to float
%236 = fdiv float %233, %235
store float %236, float* %16
%237 = load float, float* %17
%238 = load i32, i32* %10
%239 = sitofp i32 %238 to float
%240 = fmul float %237, %239
%241 = load i32, i32* %8
%242 = sitofp i32 %241 to float
%243 = fdiv float %240, %242
store float %243, float* %15
%244 = load float, float* %15
%245 = load float, float* %16
%246 = fsub float %244, %245
store float %246, float* %17
%247 = load float, float* %17
%248 = load i32, i32* %8
%249 = sitofp i32 %248 to float
%250 = fdiv float %247, %249
store float %250, float* %18
%251 = load i32, i32* %13
%252 = icmp ne i32 %251, 0
br i1 %252, label %253, label %261
253: ; preds = %229
%254 = load float, float* %16
%255 = fpext float %254 to double
%256 = load float, float* %15
%257 = fpext float %256 to double
%258 = load float, float* %17
%259 = fpext float %258 to double
%260 = call i32 (i8*, double, ...) @printf(i8* getelementptr inbounds ([26 x i8], [26 x i8]* @.str, i64 0, i64 0), double %255, double %257, double %259)
br label %261
261: ; preds = %253, %229
store i32 0, i32* %11
br label %262
262: ; preds = %290, %261
%263 = load i32, i32* %11
%264 = load i32, i32* %5
%265 = icmp slt i32 %263, %264
br i1 %265, label %266, label %293
266: ; preds = %262
%267 = load float*, float** %4
%268 = load i32, i32* %11
%269 = sext i32 %268 to i64
%270 = getelementptr inbounds float, float* %267, i64 %269
%271 = load float, float* %270
%272 = load float, float* %16
%273 = fsub float %271, %272
%274 = load float, float* %18
%275 = fdiv float %273, %274
%276 = fptosi float %275 to i32
store i32 %276, i32* %9
%277 = load i32, i32* %9
%278 = icmp slt i32 %277, 0
br i1 %278, label %283, label %279
279: ; preds = %266
%280 = load i32, i32* %9
%281 = load i32, i32* %8
%282 = icmp sge i32 %280, %281
br i1 %282, label %283, label %284
283: ; preds = %279, %266
br label %290
284: ; preds = %279
%285 = load i32, i32* %9
%286 = sext i32 %285 to i64
%287 = getelementptr inbounds [128 x i32], [128 x i32]* %6, i64 0, i64 %286
%288 = load i32, i32* %287
%289 = add nsw i32 %288, 1
store i32 %289, i32* %287
br label %290
290: ; preds = %284, %283
%291 = load i32, i32* %11
%292 = add nsw i32 %291, 1
store i32 %292, i32* %11
br label %262
293: ; preds = %262
%294 = load i32, i32* %13
%295 = icmp ne i32 %294, 0
br i1 %295, label %296, label %313
296: ; preds = %293
store i32 0, i32* %11
br label %297
297: ; preds = %309, %296
%298 = load i32, i32* %11
%299 = load i32, i32* %8
%300 = icmp slt i32 %298, %299
br i1 %300, label %301, label %312
301: ; preds = %297
%302 = load i32, i32* %11
%303 = sitofp i32 %302 to double
%304 = load i32, i32* %11
%305 = sext i32 %304 to i64
%306 = getelementptr inbounds [128 x i32], [128 x i32]* %6, i64 0, i64 %305
%307 = load i32, i32* %306
%308 = call i32 (i8*, double, ...) @printf(i8* getelementptr inbounds ([11 x i8], [11 x i8]* @.str.1, i64 0, i64 0), double %303, i32 %307)
br label %309
309: ; preds = %301
%310 = load i32, i32* %11
%311 = add nsw i32 %310, 1
store i32 %311, i32* %11
br label %297
312: ; preds = %297
br label %313
313: ; preds = %312, %293
store i32 0, i32* %12
store i32 1, i32* %9
br label %314
314: ; preds = %365, %313
%315 = load i32, i32* %9
%316 = load i32, i32* %8
%317 = sub nsw i32 %316, 1
%318 = icmp slt i32 %315, %317
br i1 %318, label %319, label %368
319: ; preds = %314
%320 = load i32, i32* %9
%321 = sext i32 %320 to i64
%322 = getelementptr inbounds [128 x i32], [128 x i32]* %6, i64 0, i64 %321
%323 = load i32, i32* %322
%324 = load i32, i32* %9
%325 = sub nsw i32 %324, 1
%326 = sext i32 %325 to i64
%327 = getelementptr inbounds [128 x i32], [128 x i32]* %6, i64 0, i64 %326
%328 = load i32, i32* %327
%329 = icmp sgt i32 %323, %328
br i1 %329, label %330, label %364
330: ; preds = %319
%331 = load i32, i32* %9
%332 = sext i32 %331 to i64
%333 = getelementptr inbounds [128 x i32], [128 x i32]* %6, i64 0, i64 %332
%334 = load i32, i32* %333
%335 = load i32, i32* %9
%336 = add nsw i32 %335, 1
%337 = sext i32 %336 to i64
%338 = getelementptr inbounds [128 x i32], [128 x i32]* %6, i64 0, i64 %337
%339 = load i32, i32* %338
%340 = icmp sgt i32 %334, %339
br i1 %340, label %341, label %364
341: ; preds = %330
%342 = load i32, i32* %13
%343 = icmp ne i32 %342, 0
br i1 %343, label %344, label %348
344: ; preds = %341
%345 = load i32, i32* %9
%346 = sitofp i32 %345 to double
%347 = call i32 (i8*, double, ...) @printf(i8* getelementptr inbounds ([14 x i8], [14 x i8]* @.str.3, i64 0, i64 0), double %346)
br label %348
348: ; preds = %344, %341
%349 = load i32, i32* %12
%350 = icmp ne i32 %349, 0
br i1 %350, label %351, label %361
351: ; preds = %348
%352 = load i32, i32* %9
%353 = sext i32 %352 to i64
%354 = getelementptr inbounds [128 x i32], [128 x i32]* %6, i64 0, i64 %353
%355 = load i32, i32* %354
%356 = load i32, i32* %12
%357 = sext i32 %356 to i64
%358 = getelementptr inbounds [128 x i32], [128 x i32]* %6, i64 0, i64 %357
%359 = load i32, i32* %358
%360 = icmp sgt i32 %355, %359
br i1 %360, label %361, label %363
361: ; preds = %351, %348
%362 = load i32, i32* %9
store i32 %362, i32* %12
br label %363
363: ; preds = %361, %351
br label %364
364: ; preds = %363, %330, %319
br label %365
365: ; preds = %364
%366 = load i32, i32* %9
%367 = add nsw i32 %366, 1
store i32 %367, i32* %9
br label %314
368: ; preds = %314
%369 = load i32, i32* %13
%370 = icmp ne i32 %369, 0
br i1 %370, label %371, label %375
371: ; preds = %368
%372 = load i32, i32* %12
%373 = sitofp i32 %372 to double
%374 = call i32 (i8*, double, ...) @printf(i8* getelementptr inbounds ([9 x i8], [9 x i8]* @.str.4, i64 0, i64 0), double %373)
br label %375
375: ; preds = %371, %368
%376 = load i32, i32* %12
%377 = icmp eq i32 %376, 0
br i1 %377, label %383, label %378
378: ; preds = %375
%379 = load i32, i32* %12
%380 = load i32, i32* %8
%381 = sub nsw i32 %380, 1
%382 = icmp eq i32 %379, %381
br i1 %382, label %383, label %387
383: ; preds = %378, %375
%384 = load i32, i32* @stdout
%385 = call i32 @fprintf(i32 %384, i8* getelementptr inbounds ([43 x i8], [43 x i8]* @.str.5, i64 0, i64 0))
%386 = load float, float* %14
store float %386, float* %3
br label %445
387: ; preds = %378
%388 = load i32, i32* %12
%389 = add nsw i32 %388, 1
%390 = sext i32 %389 to i64
%391 = getelementptr inbounds [128 x i32], [128 x i32]* %6, i64 0, i64 %390
%392 = load i32, i32* %391
%393 = load i32, i32* %12
%394 = sub nsw i32 %393, 1
%395 = sext i32 %394 to i64
%396 = getelementptr inbounds [128 x i32], [128 x i32]* %6, i64 0, i64 %395
%397 = load i32, i32* %396
%398 = sub nsw i32 %392, %397
%399 = sitofp i32 %398 to double
%400 = fmul double 5.000000e-01, %399
store double %400, double* %19
%401 = load i32, i32* %12
%402 = add nsw i32 %401, 1
%403 = sext i32 %402 to i64
%404 = getelementptr inbounds [128 x i32], [128 x i32]* %6, i64 0, i64 %403
%405 = load i32, i32* %404
%406 = load i32, i32* %12
%407 = sub nsw i32 %406, 1
%408 = sext i32 %407 to i64
%409 = getelementptr inbounds [128 x i32], [128 x i32]* %6, i64 0, i64 %408
%410 = load i32, i32* %409
%411 = add nsw i32 %405, %410
%412 = load i32, i32* %12
%413 = sext i32 %412 to i64
%414 = getelementptr inbounds [128 x i32], [128 x i32]* %6, i64 0, i64 %413
%415 = load i32, i32* %414
%416 = mul nsw i32 2, %415
%417 = sub nsw i32 %411, %416
%418 = sitofp i32 %417 to double
store double %418, double* %20
%419 = load float, float* %16
%420 = load float, float* %18
%421 = load i32, i32* %12
%422 = sitofp i32 %421 to float
%423 = call float @llvm.fmuladd.f32(float %420, float %422, float %419)
%424 = fpext float %423 to double
%425 = load float, float* %18
%426 = fpext float %425 to double
%427 = load double, double* %19
%428 = fmul double %426, %427
%429 = load double, double* %20
%430 = fdiv double %428, %429
%431 = fsub double %424, %430
%432 = fptrunc double %431 to float
store float %432, float* %14
%433 = load i32, i32* %13
%434 = icmp ne i32 %433, 0
br i1 %434, label %435, label %443
435: ; preds = %387
%436 = load double, double* %19
%437 = load double, double* %20
%438 = load float, float* %18
%439 = fpext float %438 to double
%440 = load float, float* %14
%441 = fpext float %440 to double
%442 = call i32 (i8*, double, ...) @printf(i8* getelementptr inbounds ([41 x i8], [41 x i8]* @.str.6, i64 0, i64 0), double %436, double %437, double %439, double %441)
br label %443
443: ; preds = %435, %387
%444 = load float, float* %14
store float %444, float* %3
br label %445
445: ; preds = %443, %383
%446 = load float, float* %3
ret float %446
}

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