int sgemm_tcopy_4(long m, long n, float *a, long lda, float *b) {
  long i, j;
  float *a_offset, *a_offset1, *a_offset2, *a_offset3, *a_offset4;
  float *b_offset, *b_offset1, *b_offset2, *b_offset3;
  float ctemp1, ctemp2, ctemp3, ctemp4;
  float ctemp5, ctemp6, ctemp7, ctemp8;
  float ctemp9, ctemp10, ctemp11, ctemp12;
  float 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):
<sgemm_tcopy_4>:
push   %rbp
mov    %rsp,%rbp
sub    $0x40,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,-0x68(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x8(%rbp),%rcx
mov    -0x10(%rbp),%rdx
and    $0xfffffffffffffffc,%rdx
imul   %rdx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x78(%rbp)
mov    -0x28(%rbp),%rax
mov    -0x8(%rbp),%rcx
mov    -0x10(%rbp),%rdx
and    $0xfffffffffffffffe,%rdx
imul   %rdx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x80(%rbp)
mov    -0x8(%rbp),%rax
sar    $0x2,%rax
mov    %rax,-0x38(%rbp)
cmpq   $0x0,-0x38(%rbp)
jle    169c <sgemm_tcopy_4+0x59c>
jmp    1186 <sgemm_tcopy_4+0x86>
mov    -0x40(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
mov    -0x20(%rbp),%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x50(%rbp)
mov    -0x50(%rbp),%rax
mov    -0x20(%rbp),%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x58(%rbp)
mov    -0x58(%rbp),%rax
mov    -0x20(%rbp),%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x60(%rbp)
mov    -0x20(%rbp),%rax
shl    $0x2,%rax
shl    $0x2,%rax
add    -0x40(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x68(%rbp),%rax
mov    %rax,-0x70(%rbp)
mov    -0x68(%rbp),%rax
add    $0x40,%rax
mov    %rax,-0x68(%rbp)
mov    -0x10(%rbp),%rax
sar    $0x2,%rax
mov    %rax,-0x30(%rbp)
cmpq   $0x0,-0x30(%rbp)
jle    1486 <sgemm_tcopy_4+0x386>
jmp    120b <sgemm_tcopy_4+0x10b>
mov    -0x48(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x84(%rbp)
ff
mov    -0x48(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  %xmm0,-0x88(%rbp)
ff
mov    -0x48(%rbp),%rax
movss  0x8(%rax),%xmm0
movss  %xmm0,-0x8c(%rbp)
ff
mov    -0x48(%rbp),%rax
movss  0xc(%rax),%xmm0
movss  %xmm0,-0x90(%rbp)
ff
mov    -0x50(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x94(%rbp)
ff
mov    -0x50(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  %xmm0,-0x98(%rbp)
ff
mov    -0x50(%rbp),%rax
movss  0x8(%rax),%xmm0
movss  %xmm0,-0x9c(%rbp)
ff
mov    -0x50(%rbp),%rax
movss  0xc(%rax),%xmm0
movss  %xmm0,-0xa0(%rbp)
ff
mov    -0x58(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0xa4(%rbp)
ff
mov    -0x58(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  %xmm0,-0xa8(%rbp)
ff
mov    -0x58(%rbp),%rax
movss  0x8(%rax),%xmm0
movss  %xmm0,-0xac(%rbp)
ff
mov    -0x58(%rbp),%rax
movss  0xc(%rax),%xmm0
movss  %xmm0,-0xb0(%rbp)
ff
mov    -0x60(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0xb4(%rbp)
ff
mov    -0x60(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  %xmm0,-0xb8(%rbp)
ff
mov    -0x60(%rbp),%rax
movss  0x8(%rax),%xmm0
movss  %xmm0,-0xbc(%rbp)
ff
mov    -0x60(%rbp),%rax
movss  0xc(%rax),%xmm0
movss  %xmm0,-0xc0(%rbp)
ff
mov    -0x48(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x48(%rbp)
mov    -0x50(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x50(%rbp)
mov    -0x58(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x58(%rbp)
mov    -0x60(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x60(%rbp)
movss  -0x84(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x88(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0x4(%rax)
movss  -0x8c(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0x8(%rax)
movss  -0x90(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0xc(%rax)
movss  -0x94(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0x10(%rax)
movss  -0x98(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0x14(%rax)
movss  -0x9c(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0x18(%rax)
movss  -0xa0(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0x1c(%rax)
movss  -0xa4(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0x20(%rax)
movss  -0xa8(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0x24(%rax)
movss  -0xac(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0x28(%rax)
movss  -0xb0(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0x2c(%rax)
movss  -0xb4(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0x30(%rax)
movss  -0xb8(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0x34(%rax)
movss  -0xbc(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0x38(%rax)
movss  -0xc0(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0x3c(%rax)
mov    -0x8(%rbp),%rax
shl    $0x2,%rax
shl    $0x2,%rax
add    -0x70(%rbp),%rax
mov    %rax,-0x70(%rbp)
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
cmpq   $0x0,-0x30(%rbp)
jg     120b <sgemm_tcopy_4+0x10b>
jmp    1486 <sgemm_tcopy_4+0x386>
mov    -0x10(%rbp),%rax
and    $0x2,%rax
cmp    $0x0,%rax
je     15df <sgemm_tcopy_4+0x4df>
mov    -0x48(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x84(%rbp)
ff
mov    -0x48(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  %xmm0,-0x88(%rbp)
ff
mov    -0x50(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x8c(%rbp)
ff
mov    -0x50(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  %xmm0,-0x90(%rbp)
ff
mov    -0x58(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x94(%rbp)
ff
mov    -0x58(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  %xmm0,-0x98(%rbp)
ff
mov    -0x60(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x9c(%rbp)
ff
mov    -0x60(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  %xmm0,-0xa0(%rbp)
ff
mov    -0x48(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x48(%rbp)
mov    -0x50(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x50(%rbp)
mov    -0x58(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x58(%rbp)
mov    -0x60(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x60(%rbp)
movss  -0x84(%rbp),%xmm0
ff
mov    -0x78(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x88(%rbp),%xmm0
ff
mov    -0x78(%rbp),%rax
movss  %xmm0,0x4(%rax)
movss  -0x8c(%rbp),%xmm0
ff
mov    -0x78(%rbp),%rax
movss  %xmm0,0x8(%rax)
movss  -0x90(%rbp),%xmm0
ff
mov    -0x78(%rbp),%rax
movss  %xmm0,0xc(%rax)
movss  -0x94(%rbp),%xmm0
ff
mov    -0x78(%rbp),%rax
movss  %xmm0,0x10(%rax)
movss  -0x98(%rbp),%xmm0
ff
mov    -0x78(%rbp),%rax
movss  %xmm0,0x14(%rax)
movss  -0x9c(%rbp),%xmm0
ff
mov    -0x78(%rbp),%rax
movss  %xmm0,0x18(%rax)
movss  -0xa0(%rbp),%xmm0
ff
mov    -0x78(%rbp),%rax
movss  %xmm0,0x1c(%rax)
mov    -0x78(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x78(%rbp)
mov    -0x10(%rbp),%rax
and    $0x1,%rax
cmp    $0x0,%rax
je     1680 <sgemm_tcopy_4+0x580>
mov    -0x48(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x84(%rbp)
mov    -0x50(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x88(%rbp)
ff
mov    -0x58(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x8c(%rbp)
ff
mov    -0x60(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x90(%rbp)
ff
movss  -0x84(%rbp),%xmm0
ff
mov    -0x80(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x88(%rbp),%xmm0
ff
mov    -0x80(%rbp),%rax
movss  %xmm0,0x4(%rax)
movss  -0x8c(%rbp),%xmm0
ff
mov    -0x80(%rbp),%rax
movss  %xmm0,0x8(%rax)
movss  -0x90(%rbp),%xmm0
ff
mov    -0x80(%rbp),%rax
movss  %xmm0,0xc(%rax)
mov    -0x80(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x80(%rbp)
mov    -0x38(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x38(%rbp)
cmpq   $0x0,-0x38(%rbp)
jg     1186 <sgemm_tcopy_4+0x86>
jmp    169c <sgemm_tcopy_4+0x59c>
mov    -0x8(%rbp),%rax
and    $0x2,%rax
cmp    $0x0,%rax
je     1981 <sgemm_tcopy_4+0x881>
mov    -0x40(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x48(%rbp),%rax
mov    -0x20(%rbp),%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x50(%rbp)
mov    -0x20(%rbp),%rax
shl    $0x1,%rax
shl    $0x2,%rax
add    -0x40(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x68(%rbp),%rax
mov    %rax,-0x70(%rbp)
mov    -0x68(%rbp),%rax
add    $0x20,%rax
mov    %rax,-0x68(%rbp)
mov    -0x10(%rbp),%rax
sar    $0x2,%rax
mov    %rax,-0x30(%rbp)
cmpq   $0x0,-0x30(%rbp)
jle    1862 <sgemm_tcopy_4+0x762>
jmp    170d <sgemm_tcopy_4+0x60d>
mov    -0x48(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x84(%rbp)
ff
mov    -0x48(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  %xmm0,-0x88(%rbp)
ff
mov    -0x48(%rbp),%rax
movss  0x8(%rax),%xmm0
movss  %xmm0,-0x8c(%rbp)
ff
mov    -0x48(%rbp),%rax
movss  0xc(%rax),%xmm0
movss  %xmm0,-0x90(%rbp)
ff
mov    -0x50(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x94(%rbp)
ff
mov    -0x50(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  %xmm0,-0x98(%rbp)
ff
mov    -0x50(%rbp),%rax
movss  0x8(%rax),%xmm0
movss  %xmm0,-0x9c(%rbp)
ff
mov    -0x50(%rbp),%rax
movss  0xc(%rax),%xmm0
movss  %xmm0,-0xa0(%rbp)
ff
mov    -0x48(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x48(%rbp)
mov    -0x50(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x50(%rbp)
movss  -0x84(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x88(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0x4(%rax)
movss  -0x8c(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0x8(%rax)
movss  -0x90(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0xc(%rax)
movss  -0x94(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0x10(%rax)
movss  -0x98(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0x14(%rax)
movss  -0x9c(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0x18(%rax)
movss  -0xa0(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0x1c(%rax)
mov    -0x8(%rbp),%rax
shl    $0x2,%rax
shl    $0x2,%rax
add    -0x70(%rbp),%rax
mov    %rax,-0x70(%rbp)
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
cmpq   $0x0,-0x30(%rbp)
jg     170d <sgemm_tcopy_4+0x60d>
jmp    1862 <sgemm_tcopy_4+0x762>
mov    -0x10(%rbp),%rax
and    $0x2,%rax
cmp    $0x0,%rax
je     191d <sgemm_tcopy_4+0x81d>
mov    -0x48(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x84(%rbp)
ff
mov    -0x48(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  %xmm0,-0x88(%rbp)
ff
mov    -0x50(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x8c(%rbp)
ff
mov    -0x50(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  %xmm0,-0x90(%rbp)
ff
mov    -0x48(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x48(%rbp)
mov    -0x50(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x50(%rbp)
movss  -0x84(%rbp),%xmm0
ff
mov    -0x78(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x88(%rbp),%xmm0
ff
mov    -0x78(%rbp),%rax
movss  %xmm0,0x4(%rax)
movss  -0x8c(%rbp),%xmm0
ff
mov    -0x78(%rbp),%rax
movss  %xmm0,0x8(%rax)
movss  -0x90(%rbp),%xmm0
ff
mov    -0x78(%rbp),%rax
movss  %xmm0,0xc(%rax)
mov    -0x78(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x78(%rbp)
mov    -0x10(%rbp),%rax
and    $0x1,%rax
cmp    $0x0,%rax
je     197c <sgemm_tcopy_4+0x87c>
mov    -0x48(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x84(%rbp)
ff
mov    -0x50(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x88(%rbp)
ff
movss  -0x84(%rbp),%xmm0
ff
mov    -0x80(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x88(%rbp),%xmm0
ff
mov    -0x80(%rbp),%rax
movss  %xmm0,0x4(%rax)
mov    -0x80(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x80(%rbp)
jmp    1981 <sgemm_tcopy_4+0x881>
mov    -0x8(%rbp),%rax
and    $0x1,%rax
cmp    $0x0,%rax
je     1b18 <sgemm_tcopy_4+0xa18>
mov    -0x40(%rbp),%rax
mov    %rax,-0x48(%rbp)
mov    -0x68(%rbp),%rax
mov    %rax,-0x70(%rbp)
mov    -0x10(%rbp),%rax
sar    $0x2,%rax
mov    %rax,-0x30(%rbp)
cmpq   $0x0,-0x30(%rbp)
jle    1a81 <sgemm_tcopy_4+0x981>
jmp    19bf <sgemm_tcopy_4+0x8bf>
mov    -0x48(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x84(%rbp)
ff
mov    -0x48(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  %xmm0,-0x88(%rbp)
ff
mov    -0x48(%rbp),%rax
movss  0x8(%rax),%xmm0
movss  %xmm0,-0x8c(%rbp)
ff
mov    -0x48(%rbp),%rax
movss  0xc(%rax),%xmm0
movss  %xmm0,-0x90(%rbp)
ff
mov    -0x48(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x48(%rbp)
movss  -0x84(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x88(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0x4(%rax)
movss  -0x8c(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0x8(%rax)
movss  -0x90(%rbp),%xmm0
ff
mov    -0x70(%rbp),%rax
movss  %xmm0,0xc(%rax)
mov    -0x8(%rbp),%rax
shl    $0x2,%rax
shl    $0x2,%rax
add    -0x70(%rbp),%rax
mov    %rax,-0x70(%rbp)
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
cmpq   $0x0,-0x30(%rbp)
jg     19bf <sgemm_tcopy_4+0x8bf>
jmp    1a81 <sgemm_tcopy_4+0x981>
mov    -0x10(%rbp),%rax
and    $0x2,%rax
cmp    $0x0,%rax
je     1ae1 <sgemm_tcopy_4+0x9e1>
mov    -0x48(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x84(%rbp)
ff
mov    -0x48(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  %xmm0,-0x88(%rbp)
ff
mov    -0x48(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x48(%rbp)
movss  -0x84(%rbp),%xmm0
ff
mov    -0x78(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x88(%rbp),%xmm0
ff
mov    -0x78(%rbp),%rax
movss  %xmm0,0x4(%rax)
mov    -0x10(%rbp),%rax
and    $0x1,%rax
cmp    $0x0,%rax
je     1b13 <sgemm_tcopy_4+0xa13>
mov    -0x48(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x84(%rbp)
ff
movss  -0x84(%rbp),%xmm0
ff
mov    -0x80(%rbp),%rax
movss  %xmm0,(%rax)
jmp    1b18 <sgemm_tcopy_4+0xa18>
xor    %eax,%eax
add    $0x40,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<sgemm_tcopy_4>:
push   %rbp
push   %r15
push   %r14
push   %r13
push   %r12
push   %rbx
mov    %rsi,%rbx
movabs $0x3ffffffffffffffc,%rax
ff ff 3f
and    %rsi,%rax
imul   %rdi,%rax
lea    (%r8,%rax,4),%r9
movabs $0x3ffffffffffffffe,%rax
ff ff 3f
and    %rsi,%rax
imul   %rdi,%rax
lea    (%r8,%rax,4),%rsi
cmp    $0x4,%rdi
mov    %rbx,-0x18(%rsp)
mov    %rcx,-0x20(%rsp)
mov    %rdi,-0x10(%rsp)
jl     1293 <sgemm_tcopy_4+0x193>
mov    %rdi,%r15
shr    $0x2,%r15
lea    0x0(,%rcx,4),%rax
mov    %rbx,%rbp
sar    $0x2,%rbp
lea    0x30(%r8),%r14
mov    %rdi,%r12
shl    $0x4,%r12
lea    (%rax,%rax,2),%r13
lea    0x0(,%rcx,8),%r10
add    $0x1,%rbp
mov    %rbp,-0x8(%rsp)
mov    %r9,%rcx
jmp    11ad <sgemm_tcopy_4+0xad>
nopl   0x0(%rax,%rax,1)
add    $0x40,%r8
lea    (%rdx,%rax,4),%rdx
lea    -0x1(%r15),%rdi
add    $0x40,%r14
cmp    $0x1,%r15
mov    %rdi,%r15
jle    1296 <sgemm_tcopy_4+0x196>
cmp    $0x4,%rbx
jl     1210 <sgemm_tcopy_4+0x110>
mov    -0x8(%rsp),%rdi
mov    %r14,%rbx
mov    %rdx,%rbp
xchg   %ax,%ax
movups 0x0(%rbp),%xmm0
movups 0x0(%rbp,%rax,1),%xmm1
movups 0x0(%rbp,%r10,1),%xmm2
movups 0x0(%rbp,%r13,1),%xmm3
add    $0x10,%rbp
movups %xmm0,-0x30(%rbx)
movups %xmm1,-0x20(%rbx)
movups %xmm2,-0x10(%rbx)
movups %xmm3,(%rbx)
add    %r12,%rbx
add    $0xffffffffffffffff,%rdi
cmp    $0x1,%rdi
jg     11c0 <sgemm_tcopy_4+0xc0>
mov    %rbp,%r11
add    %r13,%r11
lea    (%r10,%rbp,1),%rdi
lea    (%rax,%rbp,1),%r9
mov    -0x18(%rsp),%rbx
test   $0x2,%bl
jne    122f <sgemm_tcopy_4+0x12f>
jmp    125b <sgemm_tcopy_4+0x15b>
nop
mov    %rcx,%rbp
mov    -0x20(%rsp),%rcx
lea    (%rdx,%rcx,4),%r9
lea    (%r9,%rcx,4),%rdi
lea    (%rdi,%rcx,4),%r11
mov    %rbp,%rcx
mov    %rdx,%rbp
test   $0x2,%bl
je     125b <sgemm_tcopy_4+0x15b>
movsd  0x0(%rbp),%xmm0
movsd  (%rdi),%xmm1
add    $0x8,%rbp
movhps (%r9),%xmm0
add    $0x8,%rdi
add    $0x8,%r9
movhps (%r11),%xmm1
add    $0x8,%r11
movups %xmm0,(%rcx)
movups %xmm1,0x10(%rcx)
add    $0x20,%rcx
test   $0x1,%bl
je     1190 <sgemm_tcopy_4+0x90>
movss  0x0(%rbp),%xmm0
movss  (%r9),%xmm1
movss  (%rdi),%xmm2
movss  (%r11),%xmm3
movss  %xmm0,(%rsi)
movss  %xmm1,0x4(%rsi)
movss  %xmm2,0x8(%rsi)
movss  %xmm3,0xc(%rsi)
add    $0x10,%rsi
jmp    1190 <sgemm_tcopy_4+0x90>
mov    %r9,%rcx
mov    -0x10(%rsp),%r9
test   $0x2,%r9b
je     134d <sgemm_tcopy_4+0x24d>
mov    %rcx,%r10
cmp    $0x4,%rbx
jl     1300 <sgemm_tcopy_4+0x200>
mov    %rbx,%rdi
shr    $0x2,%rdi
lea    0x10(%r8),%rbp
mov    %r9,%rbx
shl    $0x4,%rbx
add    $0x1,%rdi
mov    %rdx,%rax
mov    -0x20(%rsp),%rcx
nopl   0x0(%rax)
movups (%rax),%xmm0
movups (%rax,%rcx,4),%xmm1
add    $0x10,%rax
movups %xmm0,-0x10(%rbp)
movups %xmm1,0x0(%rbp)
add    %rbx,%rbp
add    $0xffffffffffffffff,%rdi
cmp    $0x1,%rdi
ja     12d0 <sgemm_tcopy_4+0x1d0>
lea    (%rax,%rcx,4),%rdi
mov    -0x18(%rsp),%rbx
test   $0x2,%bl
jne    1311 <sgemm_tcopy_4+0x211>
jmp    1328 <sgemm_tcopy_4+0x228>
mov    -0x20(%rsp),%rcx
lea    (%rdx,%rcx,4),%rdi
mov    %rdx,%rax
test   $0x2,%bl
je     1328 <sgemm_tcopy_4+0x228>
movsd  (%rax),%xmm0
movhps (%rdi),%xmm0
add    $0x8,%rax
add    $0x8,%rdi
movups %xmm0,(%r10)
add    $0x10,%r10
lea    (%rdx,%rcx,8),%rdx
add    $0x20,%r8
test   $0x1,%bl
je     134a <sgemm_tcopy_4+0x24a>
movss  (%rax),%xmm0
movss  (%rdi),%xmm1
movss  %xmm0,(%rsi)
movss  %xmm1,0x4(%rsi)
add    $0x8,%rsi
mov    %r10,%rcx
test   $0x1,%r9b
je     13a4 <sgemm_tcopy_4+0x2a4>
cmp    $0x4,%rbx
jl     1388 <sgemm_tcopy_4+0x288>
mov    %rbx,%rax
shr    $0x2,%rax
shl    $0x4,%r9
add    $0x1,%rax
nopl   0x0(%rax,%rax,1)
movups (%rdx),%xmm0
add    $0x10,%rdx
movups %xmm0,(%r8)
add    %r9,%r8
add    $0xffffffffffffffff,%rax
cmp    $0x1,%rax
ja     1370 <sgemm_tcopy_4+0x270>
test   $0x2,%bl
je     1397 <sgemm_tcopy_4+0x297>
mov    (%rdx),%rax
add    $0x8,%rdx
mov    %rax,(%rcx)
test   $0x1,%bl
je     13a4 <sgemm_tcopy_4+0x2a4>
movss  (%rdx),%xmm0
movss  %xmm0,(%rsi)
xor    %eax,%eax
pop    %rbx
pop    %r12
pop    %r13
pop    %r14
pop    %r15
pop    %rbp
ret

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

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