void ExtendImage(unsigned char *src, double *dst, int rows, int cols,
                 int align_rows, int align_cols) {
  int pad_top, pad_bottom, pad_left, pad_right;
  unsigned char *ps;
  double *pd, *p1, *p2;
  int i, j;
  pad_top = (align_rows - rows) >> 1;
  pad_bottom = align_rows - rows - pad_top;
  pad_left = (align_cols - cols) >> 1;
  pad_right = align_cols - cols - pad_left;
  ps = src;
  pd = dst + pad_top * align_cols + pad_left;
  for (i = 0; i < rows; i++) {
    for (j = 0; j < cols; j++)
      *pd++ = *ps++;
    pd += pad_right + pad_left;
  }
  p1 = dst + pad_top * align_cols + pad_left - 1;
  p2 = dst + pad_top * align_cols + pad_left;
  for (i = 0; i < rows; i++) {
    for (j = 0; j < pad_left; j++) {
      *p1-- = *p2;
      if (j < cols - 1)
        p2++;
      else
        p2--;
    }
    p1 += align_cols + pad_left;
    p2 = p1 + 1;
  }
  p1 = dst + pad_top * align_cols + pad_left + cols;
  p2 = dst + pad_top * align_cols + pad_left + cols - 1;
  for (i = 0; i < rows; i++) {
    for (j = 0; j < pad_right; j++) {
      *p1++ = *p2;
      if (j < cols - 1)
        p2--;
      else
        p2++;
    }
    p1 += pad_left + cols;
    p2 = p1 - 1;
  }
  p1 = dst + (pad_top - 1) * align_cols;
  p2 = dst + pad_top * align_cols;
  for (i = 0; i < align_cols; i++) {
    for (j = 0; j < pad_top; j++) {
      *p1 = *p2;
      p1 -= align_cols;
      if (j < rows - 1)
        p2 += align_cols;
      else
        p2 -= align_cols;
    }
    p1 += pad_top * align_cols + 1;
    p2 = p1 + align_cols;
  }
  p1 = dst + (pad_top + rows) * align_cols;
  p2 = p1 - align_cols;
  for (i = 0; i < align_cols; i++) {
    for (j = 0; j < pad_bottom; j++) {
      *p1 = *p2;
      p1 += align_cols;
      if (j < rows - 1)
        p2 -= align_cols;
      else
        p2 += align_cols;
    }
    p1 -= pad_bottom * align_cols - 1;
    p2 = p1 - align_cols;
  }
}


x86 assembly (clang, -O0):
<ExtendImage>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
mov    %r8d,-0x1c(%rbp)
mov    %r9d,-0x20(%rbp)
mov    -0x1c(%rbp),%eax
sub    -0x14(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x1c(%rbp),%eax
sub    -0x14(%rbp),%eax
sub    -0x24(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x20(%rbp),%eax
sub    -0x18(%rbp),%eax
sar    $0x1,%eax
mov    %eax,-0x2c(%rbp)
mov    -0x20(%rbp),%eax
sub    -0x18(%rbp),%eax
sub    -0x2c(%rbp),%eax
mov    %eax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
imul   -0x20(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
movslq -0x2c(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x40(%rbp)
movl   $0x0,-0x54(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    11f9 <ExtendImage+0xf9>
movl   $0x0,-0x58(%rbp)
mov    -0x58(%rbp),%eax
cmp    -0x18(%rbp),%eax
jge    11d3 <ExtendImage+0xd3>
mov    -0x38(%rbp),%rax
mov    %rax,%rcx
add    $0x1,%rcx
mov    %rcx,-0x38(%rbp)
movzbl (%rax),%eax
cvtsi2sd %eax,%xmm0
mov    -0x40(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x40(%rbp)
movsd  %xmm0,(%rax)
mov    -0x58(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x58(%rbp)
jmp    1190 <ExtendImage+0x90>
mov    -0x30(%rbp),%ecx
add    -0x2c(%rbp),%ecx
mov    -0x40(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x40(%rbp)
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    117d <ExtendImage+0x7d>
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
imul   -0x20(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
movslq -0x2c(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x48(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
imul   -0x20(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
movslq -0x2c(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x50(%rbp)
movl   $0x0,-0x54(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    12f9 <ExtendImage+0x1f9>
movl   $0x0,-0x58(%rbp)
mov    -0x58(%rbp),%eax
cmp    -0x2c(%rbp),%eax
jge    12c7 <ExtendImage+0x1c7>
mov    -0x50(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0xfffffffffffffff8,%rcx
mov    %rcx,-0x48(%rbp)
movsd  %xmm0,(%rax)
mov    -0x58(%rbp),%eax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    12a8 <ExtendImage+0x1a8>
mov    -0x50(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x50(%rbp)
jmp    12b4 <ExtendImage+0x1b4>
mov    -0x50(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x50(%rbp)
jmp    12b9 <ExtendImage+0x1b9>
mov    -0x58(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x58(%rbp)
jmp    125f <ExtendImage+0x15f>
mov    -0x20(%rbp),%ecx
add    -0x2c(%rbp),%ecx
mov    -0x48(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x50(%rbp)
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    124c <ExtendImage+0x14c>
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
imul   -0x20(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
movslq -0x2c(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
movslq -0x18(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
imul   -0x20(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
movslq -0x2c(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
movslq -0x18(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x50(%rbp)
movl   $0x0,-0x54(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0x14(%rbp),%eax
jge    140f <ExtendImage+0x30f>
movl   $0x0,-0x58(%rbp)
mov    -0x58(%rbp),%eax
cmp    -0x30(%rbp),%eax
jge    13dd <ExtendImage+0x2dd>
mov    -0x50(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x8,%rcx
mov    %rcx,-0x48(%rbp)
movsd  %xmm0,(%rax)
mov    -0x58(%rbp),%eax
mov    -0x18(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    13be <ExtendImage+0x2be>
mov    -0x50(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x50(%rbp)
jmp    13ca <ExtendImage+0x2ca>
mov    -0x50(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x50(%rbp)
jmp    13cf <ExtendImage+0x2cf>
mov    -0x58(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x58(%rbp)
jmp    1375 <ExtendImage+0x275>
mov    -0x2c(%rbp),%ecx
add    -0x18(%rbp),%ecx
mov    -0x48(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x50(%rbp)
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    1362 <ExtendImage+0x262>
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
imul   -0x20(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
imul   -0x20(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x50(%rbp)
movl   $0x0,-0x54(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    1529 <ExtendImage+0x429>
movl   $0x0,-0x58(%rbp)
mov    -0x58(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    14ec <ExtendImage+0x3ec>
mov    -0x50(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x48(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x20(%rbp),%ecx
mov    -0x48(%rbp),%rax
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
mov    -0x58(%rbp),%eax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    14bf <ExtendImage+0x3bf>
mov    -0x20(%rbp),%ecx
mov    -0x50(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x50(%rbp)
jmp    14d9 <ExtendImage+0x3d9>
mov    -0x20(%rbp),%ecx
mov    -0x50(%rbp),%rax
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x50(%rbp)
jmp    14de <ExtendImage+0x3de>
mov    -0x58(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x58(%rbp)
jmp    145e <ExtendImage+0x35e>
mov    -0x24(%rbp),%ecx
imul   -0x20(%rbp),%ecx
add    $0x1,%ecx
mov    -0x48(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
movslq -0x20(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x50(%rbp)
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    144b <ExtendImage+0x34b>
mov    -0x10(%rbp),%rax
mov    -0x24(%rbp),%ecx
add    -0x14(%rbp),%ecx
imul   -0x20(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
movslq -0x20(%rbp),%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x50(%rbp)
movl   $0x0,-0x54(%rbp)
mov    -0x54(%rbp),%eax
cmp    -0x20(%rbp),%eax
jge    1647 <ExtendImage+0x547>
movl   $0x0,-0x58(%rbp)
mov    -0x58(%rbp),%eax
cmp    -0x28(%rbp),%eax
jge    1600 <ExtendImage+0x500>
mov    -0x50(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x48(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x20(%rbp),%ecx
mov    -0x48(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
mov    -0x58(%rbp),%eax
mov    -0x14(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
jge    15d8 <ExtendImage+0x4d8>
mov    -0x20(%rbp),%ecx
mov    -0x50(%rbp),%rax
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x50(%rbp)
jmp    15ed <ExtendImage+0x4ed>
mov    -0x20(%rbp),%ecx
mov    -0x50(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x50(%rbp)
jmp    15f2 <ExtendImage+0x4f2>
mov    -0x58(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x58(%rbp)
jmp    1577 <ExtendImage+0x477>
mov    -0x28(%rbp),%ecx
imul   -0x20(%rbp),%ecx
sub    $0x1,%ecx
mov    -0x48(%rbp),%rax
movslq %ecx,%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
movslq -0x20(%rbp),%rdx
xor    %ecx,%ecx
sub    %rdx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x50(%rbp)
mov    -0x54(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x54(%rbp)
jmp    1564 <ExtendImage+0x464>
pop    %rbp
ret

x86 assembly (clang, -O2):
<ExtendImage>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %r8d,-0x1c(%rsp)
sub    %edx,%r8d
mov    %r8d,-0x3c(%rsp)
mov    %r8d,%r13d
sar    %r13d
mov    %r13d,%ebp
mov    %r9,%rax
mov    %r9,-0x60(%rsp)
imul   %r9d,%ebp
mov    %ebp,-0x38(%rsp)
movslq %ebp,%rax
mov    %rsi,-0x10(%rsp)
lea    (%rsi,%rax,8),%r8
mov    %rdx,-0x50(%rsp)
test   %edx,%edx
mov    %r13,-0x8(%rsp)
jle    164c <ExtendImage+0x54c>
mov    -0x60(%rsp),%rax
mov    %eax,%esi
sub    %ecx,%esi
mov    %esi,%eax
sar    %eax
mov    %esi,%edx
sub    %eax,%edx
mov    %edx,-0x20(%rsp)
mov    %rax,-0x48(%rsp)
cltq
lea    (%r8,%rax,8),%r12
mov    %esi,-0x54(%rsp)
movslq %esi,%r13
lea    -0x1(%rcx),%r10d
lea    0x1(%r10),%r11
mov    %r11,%r9
and    $0xfffffffffffffffc,%r9
lea    -0x4(%r9),%r14
mov    %r14,-0x28(%rsp)
shr    $0x2,%r14
add    $0x1,%r14
mov    %r14,%rax
and    $0xfffffffffffffffe,%rax
mov    %rax,-0x30(%rsp)
xor    %r15d,%r15d
pxor   %xmm0,%xmm0
mov    %r12,-0x18(%rsp)
jmp    11c3 <ExtendImage+0xc3>
nop
lea    (%r12,%r13,8),%r12
add    $0x1,%r15d
cmp    -0x50(%rsp),%r15d
je     1389 <ExtendImage+0x289>
test   %ecx,%ecx
jle    11b0 <ExtendImage+0xb0>
xor    %esi,%esi
cmp    $0x3,%r10d
jb     12d0 <ExtendImage+0x1d0>
lea    (%rdi,%r11,1),%rdx
cmp    %r12,%rdx
jbe    11e9 <ExtendImage+0xe9>
lea    (%r12,%r11,8),%rdx
cmp    %rdx,%rdi
jb     12d0 <ExtendImage+0x1d0>
cmpq   $0x0,-0x28(%rsp)
je     1378 <ExtendImage+0x278>
mov    -0x30(%rsp),%rsi
xor    %ebx,%ebx
nopl   0x0(%rax)
movzwl (%rdi,%rbx,1),%edx
movd   %edx,%xmm1
movzwl 0x2(%rdi,%rbx,1),%edx
movd   %edx,%xmm2
punpcklbw %xmm0,%xmm1
punpcklwd %xmm0,%xmm1
cvtdq2pd %xmm1,%xmm1
punpcklbw %xmm0,%xmm2
punpcklwd %xmm0,%xmm2
cvtdq2pd %xmm2,%xmm2
movups %xmm1,(%r12,%rbx,8)
movups %xmm2,0x10(%r12,%rbx,8)
movzwl 0x4(%rdi,%rbx,1),%edx
movd   %edx,%xmm1
movzwl 0x6(%rdi,%rbx,1),%edx
movd   %edx,%xmm2
punpcklbw %xmm0,%xmm1
punpcklwd %xmm0,%xmm1
cvtdq2pd %xmm1,%xmm1
punpcklbw %xmm0,%xmm2
punpcklwd %xmm0,%xmm2
cvtdq2pd %xmm2,%xmm2
movupd %xmm1,0x20(%r12,%rbx,8)
movups %xmm2,0x30(%r12,%rbx,8)
add    $0x8,%rbx
add    $0xfffffffffffffffe,%rsi
jne    1200 <ExtendImage+0x100>
test   $0x1,%r14b
je     12b0 <ExtendImage+0x1b0>
movzwl (%rdi,%rbx,1),%edx
movd   %edx,%xmm1
movzwl 0x2(%rdi,%rbx,1),%edx
movd   %edx,%xmm2
punpcklbw %xmm0,%xmm1
punpcklwd %xmm0,%xmm1
cvtdq2pd %xmm1,%xmm1
punpcklbw %xmm0,%xmm2
punpcklwd %xmm0,%xmm2
cvtdq2pd %xmm2,%xmm2
movupd %xmm1,(%r12,%rbx,8)
movups %xmm2,0x10(%r12,%rbx,8)
add    %r9,%rdi
lea    (%r12,%r9,8),%r12
mov    %r9d,%esi
cmp    %r9,%r11
je     11b0 <ExtendImage+0xb0>
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
mov    %ecx,%ebp
sub    %esi,%ebp
mov    %esi,%ebx
not    %ebx
add    %ecx,%ebx
and    $0x3,%ebp
je     1312 <ExtendImage+0x212>
neg    %ebp
xor    %edx,%edx
cs nopw 0x0(%rax,%rax,1)
nopl   (%rax)
movzbl (%rdi),%eax
add    $0x1,%rdi
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
movsd  %xmm1,(%r12)
add    $0x8,%r12
add    $0xffffffffffffffff,%rdx
cmp    %edx,%ebp
jne    12f0 <ExtendImage+0x1f0>
sub    %edx,%esi
cmp    $0x3,%ebx
jb     11b0 <ExtendImage+0xb0>
mov    %ecx,%ebp
sub    %esi,%ebp
nop
movzbl (%rdi),%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
movsd  %xmm1,(%r12)
movzbl 0x1(%rdi),%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
movsd  %xmm1,0x8(%r12)
movzbl 0x2(%rdi),%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
movsd  %xmm1,0x10(%r12)
movzbl 0x3(%rdi),%eax
xorps  %xmm1,%xmm1
cvtsi2sd %eax,%xmm1
add    $0x4,%rdi
movsd  %xmm1,0x18(%r12)
add    $0x20,%r12
add    $0xfffffffc,%ebp
jne    1320 <ExtendImage+0x220>
jmp    11b0 <ExtendImage+0xb0>
xor    %ebx,%ebx
test   $0x1,%r14b
jne    127b <ExtendImage+0x17b>
jmp    12b0 <ExtendImage+0x1b0>
cmpl   $0x0,-0x50(%rsp)
mov    -0x8(%rsp),%r13
mov    -0x48(%rsp),%rdx
jle    164c <ExtendImage+0x54c>
mov    -0x18(%rsp),%rdi
lea    -0x8(%rdi),%rbp
mov    -0x60(%rsp),%rax
add    %edx,%eax
movslq %eax,%r15
cmp    $0x2,%edx
mov    $0x1,%r9d
cmovge %edx,%r9d
lea    -0x1(%r9),%r12d
mov    %r9d,%r14d
and    $0x3,%r14d
and    $0x7ffffffc,%r9d
xor    %r11d,%r11d
jmp    13fe <ExtendImage+0x2fe>
cs nopw 0x0(%rax,%rax,1)
nop
mov    %rbp,%rsi
lea    (%rsi,%r15,8),%rbp
lea    (%rsi,%r15,8),%rdi
add    $0x8,%rdi
add    $0x1,%r11d
cmp    -0x50(%rsp),%r11d
je     150c <ExtendImage+0x40c>
cmpl   $0x2,-0x54(%rsp)
jl     13e0 <ExtendImage+0x2e0>
xor    %ebx,%ebx
cmp    $0x3,%r12d
jae    1420 <ExtendImage+0x320>
test   %r14d,%r14d
jne    14ce <ExtendImage+0x3ce>
jmp    13e3 <ExtendImage+0x2e3>
nopl   0x0(%rax,%rax,1)
xor    %ebx,%ebx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
movsd  (%rdi),%xmm0
movsd  %xmm0,0x0(%rbp)
xor    %eax,%eax
cmp    %r10d,%ebx
setl   %al
shl    $0x4,%rax
lea    (%rax,%rdi,1),%rdx
movsd  -0x8(%rax,%rdi,1),%xmm0
movsd  %xmm0,-0x8(%rbp)
lea    0x1(%rbx),%eax
xor    %esi,%esi
cmp    %r10d,%eax
setl   %sil
shl    $0x4,%rsi
lea    (%rsi,%rdx,1),%rax
add    $0xfffffffffffffff8,%rax
movsd  -0x10(%rsi,%rdx,1),%xmm0
movsd  %xmm0,-0x10(%rbp)
lea    0x2(%rbx),%edx
xor    %esi,%esi
cmp    %r10d,%edx
setl   %sil
shl    $0x4,%rsi
lea    (%rsi,%rax,1),%rdx
add    $0xfffffffffffffff8,%rdx
movq   -0x10(%rsi,%rax,1),%xmm0
movq   %xmm0,-0x18(%rbp)
add    $0xffffffffffffffe0,%rbp
lea    0x3(%rbx),%eax
xor    %esi,%esi
cmp    %r10d,%eax
setl   %sil
shl    $0x4,%rsi
lea    (%rsi,%rdx,1),%rdi
add    $0xfffffffffffffff0,%rdi
add    $0x4,%ebx
cmp    %r9d,%ebx
jne    1430 <ExtendImage+0x330>
mov    %rbp,%rsi
test   %r14d,%r14d
je     13e3 <ExtendImage+0x2e3>
mov    %r14d,%eax
mov    %rbp,%rsi
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movq   (%rdi),%xmm0
movq   %xmm0,(%rsi)
add    $0xfffffffffffffff8,%rsi
xor    %edx,%edx
cmp    %r10d,%ebx
setl   %dl
shl    $0x4,%rdx
add    %rdx,%rdi
add    $0xfffffffffffffff8,%rdi
add    $0x1,%ebx
add    $0xffffffff,%eax
jne    14e0 <ExtendImage+0x3e0>
jmp    13e3 <ExtendImage+0x2e3>
cmpl   $0x0,-0x50(%rsp)
mov    -0x48(%rsp),%r14
mov    -0x20(%rsp),%r15d
jle    164c <ExtendImage+0x54c>
movslq %ecx,%rax
mov    -0x18(%rsp),%rdx
lea    (%rdx,%rax,8),%rsi
lea    (%r14,%rcx,1),%eax
movslq %eax,%r11
not    %r14d
add    -0x60(%rsp),%r14d
sub    %ecx,%r14d
mov    %r15d,%eax
and    $0x3,%eax
mov    %r15d,%ebx
and    $0xfffffffc,%ebx
xor    %r9d,%r9d
jmp    1563 <ExtendImage+0x463>
lea    (%rsi,%r11,8),%rsi
add    $0x1,%r9d
cmp    -0x50(%rsp),%r9d
je     164c <ExtendImage+0x54c>
test   %r15d,%r15d
jle    1550 <ExtendImage+0x450>
lea    -0x8(%rsi),%rdi
xor    %ecx,%ecx
cmp    $0x3,%r14d
jb     160f <ExtendImage+0x50f>
xor    %ecx,%ecx
nopw   0x0(%rax,%rax,1)
movsd  (%rdi),%xmm0
movsd  %xmm0,(%rsi)
xor    %edx,%edx
cmp    %r10d,%ecx
setge  %dl
shl    $0x4,%rdx
lea    (%rdx,%rdi,1),%rbp
movsd  -0x8(%rdx,%rdi,1),%xmm0
movsd  %xmm0,0x8(%rsi)
lea    0x1(%rcx),%edx
xor    %edi,%edi
cmp    %r10d,%edx
setge  %dil
shl    $0x4,%rdi
lea    (%rdi,%rbp,1),%rdx
add    $0xfffffffffffffff8,%rdx
movsd  -0x10(%rdi,%rbp,1),%xmm0
movsd  %xmm0,0x10(%rsi)
lea    0x2(%rcx),%edi
xor    %ebp,%ebp
cmp    %r10d,%edi
setge  %bpl
shl    $0x4,%rbp
lea    (%rdx,%rbp,1),%rdi
add    $0xfffffffffffffff8,%rdi
movq   -0x10(%rbp,%rdx,1),%xmm0
movq   %xmm0,0x18(%rsi)
add    $0x20,%rsi
lea    0x3(%rcx),%edx
xor    %ebp,%ebp
cmp    %r10d,%edx
setge  %bpl
shl    $0x4,%rbp
add    %rbp,%rdi
add    $0xfffffffffffffff0,%rdi
add    $0x4,%ecx
cmp    %ebx,%ecx
jne    1580 <ExtendImage+0x480>
test   %eax,%eax
je     1550 <ExtendImage+0x450>
mov    %eax,%ebp
nopl   0x0(%rax)
movq   (%rdi),%xmm0
movq   %xmm0,(%rsi)
add    $0x8,%rsi
xor    %edx,%edx
cmp    %r10d,%ecx
setge  %dl
shl    $0x4,%rdx
add    %rdx,%rdi
add    $0xfffffffffffffff8,%rdi
add    $0x1,%ecx
add    $0xffffffff,%ebp
jne    1620 <ExtendImage+0x520>
jmp    1550 <ExtendImage+0x450>
cmpl   $0x0,-0x60(%rsp)
jle    19a6 <ExtendImage+0x8a6>
mov    -0x3c(%rsp),%ebx
mov    %ebx,%eax
sub    %r13d,%eax
mov    %eax,-0x48(%rsp)
lea    -0x1(%r13),%eax
mov    -0x60(%rsp),%rcx
imul   %ecx,%eax
cltq
mov    %r13,%rdx
mov    -0x10(%rsp),%rsi
lea    (%rsi,%rax,8),%r13
mov    %ecx,%edi
mov    %rdi,%r11
neg    %r11
mov    -0x50(%rsp),%rax
lea    -0x1(%rax),%r10d
mov    -0x38(%rsp),%eax
add    $0x1,%eax
movslq %eax,%rbp
cmp    $0x2,%edx
mov    $0x1,%esi
cmovge %edx,%esi
lea    -0x1(%rsi),%eax
mov    %eax,-0x28(%rsp)
mov    %esi,%eax
and    $0x3,%eax
mov    %eax,-0x54(%rsp)
and    $0x7ffffffc,%esi
mov    %rdi,%rax
shl    $0x5,%rax
mov    %rax,-0x38(%rsp)
neg    %rax
mov    %rax,-0x30(%rsp)
lea    0x0(,%rdi,8),%r14
mov    %r14,%rcx
neg    %rcx
xor    %edx,%edx
jmp    16ff <ExtendImage+0x5ff>
mov    %r13,%r15
lea    (%r15,%rbp,8),%r13
lea    0x0(,%rdi,8),%r8
add    %r13,%r8
add    $0x1,%edx
cmp    -0x60(%rsp),%edx
je     181a <ExtendImage+0x71a>
cmp    $0x2,%ebx
jl     16e0 <ExtendImage+0x5e0>
xor    %r9d,%r9d
cmpl   $0x3,-0x28(%rsp)
jae    1720 <ExtendImage+0x620>
cmpl   $0x0,-0x54(%rsp)
jne    17df <ExtendImage+0x6df>
jmp    16e3 <ExtendImage+0x5e3>
nopl   0x0(%rax,%rax,1)
mov    %rbp,%r12
xor    %r9d,%r9d
cs nopw 0x0(%rax,%rax,1)
mov    %r13,%r15
movsd  (%r8),%xmm0
movsd  %xmm0,0x0(%r13)
cmp    %r10d,%r9d
mov    %r11,%rbx
cmovl  %rdi,%rbx
lea    (%r8,%rbx,8),%rbp
movsd  (%r8,%rbx,8),%xmm0
add    %rcx,%r13
movsd  %xmm0,(%r15,%rcx,1)
lea    0x1(%r9),%ebx
cmp    %r10d,%ebx
mov    %r11,%rbx
cmovl  %rdi,%rbx
lea    0x0(,%rbx,8),%rax
add    %rbp,%rax
movsd  0x0(%rbp,%rbx,8),%xmm0
movsd  %xmm0,(%rcx,%r13,1)
add    %rcx,%r13
lea    0x2(%r9),%ebp
cmp    %r10d,%ebp
mov    %r11,%rbp
cmovl  %rdi,%rbp
lea    (%rax,%rbp,8),%rbx
movq   (%rax,%rbp,8),%xmm0
movq   %xmm0,(%rcx,%r13,1)
add    %rcx,%r13
lea    0x3(%r9),%eax
cmp    %r10d,%eax
mov    %r11,%rax
cmovl  %rdi,%rax
lea    (%rbx,%rax,8),%r8
add    $0x4,%r9d
add    %rcx,%r13
cmp    %esi,%r9d
jne    1730 <ExtendImage+0x630>
add    -0x30(%rsp),%r15
mov    %r15,%r13
mov    -0x3c(%rsp),%ebx
mov    %r12,%rbp
cmpl   $0x0,-0x54(%rsp)
je     16e3 <ExtendImage+0x5e3>
mov    -0x54(%rsp),%r12d
mov    %r13,%r15
nopw   0x0(%rax,%rax,1)
movq   (%r8),%xmm0
movq   %xmm0,(%r15)
cmp    %r10d,%r9d
mov    %r11,%rax
cmovl  %rdi,%rax
lea    (%r8,%rax,8),%r8
add    $0x1,%r9d
add    %rcx,%r15
add    $0xffffffff,%r12d
jne    17f0 <ExtendImage+0x6f0>
jmp    16e3 <ExtendImage+0x5e3>
cmpl   $0x0,-0x60(%rsp)
mov    -0x8(%rsp),%r13
mov    -0x48(%rsp),%ebx
jle    19a6 <ExtendImage+0x8a6>
mov    -0x50(%rsp),%rsi
lea    (%rsi,%r13,1),%eax
mov    -0x60(%rsp),%rdx
imul   %edx,%eax
cltq
mov    -0x10(%rsp),%rcx
lea    (%rcx,%rax,8),%rcx
mov    %ebx,%eax
imul   %edx,%eax
add    $0xffffffff,%eax
movslq %eax,%r8
neg    %r8
not    %r13d
add    -0x1c(%rsp),%r13d
sub    %esi,%r13d
mov    %ebx,%r9d
and    $0x3,%r9d
mov    %ebx,%r12d
and    $0xfffffffc,%r12d
xor    %r15d,%r15d
jmp    1896 <ExtendImage+0x796>
cs nopw 0x0(%rax,%rax,1)
mov    %rcx,%rsi
lea    (%rsi,%r8,8),%rcx
add    $0x1,%r15d
cmp    -0x60(%rsp),%r15d
je     19a6 <ExtendImage+0x8a6>
test   %ebx,%ebx
jle    1880 <ExtendImage+0x780>
xor    %eax,%eax
lea    (%rcx,%r11,8),%rdx
cmp    $0x3,%r13d
jae    18c0 <ExtendImage+0x7c0>
test   %r9d,%r9d
jne    1977 <ExtendImage+0x877>
jmp    1883 <ExtendImage+0x783>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
mov    %rcx,%rsi
movsd  (%rdx),%xmm0
movsd  %xmm0,(%rcx)
cmp    %r10d,%eax
mov    %rdi,%rcx
cmovl  %r11,%rcx
lea    (%rdx,%rcx,8),%rbp
movsd  (%rdx,%rcx,8),%xmm0
lea    (%rsi,%r14,1),%rcx
movsd  %xmm0,(%rsi,%rdi,8)
lea    0x1(%rax),%edx
cmp    %r10d,%edx
mov    %rdi,%rdx
cmovl  %r11,%rdx
lea    0x0(,%rdx,8),%rbx
add    %rbp,%rbx
movsd  0x0(%rbp,%rdx,8),%xmm0
movsd  %xmm0,(%rcx,%rdi,8)
add    %r14,%rcx
lea    0x2(%rax),%edx
cmp    %r10d,%edx
mov    %rdi,%rdx
cmovl  %r11,%rdx
lea    (%rbx,%rdx,8),%rbp
movq   (%rbx,%rdx,8),%xmm0
movq   %xmm0,(%rcx,%rdi,8)
add    %r14,%rcx
lea    0x3(%rax),%edx
cmp    %r10d,%edx
mov    %rdi,%rdx
cmovl  %r11,%rdx
lea    0x0(,%rdx,8),%rdx
add    %rbp,%rdx
add    $0x4,%eax
add    %r14,%rcx
cmp    %r12d,%eax
jne    18d0 <ExtendImage+0x7d0>
add    -0x38(%rsp),%rsi
mov    %rsi,%rcx
mov    -0x48(%rsp),%ebx
test   %r9d,%r9d
je     1883 <ExtendImage+0x783>
mov    %r9d,%ebp
mov    %rcx,%rsi
nopl   (%rax)
movq   (%rdx),%xmm0
movq   %xmm0,(%rsi)
cmp    %r10d,%eax
mov    %rdi,%rcx
cmovl  %r11,%rcx
lea    (%rdx,%rcx,8),%rdx
add    $0x1,%eax
add    %r14,%rsi
add    $0xffffffff,%ebp
jne    1980 <ExtendImage+0x880>
jmp    1883 <ExtendImage+0x783>
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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