#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 */
scalar_t__ abs(int /*<<< orphan*/);
short *create_padded_row(unsigned short *, int, int, int, int);
void sad4_one_macroblock(unsigned short *macroblock_sad, unsigned short *frame,
                         unsigned short *ref, int frame_y, int frame_x,
                         int mb_width, int mb_height) {
  unsigned short frame_mb[256];
  int pos_x, pos_y;
  int blky, pixy;
  int width = mb_width * 16;
  int max_width = width - 17;
  int height = mb_height * 16;
  int max_height = height - 17;
  int range_partly_outside;
  int pos;
  {
    int x, y;
    for (y = 0; y < 16; y++)
      for (x = 0; x < 16; x++)
        frame_mb[16 * y + x] = frame[width * y + x];
  }
  if ((frame_x >= 16) && (frame_x <= width - 16 - 17) && (frame_y >= 16) &&
      (frame_y <= height - 16 - 17))
    range_partly_outside = 0;
  else
    range_partly_outside = 1;
  pos = 0;
  for (pos_y = -16; pos_y <= 16; pos_y++) {
    for (pos_x = -16; pos_x <= 16; pos_x++, pos++) {
      int y;
      int abs_x, abs_y;
      int do_bounds_check;
      short *curptr = frame_mb;
      short *refptr;
      unsigned short *sad_line = macroblock_sad;
      abs_y = frame_y + pos_y;
      abs_x = frame_x + pos_x;
      do_bounds_check =
          range_partly_outside && !(abs_y >= 0 && abs_y <= max_height &&
                                    abs_x >= 0 && abs_x <= max_width);
      for (blky = 0; blky < 4; blky++) {
        int sad0 = 0, sad1 = 0, sad2 = 0, sad3 = 0;
        for (y = 0; y < 4; y++) {
          refptr = do_bounds_check
                       ? create_padded_row(ref, abs_y, abs_x, height, width)
                       : (short *)(ref + abs_y * width + abs_x);
          abs_y++;
          sad0 += abs(*refptr++ - *curptr++);
          sad0 += abs(*refptr++ - *curptr++);
          sad0 += abs(*refptr++ - *curptr++);
          sad0 += abs(*refptr++ - *curptr++);
          sad1 += abs(*refptr++ - *curptr++);
          sad1 += abs(*refptr++ - *curptr++);
          sad1 += abs(*refptr++ - *curptr++);
          sad1 += abs(*refptr++ - *curptr++);
          sad2 += abs(*refptr++ - *curptr++);
          sad2 += abs(*refptr++ - *curptr++);
          sad2 += abs(*refptr++ - *curptr++);
          sad2 += abs(*refptr++ - *curptr++);
          sad3 += abs(*refptr++ - *curptr++);
          sad3 += abs(*refptr++ - *curptr++);
          sad3 += abs(*refptr++ - *curptr++);
          sad3 += abs(*refptr++ - *curptr++);
        }
        sad_line[pos] = sad0;
        sad_line[1096 + pos] = sad1;
        sad_line[1096 * 2 + pos] = sad2;
        sad_line[1096 * 3 + pos] = sad3;
        sad_line += 1096 * 4;
      }
    }
  }
}


x86 assembly (clang, -O0):
<sad4_one_macroblock>:
push   %rbp
mov    %rsp,%rbp
sub    $0x2b0,%rsp
mov    0x10(%rbp),%eax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %ecx,-0x1c(%rbp)
mov    %r8d,-0x20(%rbp)
mov    %r9d,-0x24(%rbp)
mov    -0x24(%rbp),%eax
shl    $0x4,%eax
mov    %eax,-0x244(%rbp)
mov    -0x244(%rbp),%eax
sub    $0x11,%eax
mov    %eax,-0x248(%rbp)
mov    0x10(%rbp),%eax
shl    $0x4,%eax
mov    %eax,-0x24c(%rbp)
mov    -0x24c(%rbp),%eax
sub    $0x11,%eax
mov    %eax,-0x250(%rbp)
movl   $0x0,-0x260(%rbp)
cmpl   $0x10,-0x260(%rbp)
jge    120d <sad4_one_macroblock+0xed>
movl   $0x0,-0x25c(%rbp)
cmpl   $0x10,-0x25c(%rbp)
jge    11f4 <sad4_one_macroblock+0xd4>
mov    -0x10(%rbp),%rax
mov    -0x244(%rbp),%ecx
imul   -0x260(%rbp),%ecx
add    -0x25c(%rbp),%ecx
movslq %ecx,%rcx
mov    (%rax,%rcx,2),%cx
mov    -0x260(%rbp),%eax
shl    $0x4,%eax
add    -0x25c(%rbp),%eax
cltq
mov    %cx,-0x230(%rbp,%rax,2)
ff
mov    -0x25c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x25c(%rbp)
jmp    119c <sad4_one_macroblock+0x7c>
jmp    11f9 <sad4_one_macroblock+0xd9>
mov    -0x260(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x260(%rbp)
jmp    1185 <sad4_one_macroblock+0x65>
cmpl   $0x10,-0x20(%rbp)
jl     125e <sad4_one_macroblock+0x13e>
mov    -0x20(%rbp),%eax
mov    -0x244(%rbp),%ecx
sub    $0x10,%ecx
sub    $0x11,%ecx
cmp    %ecx,%eax
jg     125e <sad4_one_macroblock+0x13e>
cmpl   $0x10,-0x1c(%rbp)
jl     125e <sad4_one_macroblock+0x13e>
mov    -0x1c(%rbp),%eax
mov    -0x24c(%rbp),%ecx
sub    $0x10,%ecx
sub    $0x11,%ecx
cmp    %ecx,%eax
jg     125e <sad4_one_macroblock+0x13e>
movl   $0x0,-0x254(%rbp)
jmp    1268 <sad4_one_macroblock+0x148>
movl   $0x1,-0x254(%rbp)
movl   $0x0,-0x258(%rbp)
movl   $0xfffffff0,-0x238(%rbp)
ff ff ff
cmpl   $0x10,-0x238(%rbp)
jg     19e3 <sad4_one_macroblock+0x8c3>
movl   $0xfffffff0,-0x234(%rbp)
ff ff ff
cmpl   $0x10,-0x234(%rbp)
jg     19ca <sad4_one_macroblock+0x8aa>
lea    -0x230(%rbp),%rax
mov    %rax,-0x278(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x288(%rbp)
mov    -0x1c(%rbp),%eax
add    -0x238(%rbp),%eax
mov    %eax,-0x26c(%rbp)
mov    -0x20(%rbp),%eax
add    -0x234(%rbp),%eax
mov    %eax,-0x268(%rbp)
xor    %eax,%eax
cmpl   $0x0,-0x254(%rbp)
mov    %al,-0x299(%rbp)
je     1353 <sad4_one_macroblock+0x233>
xor    %eax,%eax
cmpl   $0x0,-0x26c(%rbp)
mov    %al,-0x29a(%rbp)
jl     1345 <sad4_one_macroblock+0x225>
mov    -0x26c(%rbp),%ecx
xor    %eax,%eax
cmp    -0x250(%rbp),%ecx
mov    %al,-0x29a(%rbp)
jg     1345 <sad4_one_macroblock+0x225>
xor    %eax,%eax
cmpl   $0x0,-0x268(%rbp)
mov    %al,-0x29a(%rbp)
jl     1345 <sad4_one_macroblock+0x225>
mov    -0x268(%rbp),%eax
cmp    -0x248(%rbp),%eax
setle  %al
mov    %al,-0x29a(%rbp)
mov    -0x29a(%rbp),%al
xor    $0xff,%al
mov    %al,-0x299(%rbp)
mov    -0x299(%rbp),%al
and    $0x1,%al
movzbl %al,%eax
mov    %eax,-0x270(%rbp)
movl   $0x0,-0x23c(%rbp)
cmpl   $0x4,-0x23c(%rbp)
jge    19a2 <sad4_one_macroblock+0x882>
movl   $0x0,-0x28c(%rbp)
movl   $0x0,-0x290(%rbp)
movl   $0x0,-0x294(%rbp)
movl   $0x0,-0x298(%rbp)
movl   $0x0,-0x264(%rbp)
cmpl   $0x4,-0x264(%rbp)
jge    18f6 <sad4_one_macroblock+0x7d6>
cmpl   $0x0,-0x270(%rbp)
je     13f5 <sad4_one_macroblock+0x2d5>
mov    -0x18(%rbp),%rdi
mov    -0x26c(%rbp),%esi
mov    -0x268(%rbp),%edx
mov    -0x24c(%rbp),%ecx
mov    -0x244(%rbp),%r8d
call   1040 <create_padded_row@plt>
mov    %rax,-0x2a8(%rbp)
jmp    1425 <sad4_one_macroblock+0x305>
mov    -0x18(%rbp),%rax
mov    -0x26c(%rbp),%ecx
imul   -0x244(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x1,%rcx
add    %rcx,%rax
movslq -0x268(%rbp),%rcx
shl    $0x1,%rcx
add    %rcx,%rax
mov    %rax,-0x2a8(%rbp)
mov    -0x2a8(%rbp),%rax
mov    %rax,-0x280(%rbp)
mov    -0x26c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x26c(%rbp)
mov    -0x280(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x280(%rbp)
movswl (%rax),%edi
mov    -0x278(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x278(%rbp)
movswl (%rax),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %rax,%rcx
movslq -0x28c(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x28c(%rbp)
mov    -0x280(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x280(%rbp)
movswl (%rax),%edi
mov    -0x278(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x278(%rbp)
movswl (%rax),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %rax,%rcx
movslq -0x28c(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x28c(%rbp)
mov    -0x280(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x280(%rbp)
movswl (%rax),%edi
mov    -0x278(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x278(%rbp)
movswl (%rax),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %rax,%rcx
movslq -0x28c(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x28c(%rbp)
mov    -0x280(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x280(%rbp)
movswl (%rax),%edi
mov    -0x278(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x278(%rbp)
movswl (%rax),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %rax,%rcx
movslq -0x28c(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x28c(%rbp)
mov    -0x280(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x280(%rbp)
movswl (%rax),%edi
mov    -0x278(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x278(%rbp)
movswl (%rax),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %rax,%rcx
movslq -0x290(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x290(%rbp)
mov    -0x280(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x280(%rbp)
movswl (%rax),%edi
mov    -0x278(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x278(%rbp)
movswl (%rax),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %rax,%rcx
movslq -0x290(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x290(%rbp)
mov    -0x280(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x280(%rbp)
movswl (%rax),%edi
mov    -0x278(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x278(%rbp)
movswl (%rax),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %rax,%rcx
movslq -0x290(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x290(%rbp)
mov    -0x280(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x280(%rbp)
movswl (%rax),%edi
mov    -0x278(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x278(%rbp)
movswl (%rax),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %rax,%rcx
movslq -0x290(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x290(%rbp)
mov    -0x280(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x280(%rbp)
movswl (%rax),%edi
mov    -0x278(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x278(%rbp)
movswl (%rax),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %rax,%rcx
movslq -0x294(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x294(%rbp)
mov    -0x280(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x280(%rbp)
movswl (%rax),%edi
mov    -0x278(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x278(%rbp)
movswl (%rax),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %rax,%rcx
movslq -0x294(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x294(%rbp)
mov    -0x280(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x280(%rbp)
movswl (%rax),%edi
mov    -0x278(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x278(%rbp)
movswl (%rax),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %rax,%rcx
movslq -0x294(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x294(%rbp)
mov    -0x280(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x280(%rbp)
movswl (%rax),%edi
mov    -0x278(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x278(%rbp)
movswl (%rax),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %rax,%rcx
movslq -0x294(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x294(%rbp)
mov    -0x280(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x280(%rbp)
movswl (%rax),%edi
mov    -0x278(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x278(%rbp)
movswl (%rax),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %rax,%rcx
movslq -0x298(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x298(%rbp)
mov    -0x280(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x280(%rbp)
movswl (%rax),%edi
mov    -0x278(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x278(%rbp)
movswl (%rax),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %rax,%rcx
movslq -0x298(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x298(%rbp)
mov    -0x280(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x280(%rbp)
movswl (%rax),%edi
mov    -0x278(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x278(%rbp)
movswl (%rax),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %rax,%rcx
movslq -0x298(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x298(%rbp)
mov    -0x280(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x280(%rbp)
movswl (%rax),%edi
mov    -0x278(%rbp),%rax
mov    %rax,%rcx
add    $0x2,%rcx
mov    %rcx,-0x278(%rbp)
movswl (%rax),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %rax,%rcx
movslq -0x298(%rbp),%rax
add    %rcx,%rax
mov    %eax,-0x298(%rbp)
mov    -0x264(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x264(%rbp)
jmp    13ad <sad4_one_macroblock+0x28d>
mov    -0x28c(%rbp),%eax
mov    %ax,%dx
mov    -0x288(%rbp),%rax
movslq -0x258(%rbp),%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x290(%rbp),%eax
mov    %ax,%dx
mov    -0x288(%rbp),%rax
mov    -0x258(%rbp),%ecx
add    $0x448,%ecx
movslq %ecx,%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x294(%rbp),%eax
mov    %ax,%dx
mov    -0x288(%rbp),%rax
mov    -0x258(%rbp),%ecx
add    $0x890,%ecx
movslq %ecx,%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x298(%rbp),%eax
mov    %ax,%dx
mov    -0x288(%rbp),%rax
mov    -0x258(%rbp),%ecx
add    $0xcd8,%ecx
movslq %ecx,%rcx
mov    %dx,(%rax,%rcx,2)
mov    -0x288(%rbp),%rax
add    $0x2240,%rax
mov    %rax,-0x288(%rbp)
mov    -0x23c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x23c(%rbp)
jmp    136e <sad4_one_macroblock+0x24e>
jmp    19a7 <sad4_one_macroblock+0x887>
mov    -0x234(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x234(%rbp)
mov    -0x258(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x258(%rbp)
jmp    1293 <sad4_one_macroblock+0x173>
jmp    19cf <sad4_one_macroblock+0x8af>
mov    -0x238(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x238(%rbp)
jmp    127c <sad4_one_macroblock+0x15c>
add    $0x2b0,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<sad4_one_macroblock>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
sub    $0x2c8,%rsp
mov    %rcx,0x8(%rsp)
mov    %rdx,0x58(%rsp)
mov    %rdi,0x90(%rsp)
mov    %r9d,%eax
mov    %r9d,%ecx
imul   $0x70,%r9d,%r10d
mov    %r9d,%edi
imul   $0xb0,%r9d,%r11d
imul   $0xd0,%r9d,%r14d
mov    %r9d,%edx
shl    $0x4,%edx
movups (%rsi),%xmm0
movups 0x10(%rsi),%xmm1
movaps %xmm1,0xd0(%rsp)
movaps %xmm0,0xc0(%rsp)
mov    %rdx,0x50(%rsp)
movslq %edx,%rbp
movups (%rsi,%rbp,2),%xmm0
movups 0x10(%rsi,%rbp,2),%xmm1
movaps %xmm1,0xf0(%rsp)
movaps %xmm0,0xe0(%rsp)
shl    $0x5,%eax
cltq
movups (%rsi,%rax,2),%xmm0
movups 0x10(%rsi,%rax,2),%xmm1
movaps %xmm1,0x110(%rsp)
movaps %xmm0,0x100(%rsp)
lea    0x0(%rbp,%rbp,2),%edx
movslq %edx,%rdx
movups (%rsi,%rdx,2),%xmm0
movups 0x10(%rsi,%rdx,2),%xmm1
movaps %xmm1,0x130(%rsp)
movaps %xmm0,0x120(%rsp)
shl    $0x6,%ecx
movslq %ecx,%rcx
movups (%rsi,%rcx,2),%xmm0
movups 0x10(%rsi,%rcx,2),%xmm1
movaps %xmm1,0x150(%rsp)
movaps %xmm0,0x140(%rsp)
lea    0x0(%rbp,%rbp,4),%edx
movslq %edx,%rdx
movups (%rsi,%rdx,2),%xmm0
movups 0x10(%rsi,%rdx,2),%xmm1
movaps %xmm0,0x160(%rsp)
movaps %xmm1,0x170(%rsp)
lea    (%rax,%rax,2),%edx
movslq %edx,%rdx
movups (%rsi,%rdx,2),%xmm0
movups 0x10(%rsi,%rdx,2),%xmm1
imul   $0xe0,%r9d,%r15d
imul   $0xf0,%r9d,%edx
movaps %xmm0,0x180(%rsp)
movaps %xmm1,0x190(%rsp)
movslq %r10d,%rbx
movups (%rsi,%rbx,2),%xmm0
movups 0x10(%rsi,%rbx,2),%xmm1
movaps %xmm0,0x1a0(%rsp)
movaps %xmm1,0x1b0(%rsp)
shl    $0x7,%edi
movslq %edi,%rdi
movups (%rsi,%rdi,2),%xmm0
movups 0x10(%rsi,%rdi,2),%xmm1
movaps %xmm0,0x1c0(%rsp)
movaps %xmm1,0x1d0(%rsp)
lea    0x0(%rbp,%rbp,8),%edi
movslq %edi,%rdi
movups (%rsi,%rdi,2),%xmm0
movups 0x10(%rsi,%rdi,2),%xmm1
movaps %xmm0,0x1e0(%rsp)
movaps %xmm1,0x1f0(%rsp)
lea    (%rax,%rax,4),%eax
cltq
movups (%rsi,%rax,2),%xmm0
movups 0x10(%rsi,%rax,2),%xmm1
movaps %xmm0,0x200(%rsp)
movaps %xmm1,0x210(%rsp)
movslq %r11d,%rax
movups (%rsi,%rax,2),%xmm0
movups 0x10(%rsi,%rax,2),%xmm1
mov    0x300(%rsp),%eax
shl    $0x4,%eax
mov    %rax,0x18(%rsp)
movaps %xmm0,0x220(%rsp)
movaps %xmm1,0x230(%rsp)
lea    (%rcx,%rcx,2),%eax
cltq
movups (%rsi,%rax,2),%xmm0
movups 0x10(%rsi,%rax,2),%xmm1
movaps %xmm1,0x250(%rsp)
movaps %xmm0,0x240(%rsp)
movslq %r14d,%rax
movups (%rsi,%rax,2),%xmm0
movups 0x10(%rsi,%rax,2),%xmm1
movaps %xmm0,0x260(%rsp)
movaps %xmm1,0x270(%rsp)
movslq %r15d,%rax
movups (%rsi,%rax,2),%xmm0
movups 0x10(%rsi,%rax,2),%xmm1
movaps %xmm0,0x280(%rsp)
movaps %xmm1,0x290(%rsp)
movslq %edx,%rax
movups (%rsi,%rax,2),%xmm0
movups 0x10(%rsi,%rax,2),%xmm1
movaps %xmm1,0x2b0(%rsp)
movaps %xmm0,0x2a0(%rsp)
mov    %rbp,0x40(%rsp)
lea    -0x11(%rbp),%eax
cmp    $0x10,%r8d
jl     1392 <sad4_one_macroblock+0x272>
cmpl   $0x10,0x8(%rsp)
jl     1392 <sad4_one_macroblock+0x272>
mov    0x50(%rsp),%rcx
add    $0xffffffdf,%ecx
cmp    %r8d,%ecx
jl     1392 <sad4_one_macroblock+0x272>
mov    0x18(%rsp),%rcx
add    $0xffffffdf,%ecx
mov    $0x1,%dl
mov    %edx,0x4(%rsp)
cmp    0x8(%rsp),%ecx
jge    139a <sad4_one_macroblock+0x27a>
movl   $0x0,0x4(%rsp)
mov    0x18(%rsp),%rcx
add    $0xffffffef,%ecx
mov    %ecx,0x30(%rsp)
movslq %r8d,%rcx
cltq
mov    %rax,0x80(%rsp)
mov    0x58(%rsp),%rax
mov    %rcx,0x88(%rsp)
lea    -0x20(%rax,%rcx,2),%rax
mov    %rax,0x70(%rsp)
mov    0x40(%rsp),%rax
add    %rax,%rax
mov    %rax,0xa8(%rsp)
movl   $0x0,(%rsp)
mov    $0xfffffff0,%eax
jmp    1401 <sad4_one_macroblock+0x2e1>
nopl   0x0(%rax,%rax,1)
mov    0x78(%rsp),%rax
add    $0x1,%eax
cmp    $0x11,%eax
je     1762 <sad4_one_macroblock+0x642>
mov    %rax,%rcx
mov    0x8(%rsp),%rax
mov    %rcx,0x78(%rsp)
lea    (%rcx,%rax,1),%edx
movslq (%rsp),%rax
mov    %rax,0x10(%rsp)
add    $0x21,%eax
mov    %eax,(%rsp)
mov    $0xfffffffffffffff0,%rsi
mov    0x70(%rsp),%rax
mov    %rax,0x48(%rsp)
mov    %edx,0x34(%rsp)
jmp    1469 <sad4_one_macroblock+0x349>
nopw   0x0(%rax,%rax,1)
mov    0x98(%rsp),%rsi
add    $0x1,%rsi
mov    0x10(%rsp),%rax
add    $0x1,%rax
addq   $0x2,0x48(%rsp)
mov    %rax,0x10(%rsp)
cmp    %eax,(%rsp)
mov    0x34(%rsp),%edx
je     13f0 <sad4_one_macroblock+0x2d0>
mov    0x88(%rsp),%rax
add    %rsi,%rax
mov    %rax,0x60(%rsp)
xor    %ebp,%ebp
mov    $0x0,%edi
cmpb   $0x0,0x4(%rsp)
jne    14b6 <sad4_one_macroblock+0x396>
test   %edx,%edx
js     14b0 <sad4_one_macroblock+0x390>
cmp    0x30(%rsp),%edx
setle  %al
mov    0x60(%rsp),%rdi
test   %rdi,%rdi
setns  %cl
and    %al,%cl
cmp    0x80(%rsp),%rdi
setle  %dil
and    %cl,%dil
jmp    14b2 <sad4_one_macroblock+0x392>
xor    %edi,%edi
xor    $0x1,%dil
mov    %rsi,0x98(%rsp)
mov    0x90(%rsp),%rcx
lea    0xc0(%rsp),%r12
mov    %edi,0x3c(%rsp)
jmp    1533 <sad4_one_macroblock+0x413>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
mov    0x68(%rsp),%rdx
add    %r13d,%edx
mov    0x10(%rsp),%rsi
mov    0xa0(%rsp),%rcx
mov    %r14w,(%rcx,%rsi,2)
mov    0x20(%rsp),%rbp
mov    %bp,0x890(%rcx,%rsi,2)
mov    0x28(%rsp),%rbp
mov    %bp,0x1120(%rcx,%rsi,2)
mov    %ax,0x19b0(%rcx,%rsi,2)
add    $0x2240,%rcx
mov    0x38(%rsp),%ebp
add    $0x1,%ebp
cmp    $0x4,%ebp
je     1440 <sad4_one_macroblock+0x320>
mov    %rcx,0xa0(%rsp)
mov    %ebp,0x38(%rsp)
mov    %rdx,0x68(%rsp)
movslq %edx,%rax
imul   0x40(%rsp),%rax
mov    0x48(%rsp),%rcx
lea    (%rcx,%rax,2),%r15
xor    %eax,%eax
xor    %edx,%edx
mov    %rdx,0x28(%rsp)
xor    %edx,%edx
mov    %rdx,0x20(%rsp)
xor    %r14d,%r14d
xor    %r13d,%r13d
jmp    171f <sad4_one_macroblock+0x5ff>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movswl (%r15),%edi
movswl (%r12),%eax
sub    %eax,%edi
call   1030 <abs@plt>
add    %eax,%r14d
movswl 0x2(%r15),%edi
movswl 0x2(%r12),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %rax,%rbp
add    %r14d,%ebp
movswl 0x4(%r15),%edi
movswl 0x4(%r12),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %rax,%r14
add    %ebp,%r14d
movswl 0x6(%r15),%edi
movswl 0x6(%r12),%eax
sub    %eax,%edi
call   1030 <abs@plt>
add    %r14d,%eax
mov    %rax,%r14
movswl 0x8(%r15),%edi
movswl 0x8(%r12),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    0x20(%rsp),%rbx
add    %eax,%ebx
movswl 0xa(%r15),%edi
movswl 0xa(%r12),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %rax,%rbp
add    %ebx,%ebp
movswl 0xc(%r15),%edi
movswl 0xc(%r12),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %rax,%rbx
add    %ebp,%ebx
movswl 0xe(%r15),%edi
movswl 0xe(%r12),%eax
sub    %eax,%edi
call   1030 <abs@plt>
add    %ebx,%eax
mov    %rax,0x20(%rsp)
movswl 0x10(%r15),%edi
movswl 0x10(%r12),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    0x28(%rsp),%rbp
add    %eax,%ebp
movswl 0x12(%r15),%edi
movswl 0x12(%r12),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %rax,%rbx
add    %ebp,%ebx
movswl 0x14(%r15),%edi
movswl 0x14(%r12),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %rax,%rbp
add    %ebx,%ebp
movswl 0x16(%r15),%edi
movswl 0x16(%r12),%eax
sub    %eax,%edi
call   1030 <abs@plt>
add    %ebp,%eax
mov    %rax,0x28(%rsp)
movswl 0x18(%r15),%edi
movswl 0x18(%r12),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    0xb8(%rsp),%rbp
add    %eax,%ebp
movswl 0x1a(%r15),%edi
movswl 0x1a(%r12),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %rax,%rbx
add    %ebp,%ebx
movswl 0x1c(%r15),%edi
movswl 0x1c(%r12),%eax
sub    %eax,%edi
call   1030 <abs@plt>
mov    %rax,%rbp
add    %ebx,%ebp
movswl 0x1e(%r15),%edi
movswl 0x1e(%r12),%eax
add    $0x20,%r12
sub    %eax,%edi
call   1030 <abs@plt>
add    %ebp,%eax
add    $0x1,%r13d
mov    0xb0(%rsp),%r15
add    0xa8(%rsp),%r15
cmp    $0x4,%r13d
mov    0x3c(%rsp),%edi
je     14e0 <sad4_one_macroblock+0x3c0>
mov    %rax,0xb8(%rsp)
mov    %r15,0xb0(%rsp)
test   %dil,%dil
je     1580 <sad4_one_macroblock+0x460>
mov    0x68(%rsp),%rax
lea    (%rax,%r13,1),%esi
mov    0x58(%rsp),%rdi
mov    0x60(%rsp),%rdx
mov    0x18(%rsp),%rcx
mov    0x50(%rsp),%r8
call   1040 <create_padded_row@plt>
mov    %rax,%r15
jmp    1580 <sad4_one_macroblock+0x460>
add    $0x2c8,%rsp
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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