int difference_edge(the_image, out_image, rows, cols, bits_per_pixel, threshold,
                    high)
int high, threshold;
short **the_image, **out_image;
long rows, cols, bits_per_pixel;
{
  int a, b, absdiff, absmax, diff, i, j, length, max, max_diff, new_hi, new_low,
      width;
  new_hi = 250;
  new_low = 16;
  if (bits_per_pixel == 4) {
    new_hi = 10;
    new_low = 3;
  }
  max = 255;
  if (bits_per_pixel == 4)
    max = 16;
  for (i = 0; i < rows; i++)
    for (j = 0; j < cols; j++)
      out_image[i][j] = 0;
  for (i = 1; i < rows - 1; i++) {
    if ((i % 10) == 0)
      printf("%4d", i);
    for (j = 1; j < cols - 1; j++) {
      max_diff = 0;
      absdiff = abs(the_image[i - 1][j - 1] - the_image[i + 1][j + 1]);
      if (absdiff > max_diff)
        max_diff = absdiff;
      absdiff = abs(the_image[i - 1][j + 1] - the_image[i + 1][j - 1]);
      if (absdiff > max_diff)
        max_diff = absdiff;
      absdiff = abs(the_image[i][j - 1] - the_image[i][j + 1]);
      if (absdiff > max_diff)
        max_diff = absdiff;
      absdiff = abs(the_image[i - 1][j] - the_image[i + 1][j]);
      if (absdiff > max_diff)
        max_diff = absdiff;
      out_image[i][j] = max_diff;
    }
  }
  if (threshold == 1) {
    for (i = 0; i < rows; i++) {
      for (j = 0; j < cols; j++) {
        if (out_image[i][j] > high) {
          out_image[i][j] = new_hi;
        } else {
          out_image[i][j] = new_low;
        }
      }
    }
  }
  return (1);
}


x86 assembly (clang, -O0):
<difference_edge>:
push   %rbp
mov    %rsp,%rbp
sub    $0x60,%rsp
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9d,-0x2c(%rbp)
movl   $0xfa,-0x58(%rbp)
movl   $0x10,-0x5c(%rbp)
cmpq   $0x4,-0x28(%rbp)
jne    116a <difference_edge+0x4a>
movl   $0xa,-0x58(%rbp)
movl   $0x3,-0x5c(%rbp)
movl   $0xff,-0x50(%rbp)
cmpq   $0x4,-0x28(%rbp)
jne    1183 <difference_edge+0x63>
movl   $0x10,-0x50(%rbp)
movl   $0x0,-0x44(%rbp)
movslq -0x44(%rbp),%rax
cmp    -0x18(%rbp),%rax
jge    11e4 <difference_edge+0xc4>
movl   $0x0,-0x48(%rbp)
movslq -0x48(%rbp),%rax
cmp    -0x20(%rbp),%rax
jge    11d1 <difference_edge+0xb1>
mov    -0x10(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movw   $0x0,(%rax,%rcx,2)
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    119f <difference_edge+0x7f>
jmp    11d6 <difference_edge+0xb6>
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    118a <difference_edge+0x6a>
movl   $0x1,-0x44(%rbp)
movslq -0x44(%rbp),%rax
mov    -0x18(%rbp),%rcx
sub    $0x1,%rcx
cmp    %rcx,%rax
jge    13cf <difference_edge+0x2af>
mov    -0x44(%rbp),%eax
mov    $0xa,%ecx
cltd
idiv   %ecx
cmp    $0x0,%edx
jne    1225 <difference_edge+0x105>
mov    -0x44(%rbp),%esi
lea    0xde2(%rip),%rdi
mov    $0x0,%al
call   1040 <printf@plt>
movl   $0x1,-0x48(%rbp)
movslq -0x48(%rbp),%rax
mov    -0x20(%rbp),%rcx
sub    $0x1,%rcx
cmp    %rcx,%rax
jge    13bc <difference_edge+0x29c>
movl   $0x0,-0x54(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x48(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%edi
mov    -0x8(%rbp),%rax
mov    -0x44(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x48(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x54(%rbp),%eax
jle    12a0 <difference_edge+0x180>
mov    -0x38(%rbp),%eax
mov    %eax,-0x54(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x48(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%edi
mov    -0x8(%rbp),%rax
mov    -0x44(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x48(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x54(%rbp),%eax
jle    12f8 <difference_edge+0x1d8>
mov    -0x38(%rbp),%eax
mov    %eax,-0x54(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x48(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%edi
mov    -0x8(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x48(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movswl (%rax,%rcx,2),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x54(%rbp),%eax
jle    1346 <difference_edge+0x226>
mov    -0x38(%rbp),%eax
mov    %eax,-0x54(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x44(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movswl (%rax,%rcx,2),%edi
mov    -0x8(%rbp),%rax
mov    -0x44(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %eax,-0x38(%rbp)
mov    -0x38(%rbp),%eax
cmp    -0x54(%rbp),%eax
jle    1394 <difference_edge+0x274>
mov    -0x38(%rbp),%eax
mov    %eax,-0x54(%rbp)
mov    -0x54(%rbp),%eax
mov    %ax,%dx
mov    -0x10(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    122c <difference_edge+0x10c>
jmp    13c1 <difference_edge+0x2a1>
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    11eb <difference_edge+0xcb>
cmpl   $0x1,-0x2c(%rbp)
jne    1484 <difference_edge+0x364>
movl   $0x0,-0x44(%rbp)
movslq -0x44(%rbp),%rax
cmp    -0x18(%rbp),%rax
jge    147f <difference_edge+0x35f>
movl   $0x0,-0x48(%rbp)
movslq -0x48(%rbp),%rax
cmp    -0x20(%rbp),%rax
jge    146c <difference_edge+0x34c>
mov    -0x10(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
movswl (%rax,%rcx,2),%eax
cmp    0x10(%rbp),%eax
jle    143f <difference_edge+0x31f>
mov    -0x58(%rbp),%eax
mov    %ax,%dx
mov    -0x10(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
jmp    1459 <difference_edge+0x339>
mov    -0x5c(%rbp),%eax
mov    %ax,%dx
mov    -0x10(%rbp),%rax
movslq -0x44(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
movslq -0x48(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
jmp    145e <difference_edge+0x33e>
mov    -0x48(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x48(%rbp)
jmp    13f5 <difference_edge+0x2d5>
jmp    1471 <difference_edge+0x351>
mov    -0x44(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x44(%rbp)
jmp    13e0 <difference_edge+0x2c0>
jmp    1484 <difference_edge+0x364>
mov    $0x1,%eax
add    $0x60,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<difference_edge>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x58,%rsp
mov    %rsi,0x18(%rsp)
mov    %rdi,0x48(%rsp)
cmp    $0x4,%r8
mov    $0xa,%eax
mov    $0xfa,%r13d
cmove  %eax,%r13d
mov    $0x3,%eax
mov    $0x10,%r14d
cmove  %eax,%r14d
test   %rdx,%rdx
jle    18af <difference_edge+0x78f>
mov    %rcx,%r12
mov    %r9d,0x34(%rsp)
lea    (%rcx,%rcx,1),%rbp
lea    -0x1(%rdx),%rax
mov    %edx,%ecx
and    $0x3,%ecx
mov    %rcx,0x8(%rsp)
mov    %rax,0x50(%rsp)
cmp    $0x3,%rax
mov    %rdx,0x20(%rsp)
jae    18c3 <difference_edge+0x7a3>
xor    %r15d,%r15d
cmpq   $0x0,0x8(%rsp)
je     11d0 <difference_edge+0xb0>
mov    0x18(%rsp),%rax
lea    (%rax,%r15,8),%r15
xor    %ebx,%ebx
jmp    11bb <difference_edge+0x9b>
nopl   0x0(%rax)
add    $0x1,%rbx
cmp    %rbx,0x8(%rsp)
je     11d0 <difference_edge+0xb0>
test   %r12,%r12
jle    11b0 <difference_edge+0x90>
mov    (%r15,%rbx,8),%rdi
xor    %esi,%esi
mov    %rbp,%rdx
call   1040 <memset@plt>
jmp    11b0 <difference_edge+0x90>
mov    0x20(%rsp),%r15
cmp    $0x3,%r15
jl     1650 <difference_edge+0x530>
lea    -0x1(%r12),%rax
mov    %rax,0x8(%rsp)
lea    -0x2(%r12),%rax
mov    %rax,0x10(%rsp)
and    $0xfffffffffffffff8,%rax
mov    %rax,0x40(%rsp)
add    $0x1,%rax
mov    %rax,0x38(%rsp)
mov    $0x1,%ebp
pxor   %xmm9,%xmm9
movdqa 0xde8(%rip),%xmm10
jmp    1235 <difference_edge+0x115>
nopw   0x0(%rax,%rax,1)
add    $0x1,%rbp
mov    %rbp,%r11
mov    %r11,%rbp
cmp    0x50(%rsp),%r11
je     1650 <difference_edge+0x530>
imul   $0xcccccccd,%ebp,%eax
ror    %eax
cmp    $0x19999999,%eax
jbe    1250 <difference_edge+0x130>
cmp    $0x2,%r12
jle    1220 <difference_edge+0x100>
jmp    1274 <difference_edge+0x154>
nopl   0x0(%rax)
lea    0xdb9(%rip),%rdi
mov    %ebp,%esi
xor    %eax,%eax
call   1030 <printf@plt>
movdqa 0xd97(%rip),%xmm10
pxor   %xmm9,%xmm9
cmp    $0x2,%r12
jle    1220 <difference_edge+0x100>
lea    0x1(%rbp),%r11
mov    0x48(%rsp),%rsi
mov    -0x8(%rsi,%rbp,8),%rcx
mov    (%rsi,%rbp,8),%rdx
mov    %r11d,%eax
mov    (%rsi,%rax,8),%rsi
mov    0x18(%rsp),%rax
mov    (%rax,%rbp,8),%r8
mov    $0x1,%eax
cmpq   $0x8,0x10(%rsp)
jb     15c0 <difference_edge+0x4a0>
mov    %r11,0x28(%rsp)
lea    0x2(%r8),%rbp
mov    0x8(%rsp),%rdi
lea    (%r8,%rdi,2),%rdi
lea    (%rcx,%r12,2),%rbx
lea    (%rsi,%r12,2),%r9
lea    (%rdx,%r12,2),%r11
cmp    %rbx,%rbp
setb   %r15b
cmp    %rdi,%rcx
setb   %r10b
cmp    %r9,%rbp
setb   %bl
cmp    %rdi,%rsi
setb   0x7(%rsp)
cmp    %r11,%rbp
setb   %r9b
cmp    %rdi,%rdx
setb   %r11b
test   %r10b,%r15b
jne    15ac <difference_edge+0x48c>
and    0x7(%rsp),%bl
mov    0x20(%rsp),%r15
jne    15b1 <difference_edge+0x491>
and    %r11b,%r9b
mov    0x40(%rsp),%rdi
mov    0x28(%rsp),%r11
jne    15c0 <difference_edge+0x4a0>
xor    %ebp,%ebp
nopl   0x0(%rax)
movdqu (%rcx,%rbp,2),%xmm1
movdqu 0x2(%rcx,%rbp,2),%xmm8
movdqu 0x4(%rcx,%rbp,2),%xmm6
punpcklwd %xmm1,%xmm3
psrad  $0x10,%xmm3
punpckhwd %xmm1,%xmm0
psrad  $0x10,%xmm0
movdqu (%rsi,%rbp,2),%xmm4
movdqu 0x2(%rsi,%rbp,2),%xmm1
movdqu 0x4(%rsi,%rbp,2),%xmm5
punpcklwd %xmm5,%xmm7
psrad  $0x10,%xmm7
psubd  %xmm7,%xmm3
punpckhwd %xmm5,%xmm5
psrad  $0x10,%xmm5
psubd  %xmm5,%xmm0
movdqa %xmm3,%xmm5
psrad  $0x1f,%xmm5
movdqa %xmm3,%xmm7
paddd  %xmm5,%xmm7
pxor   %xmm5,%xmm7
movdqa %xmm0,%xmm5
psrad  $0x1f,%xmm5
movdqa %xmm0,%xmm2
paddd  %xmm5,%xmm2
pxor   %xmm5,%xmm2
pcmpeqd %xmm9,%xmm0
pandn  %xmm2,%xmm0
pcmpeqd %xmm9,%xmm3
pandn  %xmm7,%xmm3
punpckhwd %xmm6,%xmm5
psrad  $0x10,%xmm5
punpcklwd %xmm6,%xmm6
psrad  $0x10,%xmm6
punpckhwd %xmm4,%xmm2
psrad  $0x10,%xmm2
psubd  %xmm2,%xmm5
punpcklwd %xmm4,%xmm2
psrad  $0x10,%xmm2
psubd  %xmm2,%xmm6
movdqa %xmm5,%xmm2
psrad  $0x1f,%xmm2
paddd  %xmm2,%xmm5
pxor   %xmm2,%xmm5
movdqa %xmm6,%xmm2
psrad  $0x1f,%xmm2
paddd  %xmm2,%xmm6
pxor   %xmm2,%xmm6
movdqa %xmm6,%xmm4
pxor   %xmm10,%xmm4
movdqa %xmm3,%xmm2
pxor   %xmm10,%xmm2
pcmpgtd %xmm2,%xmm4
pand   %xmm4,%xmm6
pandn  %xmm3,%xmm4
por    %xmm6,%xmm4
movdqa %xmm5,%xmm3
pxor   %xmm10,%xmm3
movdqa %xmm0,%xmm2
pxor   %xmm10,%xmm2
pcmpgtd %xmm2,%xmm3
pand   %xmm3,%xmm5
pandn  %xmm0,%xmm3
por    %xmm5,%xmm3
movdqu (%rdx,%rbp,2),%xmm0
movdqu 0x4(%rdx,%rbp,2),%xmm2
punpcklwd %xmm0,%xmm5
psrad  $0x10,%xmm5
punpckhwd %xmm0,%xmm6
psrad  $0x10,%xmm6
punpcklwd %xmm2,%xmm0
psrad  $0x10,%xmm0
psubd  %xmm0,%xmm5
punpckhwd %xmm2,%xmm0
psrad  $0x10,%xmm0
psubd  %xmm0,%xmm6
movdqa %xmm5,%xmm0
psrad  $0x1f,%xmm0
paddd  %xmm0,%xmm5
pxor   %xmm0,%xmm5
movdqa %xmm6,%xmm0
psrad  $0x1f,%xmm0
paddd  %xmm0,%xmm6
pxor   %xmm0,%xmm6
movdqa %xmm3,%xmm0
pxor   %xmm10,%xmm0
movdqa %xmm6,%xmm2
pxor   %xmm10,%xmm2
pcmpgtd %xmm0,%xmm2
pand   %xmm2,%xmm6
pandn  %xmm3,%xmm2
por    %xmm6,%xmm2
movdqa %xmm4,%xmm0
pxor   %xmm10,%xmm0
movdqa %xmm5,%xmm6
pxor   %xmm10,%xmm6
pcmpgtd %xmm0,%xmm6
pand   %xmm6,%xmm5
pandn  %xmm4,%xmm6
por    %xmm5,%xmm6
punpckhwd %xmm8,%xmm3
psrad  $0x10,%xmm3
punpcklwd %xmm8,%xmm0
psrad  $0x10,%xmm0
punpckhwd %xmm1,%xmm4
psrad  $0x10,%xmm4
psubd  %xmm4,%xmm3
punpcklwd %xmm1,%xmm1
psrad  $0x10,%xmm1
psubd  %xmm1,%xmm0
movdqa %xmm3,%xmm1
psrad  $0x1f,%xmm1
paddd  %xmm1,%xmm3
pxor   %xmm1,%xmm3
movdqa %xmm0,%xmm1
psrad  $0x1f,%xmm1
paddd  %xmm1,%xmm0
pxor   %xmm1,%xmm0
movdqa %xmm6,%xmm1
pxor   %xmm10,%xmm1
movdqa %xmm0,%xmm4
pxor   %xmm10,%xmm4
pcmpgtd %xmm1,%xmm4
pand   %xmm4,%xmm0
pandn  %xmm6,%xmm4
por    %xmm0,%xmm4
movdqa %xmm2,%xmm0
pxor   %xmm10,%xmm0
movdqa %xmm3,%xmm1
pxor   %xmm10,%xmm1
pcmpgtd %xmm0,%xmm1
pand   %xmm1,%xmm3
pandn  %xmm2,%xmm1
por    %xmm3,%xmm1
pslld  $0x10,%xmm1
psrad  $0x10,%xmm1
pslld  $0x10,%xmm4
psrad  $0x10,%xmm4
packssdw %xmm1,%xmm4
movdqu %xmm4,0x2(%r8,%rbp,2)
add    $0x8,%rbp
cmp    %rbp,%rdi
jne    1320 <difference_edge+0x200>
mov    0x38(%rsp),%rax
cmp    %rdi,0x10(%rsp)
je     1227 <difference_edge+0x107>
jmp    15c0 <difference_edge+0x4a0>
mov    0x20(%rsp),%r15
mov    0x28(%rsp),%r11
cs nopw 0x0(%rax,%rax,1)
lea    (%r8,%rax,2),%r8
lea    (%rsi,%rax,2),%rsi
lea    (%rcx,%rax,2),%rcx
lea    (%rdx,%rax,2),%r10
add    $0x2,%r10
mov    0x8(%rsp),%r9
sub    %rax,%r9
xor    %eax,%eax
xchg   %ax,%ax
movswl -0x2(%rcx,%rax,2),%ebx
movswl 0x2(%rsi,%rax,2),%edi
sub    %edi,%ebx
mov    %ebx,%edi
neg    %edi
cmovs  %ebx,%edi
cmovae %ebx,%edi
movswl 0x2(%rcx,%rax,2),%edx
movswl -0x2(%rsi,%rax,2),%ebp
sub    %ebp,%edx
mov    %edx,%ebx
neg    %ebx
cmovs  %edx,%ebx
cmp    %edi,%ebx
cmovbe %edi,%ebx
movswl -0x4(%r10,%rax,2),%edx
movswl (%r10,%rax,2),%edi
sub    %edi,%edx
mov    %edx,%edi
neg    %edi
cmovs  %edx,%edi
cmp    %ebx,%edi
cmovbe %ebx,%edi
movswl (%rcx,%rax,2),%ebx
movswl (%rsi,%rax,2),%ebp
sub    %ebp,%ebx
mov    %ebx,%edx
neg    %edx
cmovs  %ebx,%edx
cmp    %edi,%edx
cmovbe %edi,%edx
mov    %dx,(%r8,%rax,2)
add    $0x1,%rax
cmp    %rax,%r9
jne    15e0 <difference_edge+0x4c0>
jmp    1227 <difference_edge+0x107>
cmpl   $0x1,0x34(%rsp)
jne    18af <difference_edge+0x78f>
test   %r15,%r15
jle    18af <difference_edge+0x78f>
mov    0x90(%rsp),%eax
lea    -0x10(%r12),%r9
mov    %r9,%r10
shr    $0x4,%r10
add    $0x1,%r10
mov    %r12,%rsi
and    $0xfffffffffffffff0,%rsi
movd   %eax,%xmm0
pshufd $0x0,%xmm0,%xmm0
movd   %r13d,%xmm1
pshuflw $0x0,%xmm1,%xmm1
pshufd $0x0,%xmm1,%xmm8
movd   %r14d,%xmm2
pshuflw $0x0,%xmm2,%xmm2
pshufd $0x0,%xmm2,%xmm2
mov    %r10,%r8
and    $0xfffffffffffffffe,%r8
xor    %ebp,%ebp
jmp    16cd <difference_edge+0x5ad>
cs nopw 0x0(%rax,%rax,1)
nop
add    $0x1,%rbp
cmp    %r15,%rbp
je     18af <difference_edge+0x78f>
test   %r12,%r12
jle    16c0 <difference_edge+0x5a0>
mov    0x18(%rsp),%rcx
mov    (%rcx,%rbp,8),%rdi
cmp    $0x10,%r12
jae    16f0 <difference_edge+0x5d0>
xor    %ecx,%ecx
jmp    1890 <difference_edge+0x770>
nopl   0x0(%rax,%rax,1)
cmp    $0x10,%r9
jae    16fd <difference_edge+0x5dd>
xor    %ecx,%ecx
jmp    1808 <difference_edge+0x6e8>
mov    %r8,%rdx
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movdqu (%rdi,%rcx,2),%xmm6
movdqu 0x10(%rdi,%rcx,2),%xmm7
movdqu 0x20(%rdi,%rcx,2),%xmm4
movdqu 0x30(%rdi,%rcx,2),%xmm3
punpcklwd %xmm6,%xmm5
psrad  $0x10,%xmm5
punpckhwd %xmm6,%xmm6
psrad  $0x10,%xmm6
punpcklwd %xmm7,%xmm1
psrad  $0x10,%xmm1
punpckhwd %xmm7,%xmm7
psrad  $0x10,%xmm7
pcmpgtd %xmm0,%xmm6
pcmpgtd %xmm0,%xmm5
packssdw %xmm6,%xmm5
pcmpgtd %xmm0,%xmm7
pcmpgtd %xmm0,%xmm1
packssdw %xmm7,%xmm1
movdqa %xmm8,%xmm6
pand   %xmm5,%xmm6
pandn  %xmm2,%xmm5
por    %xmm6,%xmm5
movdqa %xmm8,%xmm6
pand   %xmm1,%xmm6
pandn  %xmm2,%xmm1
por    %xmm6,%xmm1
movdqu %xmm5,(%rdi,%rcx,2)
movdqu %xmm1,0x10(%rdi,%rcx,2)
punpcklwd %xmm4,%xmm5
psrad  $0x10,%xmm5
punpckhwd %xmm4,%xmm1
psrad  $0x10,%xmm1
punpcklwd %xmm3,%xmm4
psrad  $0x10,%xmm4
punpckhwd %xmm3,%xmm3
psrad  $0x10,%xmm3
pcmpgtd %xmm0,%xmm1
pcmpgtd %xmm0,%xmm5
packssdw %xmm1,%xmm5
pcmpgtd %xmm0,%xmm3
pcmpgtd %xmm0,%xmm4
packssdw %xmm3,%xmm4
movdqa %xmm8,%xmm1
pand   %xmm5,%xmm1
pandn  %xmm2,%xmm5
por    %xmm1,%xmm5
movdqa %xmm8,%xmm1
pand   %xmm4,%xmm1
pandn  %xmm2,%xmm4
por    %xmm1,%xmm4
movdqu %xmm5,0x20(%rdi,%rcx,2)
movdqu %xmm4,0x30(%rdi,%rcx,2)
add    $0x20,%rcx
add    $0xfffffffffffffffe,%rdx
jne    1710 <difference_edge+0x5f0>
test   $0x1,%r10b
je     1882 <difference_edge+0x762>
movdqu (%rdi,%rcx,2),%xmm1
movdqu 0x10(%rdi,%rcx,2),%xmm4
punpcklwd %xmm1,%xmm3
psrad  $0x10,%xmm3
punpckhwd %xmm1,%xmm1
psrad  $0x10,%xmm1
punpcklwd %xmm4,%xmm5
psrad  $0x10,%xmm5
punpckhwd %xmm4,%xmm4
psrad  $0x10,%xmm4
pcmpgtd %xmm0,%xmm1
pcmpgtd %xmm0,%xmm3
packssdw %xmm1,%xmm3
pcmpgtd %xmm0,%xmm4
pcmpgtd %xmm0,%xmm5
packssdw %xmm4,%xmm5
movdqa %xmm8,%xmm1
pand   %xmm3,%xmm1
pandn  %xmm2,%xmm3
por    %xmm1,%xmm3
movdqa %xmm8,%xmm1
pand   %xmm5,%xmm1
pandn  %xmm2,%xmm5
por    %xmm1,%xmm5
movdqu %xmm3,(%rdi,%rcx,2)
movdqu %xmm5,0x10(%rdi,%rcx,2)
mov    %rsi,%rcx
cmp    %r12,%rsi
je     16c0 <difference_edge+0x5a0>
xchg   %ax,%ax
movswl (%rdi,%rcx,2),%edx
cmp    %eax,%edx
mov    %r14d,%edx
cmovg  %r13d,%edx
mov    %dx,(%rdi,%rcx,2)
add    $0x1,%rcx
cmp    %rcx,%r12
jne    1890 <difference_edge+0x770>
jmp    16c0 <difference_edge+0x5a0>
mov    $0x1,%eax
add    $0x58,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret
and    $0xfffffffffffffffc,%rdx
mov    %rdx,0x10(%rsp)
xor    %r15d,%r15d
mov    0x18(%rsp),%rbx
jmp    18ef <difference_edge+0x7cf>
cs nopw 0x0(%rax,%rax,1)
add    $0x4,%r15
cmp    %r15,0x10(%rsp)
je     1194 <difference_edge+0x74>
test   %r12,%r12
jle    18e0 <difference_edge+0x7c0>
mov    (%rbx,%r15,8),%rdi
xor    %esi,%esi
mov    %rbp,%rdx
call   1040 <memset@plt>
mov    0x8(%rbx,%r15,8),%rdi
xor    %esi,%esi
mov    %rbp,%rdx
call   1040 <memset@plt>
mov    0x10(%rbx,%r15,8),%rdi
xor    %esi,%esi
mov    %rbp,%rdx
call   1040 <memset@plt>
mov    0x18(%rbx,%r15,8),%rdi
xor    %esi,%esi
mov    %rbp,%rdx
call   1040 <memset@plt>
jmp    18e0 <difference_edge+0x7c0>

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

LLVM IR (-O2):
@.str = [4 x i8] c"%4d\00"
define i32 @difference_edge(i16** nocapture %0, i16** nocapture %1, i64 %2, i64 %3, i64 %4, i32 %5, i32 %6) {
%8 = icmp eq i64 %4, 4
%9 = select i1 %8, i16 10, i16 250
%10 = select i1 %8, i16 3, i16 16
%11 = icmp sgt i64 %2, 0
br i1 %11, label %12, label %317
12: ; preds = %7
%13 = icmp sgt i64 %3, 0
%14 = shl nuw i64 %3, 1
%15 = add i64 %2, -1
%16 = and i64 %2, 3
%17 = icmp ult i64 %15, 3
br i1 %17, label %39, label %18
18: ; preds = %12
%19 = and i64 %2, -4
br label %20
20: ; preds = %64, %18
%21 = phi i64 [ 0, %18 ], [ %65, %64 ]
%22 = phi i64 [ 0, %18 ], [ %66, %64 ]
br i1 %13, label %23, label %64
23: ; preds = %20
%24 = getelementptr inbounds i16*, i16** %1, i64 %21
%25 = bitcast i16** %24 to i8**
%26 = load i8*, i8** %25
%27 = or i64 %21, 1
%28 = getelementptr inbounds i16*, i16** %1, i64 %27
%29 = bitcast i16** %28 to i8**
%30 = load i8*, i8** %29
%31 = or i64 %21, 2
%32 = getelementptr inbounds i16*, i16** %1, i64 %31
%33 = bitcast i16** %32 to i8**
%34 = load i8*, i8** %33
%35 = or i64 %21, 3
%36 = getelementptr inbounds i16*, i16** %1, i64 %35
%37 = bitcast i16** %36 to i8**
%38 = load i8*, i8** %37
br label %64
39: ; preds = %64, %12
%40 = phi i64 [ 0, %12 ], [ %65, %64 ]
%41 = icmp eq i64 %16, 0
br i1 %41, label %53, label %42
42: ; preds = %39, %49
%43 = phi i64 [ %50, %49 ], [ %40, %39 ]
%44 = phi i64 [ %51, %49 ], [ 0, %39 ]
br i1 %13, label %45, label %49
45: ; preds = %42
%46 = getelementptr inbounds i16*, i16** %1, i64 %43
%47 = bitcast i16** %46 to i8**
%48 = load i8*, i8** %47
br label %49
49: ; preds = %45, %42
%50 = add nuw nsw i64 %43, 1
%51 = add i64 %44, 1
%52 = icmp eq i64 %51, %16
br i1 %52, label %53, label %42
53: ; preds = %49, %39
%54 = add i64 %2, -1
%55 = icmp sgt i64 %2, 2
br i1 %55, label %56, label %217
56: ; preds = %53
%57 = add i64 %3, -1
%58 = icmp sgt i64 %3, 2
%59 = add i64 %3, -2
%60 = icmp ult i64 %59, 8
%61 = and i64 %59, -8
%62 = or i64 %61, 1
%63 = icmp eq i64 %59, %61
br label %68
64: ; preds = %20, %23
%65 = add nuw nsw i64 %21, 4
%66 = add i64 %22, 4
%67 = icmp eq i64 %66, %19
br i1 %67, label %39, label %20
68: ; preds = %56, %214
%69 = phi i64 [ 1, %56 ], [ %215, %214 ]
%70 = trunc i64 %69 to i32
%71 = urem i32 %70, 10
%72 = icmp eq i32 %71, 0
br i1 %72, label %73, label %75
73: ; preds = %68
%74 = tail call i32 (i8*, ...) @printf(i8* dereferenceable(1) getelementptr inbounds ([4 x i8], [4 x i8]* @.str, i64 0, i64 0), i32 %70)
br label %75
75: ; preds = %73, %68
br i1 %58, label %78, label %76
76: ; preds = %75
%77 = add nuw nsw i64 %69, 1
br label %214
78: ; preds = %75
%79 = add nsw i64 %69, -1
%80 = getelementptr inbounds i16*, i16** %0, i64 %79
%81 = load i16*, i16** %80
%82 = add nuw nsw i64 %69, 1
%83 = and i64 %82, 4294967295
%84 = getelementptr inbounds i16*, i16** %0, i64 %83
%85 = load i16*, i16** %84
%86 = getelementptr inbounds i16*, i16** %0, i64 %69
%87 = load i16*, i16** %86
%88 = getelementptr inbounds i16*, i16** %1, i64 %69
%89 = load i16*, i16** %88
br i1 %60, label %165, label %90
90: ; preds = %78
%91 = getelementptr i16, i16* %89, i64 1
%92 = getelementptr i16, i16* %89, i64 %57
%93 = getelementptr i16, i16* %81, i64 %3
%94 = getelementptr i16, i16* %85, i64 %3
%95 = getelementptr i16, i16* %87, i64 %3
%96 = icmp ult i16* %91, %93
%97 = icmp ult i16* %81, %92
%98 = and i1 %96, %97
%99 = icmp ult i16* %91, %94
%100 = icmp ult i16* %85, %92
%101 = and i1 %99, %100
%102 = or i1 %98, %101
%103 = icmp ult i16* %91, %95
%104 = icmp ult i16* %87, %92
%105 = and i1 %103, %104
%106 = or i1 %102, %105
br i1 %106, label %165, label %107
107: ; preds = %90, %107
%108 = phi i64 [ %162, %107 ], [ 0, %90 ]
%109 = or i64 %108, 1
%110 = getelementptr inbounds i16, i16* %81, i64 %108
%111 = bitcast i16* %110 to <8 x i16>*
%112 = load <8 x i16>, <8 x i16>* %111
%113 = sext <8 x i16> %112 to <8 x i32>
%114 = or i64 %108, 2
%115 = getelementptr inbounds i16, i16* %85, i64 %114
%116 = bitcast i16* %115 to <8 x i16>*
%117 = load <8 x i16>, <8 x i16>* %116
%118 = sext <8 x i16> %117 to <8 x i32>
%119 = sub nsw <8 x i32> %113, %118
%120 = icmp eq <8 x i32> %119, zeroinitializer
%121 = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %119, i1 true)
%122 = select <8 x i1> %120, <8 x i32> zeroinitializer, <8 x i32> %121
%123 = getelementptr inbounds i16, i16* %81, i64 %114
%124 = bitcast i16* %123 to <8 x i16>*
%125 = load <8 x i16>, <8 x i16>* %124
%126 = sext <8 x i16> %125 to <8 x i32>
%127 = getelementptr inbounds i16, i16* %85, i64 %108
%128 = bitcast i16* %127 to <8 x i16>*
%129 = load <8 x i16>, <8 x i16>* %128
%130 = sext <8 x i16> %129 to <8 x i32>
%131 = sub nsw <8 x i32> %126, %130
%132 = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %131, i1 true)
%133 = icmp ugt <8 x i32> %132, %122
%134 = select <8 x i1> %133, <8 x i32> %132, <8 x i32> %122
%135 = getelementptr inbounds i16, i16* %87, i64 %108
%136 = bitcast i16* %135 to <8 x i16>*
%137 = load <8 x i16>, <8 x i16>* %136
%138 = sext <8 x i16> %137 to <8 x i32>
%139 = getelementptr inbounds i16, i16* %87, i64 %114
%140 = bitcast i16* %139 to <8 x i16>*
%141 = load <8 x i16>, <8 x i16>* %140
%142 = sext <8 x i16> %141 to <8 x i32>
%143 = sub nsw <8 x i32> %138, %142
%144 = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %143, i1 true)
%145 = icmp ugt <8 x i32> %144, %134
%146 = select <8 x i1> %145, <8 x i32> %144, <8 x i32> %134
%147 = getelementptr inbounds i16, i16* %81, i64 %109
%148 = bitcast i16* %147 to <8 x i16>*
%149 = load <8 x i16>, <8 x i16>* %148
%150 = sext <8 x i16> %149 to <8 x i32>
%151 = getelementptr inbounds i16, i16* %85, i64 %109
%152 = bitcast i16* %151 to <8 x i16>*
%153 = load <8 x i16>, <8 x i16>* %152
%154 = sext <8 x i16> %153 to <8 x i32>
%155 = sub nsw <8 x i32> %150, %154
%156 = call <8 x i32> @llvm.abs.v8i32(<8 x i32> %155, i1 true)
%157 = icmp ugt <8 x i32> %156, %146
%158 = select <8 x i1> %157, <8 x i32> %156, <8 x i32> %146
%159 = trunc <8 x i32> %158 to <8 x i16>
%160 = getelementptr inbounds i16, i16* %89, i64 %109
%161 = bitcast i16* %160 to <8 x i16>*
store <8 x i16> %159, <8 x i16>* %161
%162 = add nuw i64 %108, 8
%163 = icmp eq i64 %162, %61
br i1 %163, label %164, label %107
164: ; preds = %107
br i1 %63, label %214, label %165
165: ; preds = %90, %78, %164
%166 = phi i64 [ 1, %90 ], [ 1, %78 ], [ %62, %164 ]
br label %167
167: ; preds = %165, %167
%168 = phi i64 [ %173, %167 ], [ %166, %165 ]
%169 = add nsw i64 %168, -1
%170 = getelementptr inbounds i16, i16* %81, i64 %169
%171 = load i16, i16* %170
%172 = sext i16 %171 to i32
%173 = add nuw nsw i64 %168, 1
%174 = getelementptr inbounds i16, i16* %85, i64 %173
%175 = load i16, i16* %174
%176 = sext i16 %175 to i32
%177 = sub nsw i32 %172, %176
%178 = icmp eq i32 %177, 0
%179 = tail call i32 @llvm.abs.i32(i32 %177, i1 true)
%180 = select i1 %178, i32 0, i32 %179
%181 = getelementptr inbounds i16, i16* %81, i64 %173
%182 = load i16, i16* %181
%183 = sext i16 %182 to i32
%184 = getelementptr inbounds i16, i16* %85, i64 %169
%185 = load i16, i16* %184
%186 = sext i16 %185 to i32
%187 = sub nsw i32 %183, %186
%188 = tail call i32 @llvm.abs.i32(i32 %187, i1 true)
%189 = icmp ugt i32 %188, %180
%190 = select i1 %189, i32 %188, i32 %180
%191 = getelementptr inbounds i16, i16* %87, i64 %169
%192 = load i16, i16* %191
%193 = sext i16 %192 to i32
%194 = getelementptr inbounds i16, i16* %87, i64 %173
%195 = load i16, i16* %194
%196 = sext i16 %195 to i32
%197 = sub nsw i32 %193, %196
%198 = tail call i32 @llvm.abs.i32(i32 %197, i1 true)
%199 = icmp ugt i32 %198, %190
%200 = select i1 %199, i32 %198, i32 %190
%201 = getelementptr inbounds i16, i16* %81, i64 %168
%202 = load i16, i16* %201
%203 = sext i16 %202 to i32
%204 = getelementptr inbounds i16, i16* %85, i64 %168
%205 = load i16, i16* %204
%206 = sext i16 %205 to i32
%207 = sub nsw i32 %203, %206
%208 = tail call i32 @llvm.abs.i32(i32 %207, i1 true)
%209 = icmp ugt i32 %208, %200
%210 = select i1 %209, i32 %208, i32 %200
%211 = trunc i32 %210 to i16
%212 = getelementptr inbounds i16, i16* %89, i64 %168
store i16 %211, i16* %212
%213 = icmp eq i64 %173, %57
br i1 %213, label %214, label %167
214: ; preds = %167, %164, %76
%215 = phi i64 [ %77, %76 ], [ %82, %164 ], [ %82, %167 ]
%216 = icmp eq i64 %215, %54
br i1 %216, label %217, label %68
217: ; preds = %214, %53
%218 = icmp eq i32 %5, 1
%219 = and i1 %218, %11
br i1 %219, label %220, label %317
220: ; preds = %217
%221 = icmp sgt i64 %3, 0
%222 = add i64 %3, -16
%223 = lshr i64 %222, 4
%224 = add nuw nsw i64 %223, 1
%225 = icmp ult i64 %3, 16
%226 = and i64 %3, -16
%227 = insertelement <8 x i32> poison, i32 %6, i64 0
%228 = shufflevector <8 x i32> %227, <8 x i32> poison, <8 x i32> zeroinitializer
%229 = insertelement <8 x i32> poison, i32 %6, i64 0
%230 = shufflevector <8 x i32> %229, <8 x i32> poison, <8 x i32> zeroinitializer
%231 = insertelement <8 x i16> poison, i16 %9, i64 0
%232 = shufflevector <8 x i16> %231, <8 x i16> poison, <8 x i32> zeroinitializer
%233 = insertelement <8 x i16> poison, i16 %10, i64 0
%234 = shufflevector <8 x i16> %233, <8 x i16> poison, <8 x i32> zeroinitializer
%235 = insertelement <8 x i16> poison, i16 %9, i64 0
%236 = shufflevector <8 x i16> %235, <8 x i16> poison, <8 x i32> zeroinitializer
%237 = insertelement <8 x i16> poison, i16 %10, i64 0
%238 = shufflevector <8 x i16> %237, <8 x i16> poison, <8 x i32> zeroinitializer
%239 = and i64 %224, 1
%240 = icmp ult i64 %222, 16
%241 = and i64 %224, 2305843009213693950
%242 = icmp eq i64 %239, 0
%243 = icmp eq i64 %226, %3
br label %244
244: ; preds = %220, %314
%245 = phi i64 [ 0, %220 ], [ %315, %314 ]
br i1 %221, label %246, label %314
246: ; preds = %244
%247 = getelementptr inbounds i16*, i16** %1, i64 %245
%248 = load i16*, i16** %247
br i1 %225, label %303, label %249
249: ; preds = %246
br i1 %240, label %285, label %250
250: ; preds = %249, %250
%251 = phi i64 [ %282, %250 ], [ 0, %249 ]
%252 = phi i64 [ %283, %250 ], [ 0, %249 ]
%253 = getelementptr inbounds i16, i16* %248, i64 %251
%254 = bitcast i16* %253 to <8 x i16>*
%255 = load <8 x i16>, <8 x i16>* %254
%256 = getelementptr inbounds i16, i16* %253, i64 8
%257 = bitcast i16* %256 to <8 x i16>*
%258 = load <8 x i16>, <8 x i16>* %257
%259 = sext <8 x i16> %255 to <8 x i32>
%260 = sext <8 x i16> %258 to <8 x i32>
%261 = icmp slt <8 x i32> %228, %259
%262 = icmp slt <8 x i32> %230, %260
%263 = select <8 x i1> %261, <8 x i16> %232, <8 x i16> %234
%264 = select <8 x i1> %262, <8 x i16> %236, <8 x i16> %238
%265 = bitcast i16* %253 to <8 x i16>*
store <8 x i16> %263, <8 x i16>* %265
%266 = bitcast i16* %256 to <8 x i16>*
store <8 x i16> %264, <8 x i16>* %266
%267 = or i64 %251, 16
%268 = getelementptr inbounds i16, i16* %248, i64 %267
%269 = bitcast i16* %268 to <8 x i16>*
%270 = load <8 x i16>, <8 x i16>* %269
%271 = getelementptr inbounds i16, i16* %268, i64 8
%272 = bitcast i16* %271 to <8 x i16>*
%273 = load <8 x i16>, <8 x i16>* %272
%274 = sext <8 x i16> %270 to <8 x i32>
%275 = sext <8 x i16> %273 to <8 x i32>
%276 = icmp slt <8 x i32> %228, %274
%277 = icmp slt <8 x i32> %230, %275
%278 = select <8 x i1> %276, <8 x i16> %232, <8 x i16> %234
%279 = select <8 x i1> %277, <8 x i16> %236, <8 x i16> %238
%280 = bitcast i16* %268 to <8 x i16>*
store <8 x i16> %278, <8 x i16>* %280
%281 = bitcast i16* %271 to <8 x i16>*
store <8 x i16> %279, <8 x i16>* %281
%282 = add nuw i64 %251, 32
%283 = add i64 %252, 2
%284 = icmp eq i64 %283, %241
br i1 %284, label %285, label %250
285: ; preds = %250, %249
%286 = phi i64 [ 0, %249 ], [ %282, %250 ]
br i1 %242, label %302, label %287
287: ; preds = %285
%288 = getelementptr inbounds i16, i16* %248, i64 %286
%289 = bitcast i16* %288 to <8 x i16>*
%290 = load <8 x i16>, <8 x i16>* %289
%291 = getelementptr inbounds i16, i16* %288, i64 8
%292 = bitcast i16* %291 to <8 x i16>*
%293 = load <8 x i16>, <8 x i16>* %292
%294 = sext <8 x i16> %290 to <8 x i32>
%295 = sext <8 x i16> %293 to <8 x i32>
%296 = icmp slt <8 x i32> %228, %294
%297 = icmp slt <8 x i32> %230, %295
%298 = select <8 x i1> %296, <8 x i16> %232, <8 x i16> %234
%299 = select <8 x i1> %297, <8 x i16> %236, <8 x i16> %238
%300 = bitcast i16* %288 to <8 x i16>*
store <8 x i16> %298, <8 x i16>* %300
%301 = bitcast i16* %291 to <8 x i16>*
store <8 x i16> %299, <8 x i16>* %301
br label %302
302: ; preds = %285, %287
br i1 %243, label %314, label %303
303: ; preds = %246, %302
%304 = phi i64 [ 0, %246 ], [ %226, %302 ]
br label %305
305: ; preds = %303, %305
%306 = phi i64 [ %312, %305 ], [ %304, %303 ]
%307 = getelementptr inbounds i16, i16* %248, i64 %306
%308 = load i16, i16* %307
%309 = sext i16 %308 to i32
%310 = icmp sgt i32 %309, %6
%311 = select i1 %310, i16 %9, i16 %10
store i16 %311, i16* %307
%312 = add nuw nsw i64 %306, 1
%313 = icmp eq i64 %312, %3
br i1 %313, label %314, label %305
314: ; preds = %305, %302, %244
%315 = add nuw nsw i64 %245, 1
%316 = icmp eq i64 %315, %2
br i1 %316, label %317, label %244
317: ; preds = %314, %7, %217
ret i32 1
}