void arr_float_count_nonzeropos(float *pCount, float *pSrc,
                                unsigned long int num,
                                unsigned long int stride) {
  float fTol = 1e-10;
  unsigned long int i;
  for (i = 0; i < num; i++) {
    *pCount += (pSrc[i * stride] < fTol) ? 1 : 0;
  }
}


x86 assembly (clang, -O0):
<arr_float_count_nonzeropos>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
movss  0xee4(%rip),%xmm0
movss  %xmm0,-0x24(%rbp)
movq   $0x0,-0x30(%rbp)
mov    -0x30(%rbp),%rax
cmp    -0x18(%rbp),%rax
jae    117c <arr_float_count_nonzeropos+0x7c>
mov    -0x10(%rbp),%rax
mov    -0x30(%rbp),%rcx
imul   -0x20(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
movss  -0x24(%rbp),%xmm0
xor    %eax,%eax
mov    $0x1,%ecx
ucomiss %xmm1,%xmm0
cmova  %ecx,%eax
cvtsi2ss %eax,%xmm0
mov    -0x8(%rbp),%rax
addss  (%rax),%xmm0
movss  %xmm0,(%rax)
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    1129 <arr_float_count_nonzeropos+0x29>
pop    %rbp
ret

x86 assembly (clang, -O2):
<arr_float_count_nonzeropos>:
test   %rdx,%rdx
je     11a0 <arr_float_count_nonzeropos+0xa0>
movss  (%rdi),%xmm0
cmp    $0x1,%rdx
jne    1118 <arr_float_count_nonzeropos+0x18>
xor    %r10d,%r10d
jmp    1175 <arr_float_count_nonzeropos+0x75>
mov    %rdx,%r8
and    $0xfffffffffffffffe,%r8
lea    0x0(,%rcx,8),%r9
xor    %r10d,%r10d
movss  0xece(%rip),%xmm1
movss  0xeca(%rip),%xmm2
mov    %rsi,%rax
nopl   (%rax)
movss  (%rax),%xmm3
cmpltss %xmm1,%xmm3
andps  %xmm2,%xmm3
addss  %xmm0,%xmm3
movss  %xmm3,(%rdi)
movss  (%rax,%rcx,4),%xmm0
cmpltss %xmm1,%xmm0
andps  %xmm2,%xmm0
addss  %xmm3,%xmm0
movss  %xmm0,(%rdi)
add    $0x2,%r10
add    %r9,%rax
cmp    %r10,%r8
jne    1140 <arr_float_count_nonzeropos+0x40>
test   $0x1,%dl
je     11a0 <arr_float_count_nonzeropos+0xa0>
imul   %rcx,%r10
movss  (%rsi,%r10,4),%xmm1
cmpltss 0xe73(%rip),%xmm1
movss  0xe6f(%rip),%xmm2
andps  %xmm1,%xmm2
addss  %xmm2,%xmm0
movss  %xmm0,(%rdi)
ret

LLVM IR (-O0):
define void @arr_float_count_nonzeropos(float* %0, float* %1, i64 %2, i64 %3) {
%5 = alloca float*
%6 = alloca float*
%7 = alloca i64
%8 = alloca i64
%9 = alloca float
%10 = alloca i64
store float* %0, float** %5
store float* %1, float** %6
store i64 %2, i64* %7
store i64 %3, i64* %8
store float 0x3DDB7CDFE0000000, float* %9
store i64 0, i64* %10
br label %11
11: ; preds = %30, %4
%12 = load i64, i64* %10
%13 = load i64, i64* %7
%14 = icmp ult i64 %12, %13
br i1 %14, label %15, label %33
15: ; preds = %11
%16 = load float*, float** %6
%17 = load i64, i64* %10
%18 = load i64, i64* %8
%19 = mul i64 %17, %18
%20 = getelementptr inbounds float, float* %16, i64 %19
%21 = load float, float* %20
%22 = load float, float* %9
%23 = fcmp olt float %21, %22
%24 = zext i1 %23 to i64
%25 = select i1 %23, i32 1, i32 0
%26 = sitofp i32 %25 to float
%27 = load float*, float** %5
%28 = load float, float* %27
%29 = fadd float %28, %26
store float %29, float* %27
br label %30
30: ; preds = %15
%31 = load i64, i64* %10
%32 = add i64 %31, 1
store i64 %32, i64* %10
br label %11
33: ; preds = %11
ret void
}

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