void transpose_matrix04(float **m, long nrow, long ncol, float **transposed) {
  long i, j;
  float m0, m1, m2, m3;
  float *pm;
  for (i = 0; i < nrow; i++) {
    pm = m[i];
    for (j = 0; j < ncol; j++) {
      m0 = *pm++;
      m1 = *pm++;
      m2 = *pm++;
      m3 = *pm++;
      transposed[j++][i] = m0;
      transposed[j++][i] = m1;
      transposed[j++][i] = m2;
      transposed[j][i] = m3;
    }
  }
}


x86 assembly (clang, -O0):
<transpose_matrix04>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
movq   $0x0,-0x28(%rbp)
mov    -0x28(%rbp),%rax
cmp    -0x10(%rbp),%rax
jge    1260 <transpose_matrix04+0x160>
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x48(%rbp)
movq   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%rax
cmp    -0x18(%rbp),%rax
jge    124a <transpose_matrix04+0x14a>
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x48(%rbp)
movss  (%rax),%xmm0
movss  %xmm0,-0x34(%rbp)
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x48(%rbp)
movss  (%rax),%xmm0
movss  %xmm0,-0x38(%rbp)
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x48(%rbp)
movss  (%rax),%xmm0
movss  %xmm0,-0x3c(%rbp)
mov    -0x48(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x48(%rbp)
movss  (%rax),%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x34(%rbp),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    (%rax,%rcx,8),%rax
mov    -0x28(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x38(%rbp),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    (%rax,%rcx,8),%rax
mov    -0x28(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x3c(%rbp),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %rcx,%rdx
add    $0x1,%rdx
mov    %rdx,-0x30(%rbp)
mov    (%rax,%rcx,8),%rax
mov    -0x28(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
movss  -0x40(%rbp),%xmm0
mov    -0x20(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x28(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    1142 <transpose_matrix04+0x42>
jmp    124f <transpose_matrix04+0x14f>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    111c <transpose_matrix04+0x1c>
pop    %rbp
ret

x86 assembly (clang, -O2):
<transpose_matrix04>:
test   %rsi,%rsi
jle    1181 <transpose_matrix04+0x81>
xor    %r8d,%r8d
jmp    1119 <transpose_matrix04+0x19>
nopw   0x0(%rax,%rax,1)
add    $0x1,%r8
cmp    %rsi,%r8
je     1181 <transpose_matrix04+0x81>
test   %rdx,%rdx
jle    1110 <transpose_matrix04+0x10>
mov    (%rdi,%r8,8),%r9
xor    %r10d,%r10d
cs nopw 0x0(%rax,%rax,1)
nop
movss  (%r9,%r10,4),%xmm0
movss  0x4(%r9,%r10,4),%xmm1
movss  0x8(%r9,%r10,4),%xmm2
movss  0xc(%r9,%r10,4),%xmm3
mov    (%rcx,%r10,8),%rax
movss  %xmm0,(%rax,%r8,4)
mov    0x8(%rcx,%r10,8),%rax
movss  %xmm1,(%rax,%r8,4)
mov    0x10(%rcx,%r10,8),%rax
movss  %xmm2,(%rax,%r8,4)
mov    0x18(%rcx,%r10,8),%rax
movss  %xmm3,(%rax,%r8,4)
add    $0x4,%r10
cmp    %rdx,%r10
jl     1130 <transpose_matrix04+0x30>
jmp    1110 <transpose_matrix04+0x10>
ret

LLVM IR (-O0):
define void @transpose_matrix04(float** %0, i64 %1, i64 %2, float** %3) {
%5 = alloca float**
%6 = alloca i64
%7 = alloca i64
%8 = alloca float**
%9 = alloca i64
%10 = alloca i64
%11 = alloca float
%12 = alloca float
%13 = alloca float
%14 = alloca float
%15 = alloca float*
store float** %0, float*** %5
store i64 %1, i64* %6
store i64 %2, i64* %7
store float** %3, float*** %8
store i64 0, i64* %9
br label %16
16: ; preds = %77, %4
%17 = load i64, i64* %9
%18 = load i64, i64* %6
%19 = icmp slt i64 %17, %18
br i1 %19, label %20, label %80
20: ; preds = %16
%21 = load float**, float*** %5
%22 = load i64, i64* %9
%23 = getelementptr inbounds float*, float** %21, i64 %22
%24 = load float*, float** %23
store float* %24, float** %15
store i64 0, i64* %10
br label %25
25: ; preds = %73, %20
%26 = load i64, i64* %10
%27 = load i64, i64* %7
%28 = icmp slt i64 %26, %27
br i1 %28, label %29, label %76
29: ; preds = %25
%30 = load float*, float** %15
%31 = getelementptr inbounds float, float* %30, i32 1
store float* %31, float** %15
%32 = load float, float* %30
store float %32, float* %11
%33 = load float*, float** %15
%34 = getelementptr inbounds float, float* %33, i32 1
store float* %34, float** %15
%35 = load float, float* %33
store float %35, float* %12
%36 = load float*, float** %15
%37 = getelementptr inbounds float, float* %36, i32 1
store float* %37, float** %15
%38 = load float, float* %36
store float %38, float* %13
%39 = load float*, float** %15
%40 = getelementptr inbounds float, float* %39, i32 1
store float* %40, float** %15
%41 = load float, float* %39
store float %41, float* %14
%42 = load float, float* %11
%43 = load float**, float*** %8
%44 = load i64, i64* %10
%45 = add nsw i64 %44, 1
store i64 %45, i64* %10
%46 = getelementptr inbounds float*, float** %43, i64 %44
%47 = load float*, float** %46
%48 = load i64, i64* %9
%49 = getelementptr inbounds float, float* %47, i64 %48
store float %42, float* %49
%50 = load float, float* %12
%51 = load float**, float*** %8
%52 = load i64, i64* %10
%53 = add nsw i64 %52, 1
store i64 %53, i64* %10
%54 = getelementptr inbounds float*, float** %51, i64 %52
%55 = load float*, float** %54
%56 = load i64, i64* %9
%57 = getelementptr inbounds float, float* %55, i64 %56
store float %50, float* %57
%58 = load float, float* %13
%59 = load float**, float*** %8
%60 = load i64, i64* %10
%61 = add nsw i64 %60, 1
store i64 %61, i64* %10
%62 = getelementptr inbounds float*, float** %59, i64 %60
%63 = load float*, float** %62
%64 = load i64, i64* %9
%65 = getelementptr inbounds float, float* %63, i64 %64
store float %58, float* %65
%66 = load float, float* %14
%67 = load float**, float*** %8
%68 = load i64, i64* %10
%69 = getelementptr inbounds float*, float** %67, i64 %68
%70 = load float*, float** %69
%71 = load i64, i64* %9
%72 = getelementptr inbounds float, float* %70, i64 %71
store float %66, float* %72
br label %73
73: ; preds = %29
%74 = load i64, i64* %10
%75 = add nsw i64 %74, 1
store i64 %75, i64* %10
br label %25
76: ; preds = %25
br label %77
77: ; preds = %76
%78 = load i64, i64* %9
%79 = add nsw i64 %78, 1
store i64 %79, i64* %9
br label %16
80: ; preds = %16
ret void
}

LLVM IR (-O2):
define void @transpose_matrix04(float** nocapture %0, i64 %1, i64 %2, float** nocapture %3) {
%5 = icmp sgt i64 %1, 0
br i1 %5, label %6, label %44
6: ; preds = %4
%7 = icmp sgt i64 %2, 0
br label %8
8: ; preds = %6, %41
%9 = phi i64 [ 0, %6 ], [ %42, %41 ]
br i1 %7, label %10, label %41
10: ; preds = %8
%11 = getelementptr inbounds float*, float** %0, i64 %9
%12 = load float*, float** %11
br label %13
13: ; preds = %10, %13
%14 = phi float* [ %22, %13 ], [ %12, %10 ]
%15 = phi i64 [ %39, %13 ], [ 0, %10 ]
%16 = getelementptr inbounds float, float* %14, i64 1
%17 = load float, float* %14
%18 = getelementptr inbounds float, float* %14, i64 2
%19 = load float, float* %16
%20 = getelementptr inbounds float, float* %14, i64 3
%21 = load float, float* %18
%22 = getelementptr inbounds float, float* %14, i64 4
%23 = load float, float* %20
%24 = or i64 %15, 1
%25 = getelementptr inbounds float*, float** %3, i64 %15
%26 = load float*, float** %25
%27 = getelementptr inbounds float, float* %26, i64 %9
store float %17, float* %27
%28 = or i64 %15, 2
%29 = getelementptr inbounds float*, float** %3, i64 %24
%30 = load float*, float** %29
%31 = getelementptr inbounds float, float* %30, i64 %9
store float %19, float* %31
%32 = or i64 %15, 3
%33 = getelementptr inbounds float*, float** %3, i64 %28
%34 = load float*, float** %33
%35 = getelementptr inbounds float, float* %34, i64 %9
store float %21, float* %35
%36 = getelementptr inbounds float*, float** %3, i64 %32
%37 = load float*, float** %36
%38 = getelementptr inbounds float, float* %37, i64 %9
store float %23, float* %38
%39 = add nuw nsw i64 %15, 4
%40 = icmp slt i64 %39, %2
br i1 %40, label %13, label %41
41: ; preds = %13, %8
%42 = add nuw nsw i64 %9, 1
%43 = icmp eq i64 %42, %1
br i1 %43, label %44, label %8
44: ; preds = %41, %4
ret void
}