void Maxtrix_Transpose(float *pSrc, unsigned short nRows, unsigned short nCols,
                       float *pDst) {
  float *pIn = pSrc;
  float *pOut = pDst;
  float *px;
  unsigned short blkCnt, i = 0u, row = nRows;
  do {
    blkCnt = nCols >> 2;
    px = pOut + i;
    while (blkCnt > 0u) {
      *px = *pIn++;
      px += nRows;
      *px = *pIn++;
      px += nRows;
      *px = *pIn++;
      px += nRows;
      *px = *pIn++;
      px += nRows;
      blkCnt--;
    }
    blkCnt = nCols & 0x03u;
    while (blkCnt > 0u) {
      *px = *pIn++;
      px += nRows;
      blkCnt--;
    }
    i++;
    row--;
  } while (row > 0u);
}


x86 assembly (clang, -O0):
<Maxtrix_Transpose>:
push   %rbp
mov    %rsp,%rbp
mov    %dx,%ax
mov    %si,%dx
mov    %rdi,-0x8(%rbp)
mov    %dx,-0xa(%rbp)
mov    %ax,-0xc(%rbp)
mov    %rcx,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x20(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x28(%rbp)
movw   $0x0,-0x34(%rbp)
mov    -0xa(%rbp),%ax
mov    %ax,-0x36(%rbp)
movzwl -0xc(%rbp),%eax
sar    $0x2,%eax
mov    %ax,-0x32(%rbp)
mov    -0x28(%rbp),%rax
movzwl -0x34(%rbp),%ecx
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
movzwl -0x32(%rbp),%eax
cmp    $0x0,%eax
jbe    123b <Maxtrix_Transpose+0x13b>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x20(%rbp)
movss  (%rax),%xmm0
mov    -0x30(%rbp),%rax
movss  %xmm0,(%rax)
movzwl -0xa(%rbp),%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x20(%rbp)
movss  (%rax),%xmm0
mov    -0x30(%rbp),%rax
movss  %xmm0,(%rax)
movzwl -0xa(%rbp),%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x20(%rbp)
movss  (%rax),%xmm0
mov    -0x30(%rbp),%rax
movss  %xmm0,(%rax)
movzwl -0xa(%rbp),%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x20(%rbp)
movss  (%rax),%xmm0
mov    -0x30(%rbp),%rax
movss  %xmm0,(%rax)
movzwl -0xa(%rbp),%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x32(%rbp),%ax
add    $0xffff,%ax
mov    %ax,-0x32(%rbp)
jmp    1159 <Maxtrix_Transpose+0x59>
movzwl -0xc(%rbp),%eax
and    $0x3,%eax
mov    %ax,-0x32(%rbp)
movzwl -0x32(%rbp),%eax
cmp    $0x0,%eax
jbe    1295 <Maxtrix_Transpose+0x195>
mov    -0x20(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x20(%rbp)
movss  (%rax),%xmm0
mov    -0x30(%rbp),%rax
movss  %xmm0,(%rax)
movzwl -0xa(%rbp),%ecx
mov    -0x30(%rbp),%rax
movslq %ecx,%rcx
shl    $0x2,%rcx
add    %rcx,%rax
mov    %rax,-0x30(%rbp)
mov    -0x32(%rbp),%ax
add    $0xffff,%ax
mov    %ax,-0x32(%rbp)
jmp    1246 <Maxtrix_Transpose+0x146>
mov    -0x34(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x34(%rbp)
mov    -0x36(%rbp),%ax
add    $0xffff,%ax
mov    %ax,-0x36(%rbp)
movzwl -0x36(%rbp),%eax
cmp    $0x0,%eax
ja     1138 <Maxtrix_Transpose+0x38>
pop    %rbp
ret

x86 assembly (clang, -O2):
<Maxtrix_Transpose>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
mov    %edx,%r8d
shr    $0x2,%r8d
mov    %edx,%r9d
and    $0x3,%r9d
mov    %esi,%r14d
mov    %r8d,%r10d
add    $0xffffffff,%r10d
mov    %r14,%r11
shl    $0x5,%r11
lea    0x0(,%r14,4),%rbx
xor    %r15d,%r15d
jmp    1152 <Maxtrix_Transpose+0x52>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
add    $0x4,%rdi
add    $0x1,%r15
add    $0xffff,%si
je     1297 <Maxtrix_Transpose+0x197>
lea    (%rcx,%r15,4),%rax
cmp    $0x4,%dx
jb     124b <Maxtrix_Transpose+0x14b>
test   $0x4,%dl
jne    1180 <Maxtrix_Transpose+0x80>
mov    %r8d,%r12d
cmp    $0x1,%r8w
jne    11d0 <Maxtrix_Transpose+0xd0>
jmp    124b <Maxtrix_Transpose+0x14b>
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movss  (%rdi),%xmm0
movss  %xmm0,(%rax)
lea    (%rax,%r14,4),%rbp
movss  0x4(%rdi),%xmm0
movss  %xmm0,(%rax,%r14,4)
lea    0x0(%rbp,%r14,4),%rax
movss  0x8(%rdi),%xmm0
movss  %xmm0,0x0(%rbp,%r14,4)
lea    (%rax,%r14,4),%rbp
movss  0xc(%rdi),%xmm0
add    $0x10,%rdi
movss  %xmm0,(%rax,%r14,4)
lea    0x0(,%r14,4),%rax
add    %rbp,%rax
mov    %r10d,%r12d
cmp    $0x1,%r8w
je     124b <Maxtrix_Transpose+0x14b>
mov    %rax,%rbp
movss  (%rdi),%xmm0
movss  %xmm0,(%rax)
movss  0x4(%rdi),%xmm0
add    %rbx,%rax
movss  %xmm0,0x0(%rbp,%rbx,1)
movss  0x8(%rdi),%xmm0
movss  %xmm0,(%rbx,%rax,1)
add    %rbx,%rax
movss  0xc(%rdi),%xmm0
movss  %xmm0,(%rbx,%rax,1)
add    %rbx,%rax
movss  0x10(%rdi),%xmm0
movss  %xmm0,(%rbx,%rax,1)
add    %rbx,%rax
movss  0x14(%rdi),%xmm0
movss  %xmm0,(%rbx,%rax,1)
add    %rbx,%rax
movss  0x18(%rdi),%xmm0
movss  %xmm0,(%rbx,%rax,1)
add    %rbx,%rax
movss  0x1c(%rdi),%xmm0
add    $0x20,%rdi
movss  %xmm0,(%rbx,%rax,1)
add    %rbx,%rax
add    %rbx,%rax
add    $0xfffe,%r12w
jne    11d0 <Maxtrix_Transpose+0xd0>
add    %r11,%rbp
mov    %rbp,%rax
test   %r9w,%r9w
je     1144 <Maxtrix_Transpose+0x44>
movss  (%rdi),%xmm0
movss  %xmm0,(%rax)
cmp    $0x1,%r9w
je     1140 <Maxtrix_Transpose+0x40>
movss  0x4(%rdi),%xmm0
movss  %xmm0,(%rax,%r14,4)
cmp    $0x2,%r9w
jne    1283 <Maxtrix_Transpose+0x183>
add    $0x8,%rdi
jmp    1144 <Maxtrix_Transpose+0x44>
movss  0x8(%rdi),%xmm0
add    $0xc,%rdi
movss  %xmm0,(%rax,%r14,8)
jmp    1144 <Maxtrix_Transpose+0x44>
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret

LLVM IR (-O0):
define void @Maxtrix_Transpose(float* %0, i16 zeroext %1, i16 zeroext %2, float* %3) {
%5 = alloca float*
%6 = alloca i16
%7 = alloca i16
%8 = alloca float*
%9 = alloca float*
%10 = alloca float*
%11 = alloca float*
%12 = alloca i16
%13 = alloca i16
%14 = alloca i16
store float* %0, float** %5
store i16 %1, i16* %6
store i16 %2, i16* %7
store float* %3, float** %8
%15 = load float*, float** %5
store float* %15, float** %9
%16 = load float*, float** %8
store float* %16, float** %10
store i16 0, i16* %13
%17 = load i16, i16* %6
store i16 %17, i16* %14
br label %18
18: ; preds = %97, %4
%19 = load i16, i16* %7
%20 = zext i16 %19 to i32
%21 = ashr i32 %20, 2
%22 = trunc i32 %21 to i16
store i16 %22, i16* %12
%23 = load float*, float** %10
%24 = load i16, i16* %13
%25 = zext i16 %24 to i32
%26 = sext i32 %25 to i64
%27 = getelementptr inbounds float, float* %23, i64 %26
store float* %27, float** %11
br label %28
28: ; preds = %32, %18
%29 = load i16, i16* %12
%30 = zext i16 %29 to i32
%31 = icmp ugt i32 %30, 0
br i1 %31, label %32, label %71
32: ; preds = %28
%33 = load float*, float** %9
%34 = getelementptr inbounds float, float* %33, i32 1
store float* %34, float** %9
%35 = load float, float* %33
%36 = load float*, float** %11
store float %35, float* %36
%37 = load i16, i16* %6
%38 = zext i16 %37 to i32
%39 = load float*, float** %11
%40 = sext i32 %38 to i64
%41 = getelementptr inbounds float, float* %39, i64 %40
store float* %41, float** %11
%42 = load float*, float** %9
%43 = getelementptr inbounds float, float* %42, i32 1
store float* %43, float** %9
%44 = load float, float* %42
%45 = load float*, float** %11
store float %44, float* %45
%46 = load i16, i16* %6
%47 = zext i16 %46 to i32
%48 = load float*, float** %11
%49 = sext i32 %47 to i64
%50 = getelementptr inbounds float, float* %48, i64 %49
store float* %50, float** %11
%51 = load float*, float** %9
%52 = getelementptr inbounds float, float* %51, i32 1
store float* %52, float** %9
%53 = load float, float* %51
%54 = load float*, float** %11
store float %53, float* %54
%55 = load i16, i16* %6
%56 = zext i16 %55 to i32
%57 = load float*, float** %11
%58 = sext i32 %56 to i64
%59 = getelementptr inbounds float, float* %57, i64 %58
store float* %59, float** %11
%60 = load float*, float** %9
%61 = getelementptr inbounds float, float* %60, i32 1
store float* %61, float** %9
%62 = load float, float* %60
%63 = load float*, float** %11
store float %62, float* %63
%64 = load i16, i16* %6
%65 = zext i16 %64 to i32
%66 = load float*, float** %11
%67 = sext i32 %65 to i64
%68 = getelementptr inbounds float, float* %66, i64 %67
store float* %68, float** %11
%69 = load i16, i16* %12
%70 = add i16 %69, -1
store i16 %70, i16* %12
br label %28
71: ; preds = %28
%72 = load i16, i16* %7
%73 = zext i16 %72 to i32
%74 = and i32 %73, 3
%75 = trunc i32 %74 to i16
store i16 %75, i16* %12
br label %76
76: ; preds = %80, %71
%77 = load i16, i16* %12
%78 = zext i16 %77 to i32
%79 = icmp ugt i32 %78, 0
br i1 %79, label %80, label %92
80: ; preds = %76
%81 = load float*, float** %9
%82 = getelementptr inbounds float, float* %81, i32 1
store float* %82, float** %9
%83 = load float, float* %81
%84 = load float*, float** %11
store float %83, float* %84
%85 = load i16, i16* %6
%86 = zext i16 %85 to i32
%87 = load float*, float** %11
%88 = sext i32 %86 to i64
%89 = getelementptr inbounds float, float* %87, i64 %88
store float* %89, float** %11
%90 = load i16, i16* %12
%91 = add i16 %90, -1
store i16 %91, i16* %12
br label %76
92: ; preds = %76
%93 = load i16, i16* %13
%94 = add i16 %93, 1
store i16 %94, i16* %13
%95 = load i16, i16* %14
%96 = add i16 %95, -1
store i16 %96, i16* %14
br label %97
97: ; preds = %92
%98 = load i16, i16* %14
%99 = zext i16 %98 to i32
%100 = icmp ugt i32 %99, 0
br i1 %100, label %18, label %101
101: ; preds = %97
ret void
}

LLVM IR (-O2):
define void @Maxtrix_Transpose(float* nocapture %0, i16 zeroext %1, i16 zeroext %2, float* nocapture writeonly %3) {
%5 = lshr i16 %2, 2
%6 = icmp ult i16 %2, 4
%7 = and i16 %2, 3
%8 = icmp eq i16 %7, 0
%9 = zext i16 %1 to i64
%10 = and i16 %2, 4
%11 = icmp eq i16 %10, 0
%12 = add nsw i16 %5, -1
%13 = icmp eq i16 %5, 1
%14 = icmp eq i16 %7, 1
%15 = icmp eq i16 %7, 2
br label %16
16: ; preds = %85, %4
%17 = phi i64 [ %87, %85 ], [ 0, %4 ]
%18 = phi float* [ %86, %85 ], [ %0, %4 ]
%19 = phi i16 [ %88, %85 ], [ %1, %4 ]
%20 = getelementptr inbounds float, float* %3, i64 %17
br i1 %6, label %71, label %21
21: ; preds = %16
br i1 %11, label %35, label %22
22: ; preds = %21
%23 = getelementptr inbounds float, float* %18, i64 1
%24 = load float, float* %18
store float %24, float* %20
%25 = getelementptr inbounds float, float* %20, i64 %9
%26 = getelementptr inbounds float, float* %18, i64 2
%27 = load float, float* %23
store float %27, float* %25
%28 = getelementptr inbounds float, float* %25, i64 %9
%29 = getelementptr inbounds float, float* %18, i64 3
%30 = load float, float* %26
store float %30, float* %28
%31 = getelementptr inbounds float, float* %28, i64 %9
%32 = getelementptr inbounds float, float* %18, i64 4
%33 = load float, float* %29
store float %33, float* %31
%34 = getelementptr inbounds float, float* %31, i64 %9
br label %35
35: ; preds = %22, %21
%36 = phi float* [ undef, %21 ], [ %32, %22 ]
%37 = phi float* [ undef, %21 ], [ %34, %22 ]
%38 = phi i16 [ %5, %21 ], [ %12, %22 ]
%39 = phi float* [ %20, %21 ], [ %34, %22 ]
%40 = phi float* [ %18, %21 ], [ %32, %22 ]
br i1 %13, label %71, label %41
41: ; preds = %35, %41
%42 = phi i16 [ %69, %41 ], [ %38, %35 ]
%43 = phi float* [ %68, %41 ], [ %39, %35 ]
%44 = phi float* [ %66, %41 ], [ %40, %35 ]
%45 = getelementptr inbounds float, float* %44, i64 1
%46 = load float, float* %44
store float %46, float* %43
%47 = getelementptr inbounds float, float* %43, i64 %9
%48 = getelementptr inbounds float, float* %44, i64 2
%49 = load float, float* %45
store float %49, float* %47
%50 = getelementptr inbounds float, float* %47, i64 %9
%51 = getelementptr inbounds float, float* %44, i64 3
%52 = load float, float* %48
store float %52, float* %50
%53 = getelementptr inbounds float, float* %50, i64 %9
%54 = getelementptr inbounds float, float* %44, i64 4
%55 = load float, float* %51
store float %55, float* %53
%56 = getelementptr inbounds float, float* %53, i64 %9
%57 = getelementptr inbounds float, float* %44, i64 5
%58 = load float, float* %54
store float %58, float* %56
%59 = getelementptr inbounds float, float* %56, i64 %9
%60 = getelementptr inbounds float, float* %44, i64 6
%61 = load float, float* %57
store float %61, float* %59
%62 = getelementptr inbounds float, float* %59, i64 %9
%63 = getelementptr inbounds float, float* %44, i64 7
%64 = load float, float* %60
store float %64, float* %62
%65 = getelementptr inbounds float, float* %62, i64 %9
%66 = getelementptr inbounds float, float* %44, i64 8
%67 = load float, float* %63
store float %67, float* %65
%68 = getelementptr inbounds float, float* %65, i64 %9
%69 = add nsw i16 %42, -2
%70 = icmp eq i16 %69, 0
br i1 %70, label %71, label %41
71: ; preds = %35, %41, %16
%72 = phi float* [ %18, %16 ], [ %36, %35 ], [ %66, %41 ]
%73 = phi float* [ %20, %16 ], [ %37, %35 ], [ %68, %41 ]
br i1 %8, label %85, label %74
74: ; preds = %71
%75 = getelementptr inbounds float, float* %72, i64 1
%76 = load float, float* %72
store float %76, float* %73
%77 = getelementptr inbounds float, float* %73, i64 %9
br i1 %14, label %85, label %78
78: ; preds = %74
%79 = getelementptr inbounds float, float* %72, i64 2
%80 = load float, float* %75
store float %80, float* %77
br i1 %15, label %85, label %81
81: ; preds = %78
%82 = getelementptr inbounds float, float* %77, i64 %9
%83 = getelementptr inbounds float, float* %72, i64 3
%84 = load float, float* %79
store float %84, float* %82
br label %85
85: ; preds = %74, %78, %81, %71
%86 = phi float* [ %72, %71 ], [ %75, %74 ], [ %79, %78 ], [ %83, %81 ]
%87 = add nuw nsw i64 %17, 1
%88 = add i16 %19, -1
%89 = icmp eq i16 %88, 0
br i1 %89, label %90, label %16
90: ; preds = %85
ret void
}