void arr_float_max_unmarked_prioritized_count(
    unsigned short int *puStage, float *pValues, unsigned char *pCounts,
    unsigned char *pMarklist, unsigned short int *pPriorityOrder,
    unsigned long int uStages, unsigned long int uStride) {
  float fNextBestValue = 0;
  unsigned short int uNextBestStage = ((unsigned short int)(0 - 1));
  unsigned long int s;
  for (s = uStages - 1; s != ((unsigned long int)(0 - 1)); s--) {
    unsigned short int u16PrioritizedStage = pPriorityOrder[s];
    unsigned char u8 = pCounts[u16PrioritizedStage * uStride];
    if (u8 > 0 &&
        (pMarklist[u16PrioritizedStage] != ((unsigned char)(0 - 1)))) {
      float v = pValues[u16PrioritizedStage * uStride] / u8;
      if (v > fNextBestValue) {
        fNextBestValue = v;
        uNextBestStage = u16PrioritizedStage;
      }
    }
  }
  if (uNextBestStage != ((unsigned short int)(0 - 1))) {
    *puStage = uNextBestStage;
  }
}


x86 assembly (clang, -O0):
<arr_float_max_unmarked_prioritized_count>:
push   %rbp
mov    %rsp,%rbp
mov    0x10(%rbp),%rax
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    %r8,-0x28(%rbp)
mov    %r9,-0x30(%rbp)
xorps  %xmm0,%xmm0
movss  %xmm0,-0x34(%rbp)
movw   $0xffff,-0x36(%rbp)
mov    -0x30(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x40(%rbp)
cmpq   $0xffffffffffffffff,-0x40(%rbp)
je     11eb <arr_float_max_unmarked_prioritized_count+0xeb>
mov    -0x28(%rbp),%rax
mov    -0x40(%rbp),%rcx
mov    (%rax,%rcx,2),%ax
mov    %ax,-0x42(%rbp)
mov    -0x18(%rbp),%rax
movzwl -0x42(%rbp),%ecx
imul   0x10(%rbp),%rcx
mov    (%rax,%rcx,1),%al
mov    %al,-0x43(%rbp)
movzbl -0x43(%rbp),%eax
cmp    $0x0,%eax
jle    11d5 <arr_float_max_unmarked_prioritized_count+0xd5>
mov    -0x20(%rbp),%rax
movzwl -0x42(%rbp),%ecx
movzbl (%rax,%rcx,1),%eax
cmp    $0xff,%eax
je     11d5 <arr_float_max_unmarked_prioritized_count+0xd5>
mov    -0x10(%rbp),%rax
movzwl -0x42(%rbp),%ecx
imul   0x10(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movzbl -0x43(%rbp),%eax
cvtsi2ss %eax,%xmm1
divss  %xmm1,%xmm0
movss  %xmm0,-0x48(%rbp)
movss  -0x48(%rbp),%xmm0
ucomiss -0x34(%rbp),%xmm0
jbe    11d0 <arr_float_max_unmarked_prioritized_count+0xd0>
movss  -0x48(%rbp),%xmm0
movss  %xmm0,-0x34(%rbp)
mov    -0x42(%rbp),%ax
mov    %ax,-0x36(%rbp)
jmp    11d5 <arr_float_max_unmarked_prioritized_count+0xd5>
jmp    11da <arr_float_max_unmarked_prioritized_count+0xda>
mov    -0x40(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x40(%rbp)
jmp    113a <arr_float_max_unmarked_prioritized_count+0x3a>
movzwl -0x36(%rbp),%eax
cmp    $0xffff,%eax
je     1205 <arr_float_max_unmarked_prioritized_count+0x105>
mov    -0x36(%rbp),%cx
mov    -0x8(%rbp),%rax
mov    %cx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<arr_float_max_unmarked_prioritized_count>:
push   %rbp
push   %rbx
test   %r9,%r9
je     1177 <arr_float_max_unmarked_prioritized_count+0x77>
mov    0x18(%rsp),%r10
mov    $0xffff,%r11w
xorps  %xmm0,%xmm0
jmp    1125 <arr_float_max_unmarked_prioritized_count+0x25>
cs nopw 0x0(%rax,%rax,1)
test   %r9,%r9
je     116c <arr_float_max_unmarked_prioritized_count+0x6c>
movzwl -0x2(%r8,%r9,2),%eax
add    $0xffffffffffffffff,%r9
mov    %rax,%rbx
imul   %r10,%rbx
movzbl (%rdx,%rbx,1),%ebp
test   %bpl,%bpl
je     1120 <arr_float_max_unmarked_prioritized_count+0x20>
cmpb   $0xff,(%rcx,%rax,1)
je     1120 <arr_float_max_unmarked_prioritized_count+0x20>
movzbl %bpl,%ebp
xorps  %xmm1,%xmm1
cvtsi2ss %ebp,%xmm1
movss  (%rsi,%rbx,4),%xmm2
divss  %xmm1,%xmm2
ucomiss %xmm0,%xmm2
cmovbe %r11d,%eax
maxss  %xmm0,%xmm2
mov    %eax,%r11d
movaps %xmm2,%xmm0
jmp    1120 <arr_float_max_unmarked_prioritized_count+0x20>
cmp    $0xffff,%r11w
je     1177 <arr_float_max_unmarked_prioritized_count+0x77>
mov    %r11w,(%rdi)
pop    %rbx
pop    %rbp
ret

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

LLVM IR (-O2):
define void @arr_float_max_unmarked_prioritized_count(i16* nocapture writeonly %0, float* nocapture %1, i8* nocapture %2, i8* nocapture %3, i16* nocapture %4, i64 %5, i64 %6) {
%8 = icmp eq i64 %5, 0
br i1 %8, label %40, label %9
9: ; preds = %7, %33
%10 = phi i64 [ %13, %33 ], [ %5, %7 ]
%11 = phi float [ %35, %33 ], [ 0.000000e+00, %7 ]
%12 = phi i16 [ %34, %33 ], [ -1, %7 ]
%13 = add i64 %10, -1
%14 = getelementptr inbounds i16, i16* %4, i64 %13
%15 = load i16, i16* %14
%16 = zext i16 %15 to i64
%17 = mul i64 %16, %6
%18 = getelementptr inbounds i8, i8* %2, i64 %17
%19 = load i8, i8* %18
%20 = icmp eq i8 %19, 0
br i1 %20, label %33, label %21
21: ; preds = %9
%22 = getelementptr inbounds i8, i8* %3, i64 %16
%23 = load i8, i8* %22
%24 = icmp eq i8 %23, -1
br i1 %24, label %33, label %25
25: ; preds = %21
%26 = getelementptr inbounds float, float* %1, i64 %17
%27 = load float, float* %26
%28 = uitofp i8 %19 to float
%29 = fdiv float %27, %28
%30 = fcmp ogt float %29, %11
%31 = select i1 %30, i16 %15, i16 %12
%32 = select i1 %30, float %29, float %11
br label %33
33: ; preds = %25, %21, %9
%34 = phi i16 [ %31, %25 ], [ %12, %21 ], [ %12, %9 ]
%35 = phi float [ %32, %25 ], [ %11, %21 ], [ %11, %9 ]
%36 = icmp eq i64 %13, 0
br i1 %36, label %37, label %9
37: ; preds = %33
%38 = icmp eq i16 %34, -1
br i1 %38, label %40, label %39
39: ; preds = %37
store i16 %34, i16* %0
br label %40
40: ; preds = %7, %39, %37
ret void
}