int Maxtrix_Sub(float *pSrcA, unsigned short numRows, unsigned short numCols,
                float *pSrcB, float *pDst) {
  float *pIn1 = pSrcA;
  float *pIn2 = pSrcB;
  float *pOut = pDst;
  float inA1, inA2, inB1, inB2, out1, out2;
  unsigned int numSamples;
  unsigned int blkCnt;
  int status;
  numSamples = (unsigned int)numRows * numCols;
  blkCnt = numSamples >> 2u;
  while (blkCnt > 0u) {
    inA1 = pIn1[0];
    inB1 = pIn2[0];
    inA2 = pIn1[1];
    out1 = inA1 - inB1;
    inB2 = pIn2[1];
    inA1 = pIn1[2];
    out2 = inA2 - inB2;
    inB1 = pIn2[2];
    pOut[0] = out1;
    pOut[1] = out2;
    inA2 = pIn1[3];
    inB2 = pIn2[3];
    out1 = inA1 - inB1;
    out2 = inA2 - inB2;
    pOut[2] = out1;
    pOut[3] = out2;
    pIn1 += 4u;
    pIn2 += 4u;
    pOut += 4u;
    blkCnt--;
  }
  blkCnt = numSamples & 0x3u;
  while (blkCnt > 0u) {
    *pOut++ = (*pIn1++) - (*pIn2++);
    blkCnt--;
  }
  status = 0;
  return (status);
}


x86 assembly (clang, -O0):
<Maxtrix_Sub>:
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    %r8,-0x20(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x20(%rbp),%rax
mov    %rax,-0x38(%rbp)
movzwl -0xa(%rbp),%eax
movzwl -0xc(%rbp),%ecx
imul   %ecx,%eax
mov    %eax,-0x54(%rbp)
mov    -0x54(%rbp),%eax
shr    $0x2,%eax
mov    %eax,-0x58(%rbp)
cmpl   $0x0,-0x58(%rbp)
jbe    126a <Maxtrix_Sub+0x16a>
mov    -0x28(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x3c(%rbp)
mov    -0x30(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x44(%rbp)
mov    -0x28(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  %xmm0,-0x40(%rbp)
movss  -0x3c(%rbp),%xmm0
subss  -0x44(%rbp),%xmm0
movss  %xmm0,-0x4c(%rbp)
mov    -0x30(%rbp),%rax
movss  0x4(%rax),%xmm0
movss  %xmm0,-0x48(%rbp)
mov    -0x28(%rbp),%rax
movss  0x8(%rax),%xmm0
movss  %xmm0,-0x3c(%rbp)
movss  -0x40(%rbp),%xmm0
subss  -0x48(%rbp),%xmm0
movss  %xmm0,-0x50(%rbp)
mov    -0x30(%rbp),%rax
movss  0x8(%rax),%xmm0
movss  %xmm0,-0x44(%rbp)
movss  -0x4c(%rbp),%xmm0
mov    -0x38(%rbp),%rax
movss  %xmm0,(%rax)
movss  -0x50(%rbp),%xmm0
mov    -0x38(%rbp),%rax
movss  %xmm0,0x4(%rax)
mov    -0x28(%rbp),%rax
movss  0xc(%rax),%xmm0
movss  %xmm0,-0x40(%rbp)
mov    -0x30(%rbp),%rax
movss  0xc(%rax),%xmm0
movss  %xmm0,-0x48(%rbp)
movss  -0x3c(%rbp),%xmm0
subss  -0x44(%rbp),%xmm0
movss  %xmm0,-0x4c(%rbp)
movss  -0x40(%rbp),%xmm0
subss  -0x48(%rbp),%xmm0
movss  %xmm0,-0x50(%rbp)
movss  -0x4c(%rbp),%xmm0
mov    -0x38(%rbp),%rax
movss  %xmm0,0x8(%rax)
movss  -0x50(%rbp),%xmm0
mov    -0x38(%rbp),%rax
movss  %xmm0,0xc(%rax)
mov    -0x28(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x28(%rbp)
mov    -0x30(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
add    $0x10,%rax
mov    %rax,-0x38(%rbp)
mov    -0x58(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x58(%rbp)
jmp    114d <Maxtrix_Sub+0x4d>
mov    -0x54(%rbp),%eax
and    $0x3,%eax
mov    %eax,-0x58(%rbp)
cmpl   $0x0,-0x58(%rbp)
jbe    12c4 <Maxtrix_Sub+0x1c4>
mov    -0x28(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x28(%rbp)
movss  (%rax),%xmm0
mov    -0x30(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x30(%rbp)
subss  (%rax),%xmm0
mov    -0x38(%rbp),%rax
mov    %rax,%rcx
add    $0x4,%rcx
mov    %rcx,-0x38(%rbp)
movss  %xmm0,(%rax)
mov    -0x58(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x58(%rbp)
jmp    1273 <Maxtrix_Sub+0x173>
movl   $0x0,-0x5c(%rbp)
mov    -0x5c(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<Maxtrix_Sub>:
imul   %edx,%esi
cmp    $0x4,%esi
jb     115e <Maxtrix_Sub+0x5e>
mov    %esi,%eax
shr    $0x2,%eax
nopl   (%rax)
movss  (%rdi),%xmm0
movss  0x4(%rdi),%xmm1
subss  (%rcx),%xmm0
movss  0x8(%rdi),%xmm2
subss  0x4(%rcx),%xmm1
subss  0x8(%rcx),%xmm2
movss  %xmm0,(%r8)
movss  %xmm1,0x4(%r8)
movss  0xc(%rdi),%xmm0
subss  0xc(%rcx),%xmm0
movss  %xmm2,0x8(%r8)
movss  %xmm0,0xc(%r8)
add    $0x10,%rdi
add    $0x10,%rcx
add    $0x10,%r8
add    $0xffffffff,%eax
jne    1110 <Maxtrix_Sub+0x10>
and    $0x3,%esi
je     119a <Maxtrix_Sub+0x9a>
movss  (%rdi),%xmm0
subss  (%rcx),%xmm0
movss  %xmm0,(%r8)
cmp    $0x1,%esi
je     119a <Maxtrix_Sub+0x9a>
movss  0x4(%rdi),%xmm0
subss  0x4(%rcx),%xmm0
movss  %xmm0,0x4(%r8)
cmp    $0x2,%esi
je     119a <Maxtrix_Sub+0x9a>
movss  0x8(%rdi),%xmm0
subss  0x8(%rcx),%xmm0
movss  %xmm0,0x8(%r8)
xor    %eax,%eax
ret

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

LLVM IR (-O2):
define i32 @Maxtrix_Sub(float* nocapture %0, i16 zeroext %1, i16 zeroext %2, float* nocapture %3, float* nocapture writeonly %4) {
%6 = zext i16 %1 to i32
%7 = zext i16 %2 to i32
%8 = mul nuw i32 %7, %6
%9 = icmp ult i32 %8, 4
br i1 %9, label %43, label %10
10: ; preds = %5
%11 = lshr i32 %8, 2
br label %12
12: ; preds = %10, %12
%13 = phi float* [ %38, %12 ], [ %0, %10 ]
%14 = phi i32 [ %41, %12 ], [ %11, %10 ]
%15 = phi float* [ %39, %12 ], [ %3, %10 ]
%16 = phi float* [ %40, %12 ], [ %4, %10 ]
%17 = load float, float* %13
%18 = load float, float* %15
%19 = getelementptr inbounds float, float* %13, i64 1
%20 = load float, float* %19
%21 = fsub float %17, %18
%22 = getelementptr inbounds float, float* %15, i64 1
%23 = load float, float* %22
%24 = getelementptr inbounds float, float* %13, i64 2
%25 = load float, float* %24
%26 = fsub float %20, %23
%27 = getelementptr inbounds float, float* %15, i64 2
%28 = load float, float* %27
store float %21, float* %16
%29 = getelementptr inbounds float, float* %16, i64 1
store float %26, float* %29
%30 = getelementptr inbounds float, float* %13, i64 3
%31 = load float, float* %30
%32 = getelementptr inbounds float, float* %15, i64 3
%33 = load float, float* %32
%34 = fsub float %25, %28
%35 = fsub float %31, %33
%36 = getelementptr inbounds float, float* %16, i64 2
store float %34, float* %36
%37 = getelementptr inbounds float, float* %16, i64 3
store float %35, float* %37
%38 = getelementptr inbounds float, float* %13, i64 4
%39 = getelementptr inbounds float, float* %15, i64 4
%40 = getelementptr inbounds float, float* %16, i64 4
%41 = add i32 %14, -1
%42 = icmp eq i32 %41, 0
br i1 %42, label %43, label %12
43: ; preds = %12, %5
%44 = phi float* [ %4, %5 ], [ %40, %12 ]
%45 = phi float* [ %3, %5 ], [ %39, %12 ]
%46 = phi float* [ %0, %5 ], [ %38, %12 ]
%47 = and i32 %8, 3
%48 = icmp eq i32 %47, 0
br i1 %48, label %69, label %49
49: ; preds = %43
%50 = load float, float* %46
%51 = load float, float* %45
%52 = fsub float %50, %51
store float %52, float* %44
%53 = icmp eq i32 %47, 1
br i1 %53, label %69, label %54
54: ; preds = %49
%55 = getelementptr inbounds float, float* %44, i64 1
%56 = getelementptr inbounds float, float* %45, i64 1
%57 = getelementptr inbounds float, float* %46, i64 1
%58 = load float, float* %57
%59 = load float, float* %56
%60 = fsub float %58, %59
store float %60, float* %55
%61 = icmp eq i32 %47, 2
br i1 %61, label %69, label %62
62: ; preds = %54
%63 = getelementptr inbounds float, float* %44, i64 2
%64 = getelementptr inbounds float, float* %45, i64 2
%65 = getelementptr inbounds float, float* %46, i64 2
%66 = load float, float* %65
%67 = load float, float* %64
%68 = fsub float %66, %67
store float %68, float* %63
br label %69
69: ; preds = %49, %54, %62, %43
ret i32 0
}