int otcopy_4(int m, int n, const double *a, int lda, double *b) {
  int i, j;
  const double *a_offset, *a_offset1, *a_offset2, *a_offset3, *a_offset4;
  double *b_offset, *b_offset1, *b_offset2, *b_offset3;
  double ctemp1, ctemp2, ctemp3, ctemp4;
  double ctemp5, ctemp6, ctemp7, ctemp8;
  double ctemp9, ctemp10, ctemp11, ctemp12;
  double ctemp13, ctemp14, ctemp15, ctemp16;
  a_offset = a;
  b_offset = b;
  b_offset2 = b + m * (n & ~3);
  b_offset3 = b + m * (n & ~1);
  j = (m >> 2);
  if (j > 0) {
    do {
      a_offset1 = a_offset;
      a_offset2 = a_offset1 + lda;
      a_offset3 = a_offset2 + lda;
      a_offset4 = a_offset3 + lda;
      a_offset += 4 * lda;
      b_offset1 = b_offset;
      b_offset += 16;
      i = (n >> 2);
      if (i > 0) {
        do {
          ctemp1 = *(a_offset1 + 0);
          ctemp2 = *(a_offset1 + 1);
          ctemp3 = *(a_offset1 + 2);
          ctemp4 = *(a_offset1 + 3);
          ctemp5 = *(a_offset2 + 0);
          ctemp6 = *(a_offset2 + 1);
          ctemp7 = *(a_offset2 + 2);
          ctemp8 = *(a_offset2 + 3);
          ctemp9 = *(a_offset3 + 0);
          ctemp10 = *(a_offset3 + 1);
          ctemp11 = *(a_offset3 + 2);
          ctemp12 = *(a_offset3 + 3);
          ctemp13 = *(a_offset4 + 0);
          ctemp14 = *(a_offset4 + 1);
          ctemp15 = *(a_offset4 + 2);
          ctemp16 = *(a_offset4 + 3);
          a_offset1 += 4;
          a_offset2 += 4;
          a_offset3 += 4;
          a_offset4 += 4;
          *(b_offset1 + 0) = ctemp1;
          *(b_offset1 + 1) = ctemp2;
          *(b_offset1 + 2) = ctemp3;
          *(b_offset1 + 3) = ctemp4;
          *(b_offset1 + 4) = ctemp5;
          *(b_offset1 + 5) = ctemp6;
          *(b_offset1 + 6) = ctemp7;
          *(b_offset1 + 7) = ctemp8;
          *(b_offset1 + 8) = ctemp9;
          *(b_offset1 + 9) = ctemp10;
          *(b_offset1 + 10) = ctemp11;
          *(b_offset1 + 11) = ctemp12;
          *(b_offset1 + 12) = ctemp13;
          *(b_offset1 + 13) = ctemp14;
          *(b_offset1 + 14) = ctemp15;
          *(b_offset1 + 15) = ctemp16;
          b_offset1 += m * 4;
          i--;
        } while (i > 0);
      }
      if (n & 2) {
        ctemp1 = *(a_offset1 + 0);
        ctemp2 = *(a_offset1 + 1);
        ctemp3 = *(a_offset2 + 0);
        ctemp4 = *(a_offset2 + 1);
        ctemp5 = *(a_offset3 + 0);
        ctemp6 = *(a_offset3 + 1);
        ctemp7 = *(a_offset4 + 0);
        ctemp8 = *(a_offset4 + 1);
        a_offset1 += 2;
        a_offset2 += 2;
        a_offset3 += 2;
        a_offset4 += 2;
        *(b_offset2 + 0) = ctemp1;
        *(b_offset2 + 1) = ctemp2;
        *(b_offset2 + 2) = ctemp3;
        *(b_offset2 + 3) = ctemp4;
        *(b_offset2 + 4) = ctemp5;
        *(b_offset2 + 5) = ctemp6;
        *(b_offset2 + 6) = ctemp7;
        *(b_offset2 + 7) = ctemp8;
        b_offset2 += 8;
      }
      if (n & 1) {
        ctemp1 = *(a_offset1 + 0);
        ctemp2 = *(a_offset2 + 0);
        ctemp3 = *(a_offset3 + 0);
        ctemp4 = *(a_offset4 + 0);
        *(b_offset3 + 0) = ctemp1;
        *(b_offset3 + 1) = ctemp2;
        *(b_offset3 + 2) = ctemp3;
        *(b_offset3 + 3) = ctemp4;
        b_offset3 += 4;
      }
      j--;
    } while (j > 0);
  }
  if (m & 2) {
    a_offset1 = a_offset;
    a_offset2 = a_offset1 + lda;
    a_offset += 2 * lda;
    b_offset1 = b_offset;
    b_offset += 8;
    i = (n >> 2);
    if (i > 0) {
      do {
        ctemp1 = *(a_offset1 + 0);
        ctemp2 = *(a_offset1 + 1);
        ctemp3 = *(a_offset1 + 2);
        ctemp4 = *(a_offset1 + 3);
        ctemp5 = *(a_offset2 + 0);
        ctemp6 = *(a_offset2 + 1);
        ctemp7 = *(a_offset2 + 2);
        ctemp8 = *(a_offset2 + 3);
        a_offset1 += 4;
        a_offset2 += 4;
        *(b_offset1 + 0) = ctemp1;
        *(b_offset1 + 1) = ctemp2;
        *(b_offset1 + 2) = ctemp3;
        *(b_offset1 + 3) = ctemp4;
        *(b_offset1 + 4) = ctemp5;
        *(b_offset1 + 5) = ctemp6;
        *(b_offset1 + 6) = ctemp7;
        *(b_offset1 + 7) = ctemp8;
        b_offset1 += m * 4;
        i--;
      } while (i > 0);
    }
    if (n & 2) {
      ctemp1 = *(a_offset1 + 0);
      ctemp2 = *(a_offset1 + 1);
      ctemp3 = *(a_offset2 + 0);
      ctemp4 = *(a_offset2 + 1);
      a_offset1 += 2;
      a_offset2 += 2;
      *(b_offset2 + 0) = ctemp1;
      *(b_offset2 + 1) = ctemp2;
      *(b_offset2 + 2) = ctemp3;
      *(b_offset2 + 3) = ctemp4;
      b_offset2 += 4;
    }
    if (n & 1) {
      ctemp1 = *(a_offset1 + 0);
      ctemp2 = *(a_offset2 + 0);
      *(b_offset3 + 0) = ctemp1;
      *(b_offset3 + 1) = ctemp2;
      b_offset3 += 2;
    }
  }
  if (m & 1) {
    a_offset1 = a_offset;
    b_offset1 = b_offset;
    i = (n >> 2);
    if (i > 0) {
      do {
        ctemp1 = *(a_offset1 + 0);
        ctemp2 = *(a_offset1 + 1);
        ctemp3 = *(a_offset1 + 2);
        ctemp4 = *(a_offset1 + 3);
        a_offset1 += 4;
        *(b_offset1 + 0) = ctemp1;
        *(b_offset1 + 1) = ctemp2;
        *(b_offset1 + 2) = ctemp3;
        *(b_offset1 + 3) = ctemp4;
        b_offset1 += 4 * m;
        i--;
      } while (i > 0);
    }
    if (n & 2) {
      ctemp1 = *(a_offset1 + 0);
      ctemp2 = *(a_offset1 + 1);
      a_offset1 += 2;
      *(b_offset2 + 0) = ctemp1;
      *(b_offset2 + 1) = ctemp2;
    }
    if (n & 1) {
      ctemp1 = *(a_offset1 + 0);
      *(b_offset3 + 0) = ctemp1;
    }
  }
  return 0;
}


x86 assembly (clang, -O0):
<otcopy_4>:
push   %rbp
mov    %rsp,%rbp
sub    $0x70,%rsp
mov    %edi,-0x4(%rbp)
mov    %esi,-0x8(%rbp)
mov    %rdx,-0x10(%rbp)
mov    %ecx,-0x14(%rbp)
mov    %r8,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x58(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x4(%rbp),%ecx
mov    -0x8(%rbp),%edx
and    $0xfffffffc,%edx
imul   %edx,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x68(%rbp)
mov    -0x20(%rbp),%rax
mov    -0x4(%rbp),%ecx
mov    -0x8(%rbp),%edx
and    $0xfffffffe,%edx
imul   %edx,%ecx
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x70(%rbp)
mov    -0x4(%rbp),%eax
sar    $0x2,%eax
mov    %eax,-0x28(%rbp)
cmpl   $0x0,-0x28(%rbp)
jle    1667 <otcopy_4+0x567>
jmp    117d <otcopy_4+0x7d>
mov    -0x30(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
movslq -0x14(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x40(%rbp)
mov    -0x40(%rbp),%rax
movslq -0x14(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
movslq -0x14(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x50(%rbp)
mov    -0x14(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x58(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    -0x58(%rbp),%rax
add    $0x80,%rax
mov    %rax,-0x58(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x2,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x0,-0x24(%rbp)
jle    1473 <otcopy_4+0x373>
jmp    1204 <otcopy_4+0x104>
mov    -0x38(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x38(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x38(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x38(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x40(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
mov    -0x40(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x40(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
mov    -0x40(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
mov    -0x48(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0xb8(%rbp)
ff
mov    -0x48(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0xc0(%rbp)
ff
mov    -0x48(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0xc8(%rbp)
ff
mov    -0x48(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0xd0(%rbp)
ff
mov    -0x50(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0xd8(%rbp)
ff
mov    -0x50(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0xe0(%rbp)
ff
mov    -0x50(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0xe8(%rbp)
ff
mov    -0x50(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0xf0(%rbp)
ff
mov    -0x38(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x38(%rbp)
mov    -0x40(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x40(%rbp)
mov    -0x48(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x48(%rbp)
mov    -0x50(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x50(%rbp)
movsd  -0x78(%rbp),%xmm0
mov    -0x60(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x80(%rbp),%xmm0
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x18(%rax)
movsd  -0x98(%rbp),%xmm0
ff
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0xa0(%rbp),%xmm0
ff
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0xa8(%rbp),%xmm0
ff
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x30(%rax)
movsd  -0xb0(%rbp),%xmm0
ff
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x38(%rax)
movsd  -0xb8(%rbp),%xmm0
ff
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x40(%rax)
movsd  -0xc0(%rbp),%xmm0
ff
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x48(%rax)
movsd  -0xc8(%rbp),%xmm0
ff
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x50(%rax)
movsd  -0xd0(%rbp),%xmm0
ff
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x58(%rax)
movsd  -0xd8(%rbp),%xmm0
ff
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x60(%rax)
movsd  -0xe0(%rbp),%xmm0
ff
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x68(%rax)
movsd  -0xe8(%rbp),%xmm0
ff
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x70(%rax)
movsd  -0xf0(%rbp),%xmm0
ff
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x78(%rax)
mov    -0x4(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x60(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x60(%rbp)
mov    -0x24(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x0,-0x24(%rbp)
jg     1204 <otcopy_4+0x104>
jmp    1473 <otcopy_4+0x373>
mov    -0x8(%rbp),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     15bd <otcopy_4+0x4bd>
mov    -0x38(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x38(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x40(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x40(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x48(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
mov    -0x48(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x50(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
mov    -0x50(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
mov    -0x38(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x38(%rbp)
mov    -0x40(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x40(%rbp)
mov    -0x48(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x48(%rbp)
mov    -0x50(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x50(%rbp)
movsd  -0x78(%rbp),%xmm0
mov    -0x68(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x80(%rbp),%xmm0
mov    -0x68(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    -0x68(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    -0x68(%rbp),%rax
movsd  %xmm0,0x18(%rax)
movsd  -0x98(%rbp),%xmm0
ff
mov    -0x68(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0xa0(%rbp),%xmm0
ff
mov    -0x68(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0xa8(%rbp),%xmm0
ff
mov    -0x68(%rbp),%rax
movsd  %xmm0,0x30(%rax)
movsd  -0xb0(%rbp),%xmm0
ff
mov    -0x68(%rbp),%rax
movsd  %xmm0,0x38(%rax)
mov    -0x68(%rbp),%rax
add    $0x40,%rax
mov    %rax,-0x68(%rbp)
mov    -0x8(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     164f <otcopy_4+0x54f>
mov    -0x38(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x40(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x48(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x50(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
movsd  -0x78(%rbp),%xmm0
mov    -0x70(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x80(%rbp),%xmm0
mov    -0x70(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movsd  %xmm0,0x18(%rax)
mov    -0x70(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x70(%rbp)
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
cmpl   $0x0,-0x28(%rbp)
jg     117d <otcopy_4+0x7d>
jmp    1667 <otcopy_4+0x567>
mov    -0x4(%rbp),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     191f <otcopy_4+0x81f>
mov    -0x30(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
movslq -0x14(%rbp),%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x40(%rbp)
mov    -0x14(%rbp),%ecx
shl    $0x1,%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x58(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    -0x58(%rbp),%rax
add    $0x40,%rax
mov    %rax,-0x58(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x2,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x0,-0x24(%rbp)
jle    181e <otcopy_4+0x71e>
jmp    16d5 <otcopy_4+0x5d5>
mov    -0x38(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x38(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x38(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x88(%rbp)
mov    -0x38(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x40(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x98(%rbp)
ff
mov    -0x40(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0xa0(%rbp)
ff
mov    -0x40(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0xa8(%rbp)
ff
mov    -0x40(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0xb0(%rbp)
ff
mov    -0x38(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x38(%rbp)
mov    -0x40(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x40(%rbp)
movsd  -0x78(%rbp),%xmm0
mov    -0x60(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x80(%rbp),%xmm0
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x18(%rax)
movsd  -0x98(%rbp),%xmm0
ff
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x20(%rax)
movsd  -0xa0(%rbp),%xmm0
ff
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x28(%rax)
movsd  -0xa8(%rbp),%xmm0
ff
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x30(%rax)
movsd  -0xb0(%rbp),%xmm0
ff
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x38(%rax)
mov    -0x4(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x60(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x60(%rbp)
mov    -0x24(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x0,-0x24(%rbp)
jg     16d5 <otcopy_4+0x5d5>
jmp    181e <otcopy_4+0x71e>
mov    -0x8(%rbp),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     18ca <otcopy_4+0x7ca>
mov    -0x38(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x38(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x40(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x40(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x38(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x38(%rbp)
mov    -0x40(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x40(%rbp)
movsd  -0x78(%rbp),%xmm0
mov    -0x68(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x80(%rbp),%xmm0
mov    -0x68(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    -0x68(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    -0x68(%rbp),%rax
movsd  %xmm0,0x18(%rax)
mov    -0x68(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x68(%rbp)
mov    -0x8(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     191a <otcopy_4+0x81a>
mov    -0x38(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x40(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x80(%rbp)
movsd  -0x78(%rbp),%xmm0
mov    -0x70(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x80(%rbp),%xmm0
mov    -0x70(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x70(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x70(%rbp)
jmp    191f <otcopy_4+0x81f>
mov    -0x4(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     1a8b <otcopy_4+0x98b>
mov    -0x30(%rbp),%rax
mov    %rax,-0x38(%rbp)
mov    -0x58(%rbp),%rax
mov    %rax,-0x60(%rbp)
mov    -0x8(%rbp),%eax
sar    $0x2,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x0,-0x24(%rbp)
jle    1a0c <otcopy_4+0x90c>
jmp    1956 <otcopy_4+0x856>
mov    -0x38(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x38(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x38(%rbp),%rax
movsd  0x10(%rax),%xmm0
movsd  %xmm0,-0x88(%rbp)
ff
mov    -0x38(%rbp),%rax
movsd  0x18(%rax),%xmm0
movsd  %xmm0,-0x90(%rbp)
ff
mov    -0x38(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x38(%rbp)
movsd  -0x78(%rbp),%xmm0
mov    -0x60(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x80(%rbp),%xmm0
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x8(%rax)
movsd  -0x88(%rbp),%xmm0
ff
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x10(%rax)
movsd  -0x90(%rbp),%xmm0
ff
mov    -0x60(%rbp),%rax
movsd  %xmm0,0x18(%rax)
mov    -0x4(%rbp),%ecx
shl    $0x2,%ecx
mov    -0x60(%rbp),%rax
movslq %ecx,%rcx
shl    $0x3,%rcx
add    %rcx,%rax
mov    %rax,-0x60(%rbp)
mov    -0x24(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x0,-0x24(%rbp)
jg     1956 <otcopy_4+0x856>
jmp    1a0c <otcopy_4+0x90c>
mov    -0x8(%rbp),%eax
and    $0x2,%eax
cmp    $0x0,%eax
je     1a5d <otcopy_4+0x95d>
mov    -0x38(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x78(%rbp)
mov    -0x38(%rbp),%rax
movsd  0x8(%rax),%xmm0
movsd  %xmm0,-0x80(%rbp)
mov    -0x38(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x38(%rbp)
movsd  -0x78(%rbp),%xmm0
mov    -0x68(%rbp),%rax
movsd  %xmm0,(%rax)
movsd  -0x80(%rbp),%xmm0
mov    -0x68(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x8(%rbp),%eax
and    $0x1,%eax
cmp    $0x0,%eax
je     1a86 <otcopy_4+0x986>
mov    -0x38(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x78(%rbp)
movsd  -0x78(%rbp),%xmm0
mov    -0x70(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    1a8b <otcopy_4+0x98b>
xor    %eax,%eax
add    $0x70,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<otcopy_4>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rdx,%r9
mov    %esi,%eax
and    $0xfffffffc,%eax
imul   %edi,%eax
cltq
lea    (%r8,%rax,8),%r15
mov    %esi,%eax
and    $0xfffffffe,%eax
imul   %edi,%eax
cltq
lea    (%r8,%rax,8),%rbp
mov    %ecx,-0x30(%rsp)
movslq %ecx,%rcx
cmp    $0x4,%edi
mov    %rcx,-0x38(%rsp)
mov    %rdi,-0x28(%rsp)
jl     12f1 <otcopy_4+0x1f1>
mov    %edi,%r12d
shr    $0x2,%r12d
lea    0x0(,%rcx,4),%eax
cltq
mov    %rax,-0x8(%rsp)
mov    %esi,%edx
sar    $0x2,%edx
lea    0x0(,%rdi,4),%eax
movslq %eax,%r10
lea    0x70(%r8),%r11
shl    $0x3,%r10
lea    0x0(,%rcx,8),%rbx
lea    (%rbx,%rbx,2),%rax
mov    %rax,-0x18(%rsp)
shl    $0x4,%rcx
mov    %rcx,-0x20(%rsp)
add    $0x1,%edx
mov    %edx,-0x2c(%rsp)
jmp    11c3 <otcopy_4+0xc3>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax)
sub    $0xffffffffffffff80,%r8
mov    -0x8(%rsp),%rax
lea    (%r9,%rax,8),%r9
lea    -0x1(%r12),%eax
sub    $0xffffffffffffff80,%r11
cmp    $0x1,%r12d
mov    %eax,%r12d
jle    12f1 <otcopy_4+0x1f1>
cmp    $0x4,%esi
jl     1260 <otcopy_4+0x160>
mov    %r15,-0x10(%rsp)
mov    %rbp,%r15
mov    -0x2c(%rsp),%edi
mov    %r11,%rax
mov    %r9,%rdx
xchg   %ax,%ax
movups (%rdx),%xmm0
movups 0x10(%rdx),%xmm1
lea    (%rdx,%rbx,1),%rcx
movups (%rdx,%rbx,1),%xmm2
movups 0x10(%rdx,%rbx,1),%xmm3
lea    (%rcx,%rbx,1),%rbp
movups (%rbx,%rcx,1),%xmm4
movups 0x10(%rbx,%rcx,1),%xmm5
movups (%rbx,%rbp,1),%xmm6
movups 0x10(%rbx,%rbp,1),%xmm7
add    $0x20,%rdx
movups %xmm0,-0x70(%rax)
movups %xmm1,-0x60(%rax)
movups %xmm2,-0x50(%rax)
movups %xmm3,-0x40(%rax)
movups %xmm4,-0x30(%rax)
movups %xmm5,-0x20(%rax)
movups %xmm6,-0x10(%rax)
movups %xmm7,(%rax)
add    %r10,%rax
add    $0xffffffff,%edi
cmp    $0x1,%edi
jg     11e0 <otcopy_4+0xe0>
mov    -0x18(%rsp),%rax
lea    (%rdx,%rax,1),%rdi
mov    -0x20(%rsp),%rax
lea    (%rdx,%rax,1),%r13
lea    (%rdx,%rbx,1),%r14
mov    %r15,%rbp
mov    -0x10(%rsp),%r15
test   $0x2,%sil
jne    1281 <otcopy_4+0x181>
jmp    12b7 <otcopy_4+0x1b7>
xchg   %ax,%ax
mov    -0x38(%rsp),%rax
lea    (%r9,%rax,8),%r14
lea    (%r14,%rax,8),%r13
lea    0x0(,%rax,8),%rdi
add    %r13,%rdi
mov    %r9,%rdx
test   $0x2,%sil
je     12b7 <otcopy_4+0x1b7>
movups (%rdx),%xmm0
movups (%r14),%xmm1
movups 0x0(%r13),%xmm2
movups (%rdi),%xmm3
add    $0x10,%rdx
add    $0x10,%r14
add    $0x10,%r13
add    $0x10,%rdi
movups %xmm0,(%r15)
movups %xmm1,0x10(%r15)
movups %xmm2,0x20(%r15)
movups %xmm3,0x30(%r15)
add    $0x40,%r15
test   $0x1,%sil
je     11a0 <otcopy_4+0xa0>
movsd  (%rdx),%xmm0
movsd  (%r14),%xmm1
movsd  0x0(%r13),%xmm2
movsd  (%rdi),%xmm3
movsd  %xmm0,0x0(%rbp)
movsd  %xmm1,0x8(%rbp)
movsd  %xmm2,0x10(%rbp)
movsd  %xmm3,0x18(%rbp)
add    $0x20,%rbp
jmp    11a0 <otcopy_4+0xa0>
mov    -0x28(%rsp),%rbx
test   $0x2,%bl
je     13cc <otcopy_4+0x2cc>
mov    -0x30(%rsp),%r11d
add    %r11d,%r11d
cmp    $0x4,%esi
jl     1378 <otcopy_4+0x278>
mov    %rbp,%r10
mov    %esi,%edx
shr    $0x2,%edx
lea    0x0(,%rbx,4),%eax
movslq %eax,%rdi
lea    0x30(%r8),%rbp
shl    $0x3,%rdi
add    $0x1,%edx
mov    %r9,%rax
mov    -0x38(%rsp),%rcx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movups (%rax),%xmm0
movups 0x10(%rax),%xmm1
movups (%rax,%rcx,8),%xmm2
movups 0x10(%rax,%rcx,8),%xmm3
add    $0x20,%rax
movups %xmm0,-0x30(%rbp)
movups %xmm1,-0x20(%rbp)
movups %xmm2,-0x10(%rbp)
movups %xmm3,0x0(%rbp)
add    %rdi,%rbp
add    $0xffffffff,%edx
cmp    $0x1,%edx
ja     1340 <otcopy_4+0x240>
lea    (%rax,%rcx,8),%rdx
mov    %r10,%rbp
jmp    1384 <otcopy_4+0x284>
mov    -0x38(%rsp),%rax
lea    (%r9,%rax,8),%rdx
mov    %r9,%rax
movslq %r11d,%rdi
test   $0x2,%sil
je     13a8 <otcopy_4+0x2a8>
movups (%rax),%xmm0
movups (%rdx),%xmm1
add    $0x10,%rax
add    $0x10,%rdx
movups %xmm0,(%r15)
movups %xmm1,0x10(%r15)
add    $0x20,%r15
lea    (%r9,%rdi,8),%r9
add    $0x40,%r8
test   $0x1,%sil
je     13cc <otcopy_4+0x2cc>
movsd  (%rax),%xmm0
movsd  (%rdx),%xmm1
movsd  %xmm0,0x0(%rbp)
movsd  %xmm1,0x8(%rbp)
add    $0x10,%rbp
test   $0x1,%bl
je     1433 <otcopy_4+0x333>
cmp    $0x4,%esi
jl     1411 <otcopy_4+0x311>
mov    %esi,%eax
shr    $0x2,%eax
shl    $0x2,%ebx
movslq %ebx,%rdx
add    $0x10,%r8
shl    $0x3,%rdx
add    $0x1,%eax
nopl   0x0(%rax)
movups (%r9),%xmm0
movups 0x10(%r9),%xmm1
add    $0x20,%r9
movups %xmm0,-0x10(%r8)
movups %xmm1,(%r8)
add    %rdx,%r8
add    $0xffffffff,%eax
cmp    $0x1,%eax
ja     13f0 <otcopy_4+0x2f0>
test   $0x2,%sil
je     1423 <otcopy_4+0x323>
movups (%r9),%xmm0
add    $0x10,%r9
movups %xmm0,(%r15)
test   $0x1,%sil
je     1433 <otcopy_4+0x333>
movsd  (%r9),%xmm0
movsd  %xmm0,0x0(%rbp)
xor    %eax,%eax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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