void arr_float_max_unmarked_prioritized(float *pf, unsigned long int *pu,
                                        float *pValues,
                                        unsigned long int *pMarklist,
                                        unsigned long int *pPriorityOrder,
                                        unsigned long int uStages,
                                        unsigned long int uStride) {
  float fNextBestValue = 0;
  unsigned long int uNextBestStage = (0 - 1);
  for (unsigned long int s = uStages - 1; s != (0 - 1); s--) {
    unsigned long int uPrioritizedStage = pPriorityOrder[s];
    float v = pValues[uPrioritizedStage * uStride];
    if (v > fNextBestValue && (pMarklist[uPrioritizedStage] != (0 - 1))) {
      fNextBestValue = v;
      uNextBestStage = uPrioritizedStage;
    }
  }
  *pf = fNextBestValue;
  *pu = uNextBestStage;
}


x86 assembly (clang, -O0):
<arr_float_max_unmarked_prioritized>:
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)
movq   $0xffffffffffffffff,-0x40(%rbp)
ff
mov    -0x30(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x48(%rbp)
cmpq   $0xffffffffffffffff,-0x48(%rbp)
je     11b8 <arr_float_max_unmarked_prioritized+0xb8>
mov    -0x28(%rbp),%rax
mov    -0x48(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x50(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x50(%rbp),%rcx
imul   0x10(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x54(%rbp)
movss  -0x54(%rbp),%xmm0
ucomiss -0x34(%rbp),%xmm0
jbe    11a2 <arr_float_max_unmarked_prioritized+0xa2>
mov    -0x20(%rbp),%rax
mov    -0x50(%rbp),%rcx
cmpq   $0xffffffffffffffff,(%rax,%rcx,8)
je     11a2 <arr_float_max_unmarked_prioritized+0xa2>
movss  -0x54(%rbp),%xmm0
movss  %xmm0,-0x34(%rbp)
mov    -0x50(%rbp),%rax
mov    %rax,-0x40(%rbp)
jmp    11a7 <arr_float_max_unmarked_prioritized+0xa7>
mov    -0x48(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x48(%rbp)
jmp    113c <arr_float_max_unmarked_prioritized+0x3c>
movss  -0x34(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
mov    -0x40(%rbp),%rcx
mov    -0x10(%rbp),%rax
mov    %rcx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<arr_float_max_unmarked_prioritized>:
push   %r15
push   %r14
push   %rbx
test   %r9,%r9
je     114c <arr_float_max_unmarked_prioritized+0x4c>
mov    0x20(%rsp),%r11
cmp    $0x1,%r9
jne    1163 <arr_float_max_unmarked_prioritized+0x63>
mov    $0xffffffffffffffff,%r10
xorps  %xmm0,%xmm0
mov    %r9,%r15
test   $0x1,%r9b
je     1156 <arr_float_max_unmarked_prioritized+0x56>
mov    -0x8(%r8,%r15,8),%rax
imul   %rax,%r11
movss  (%rdx,%r11,4),%xmm1
ucomiss %xmm0,%xmm1
jbe    1156 <arr_float_max_unmarked_prioritized+0x56>
cmpq   $0xffffffffffffffff,(%rcx,%rax,8)
cmovne %rax,%r10
je     1156 <arr_float_max_unmarked_prioritized+0x56>
movaps %xmm1,%xmm0
jmp    1156 <arr_float_max_unmarked_prioritized+0x56>
xorps  %xmm0,%xmm0
mov    $0xffffffffffffffff,%r10
movss  %xmm0,(%rdi)
mov    %r10,(%rsi)
pop    %rbx
pop    %r14
pop    %r15
ret
mov    %r9,%r14
and    $0xfffffffffffffffe,%r14
mov    $0xffffffffffffffff,%r10
xorps  %xmm0,%xmm0
mov    %r9,%r15
jmp    118a <arr_float_max_unmarked_prioritized+0x8a>
nopl   0x0(%rax)
add    $0xfffffffffffffffe,%r15
add    $0xfffffffffffffffe,%r14
je     1122 <arr_float_max_unmarked_prioritized+0x22>
mov    -0x8(%r8,%r15,8),%rax
mov    %rax,%rbx
imul   %r11,%rbx
movss  (%rdx,%rbx,4),%xmm1
ucomiss %xmm0,%xmm1
jbe    11ae <arr_float_max_unmarked_prioritized+0xae>
cmpq   $0xffffffffffffffff,(%rcx,%rax,8)
cmovne %rax,%r10
je     11ae <arr_float_max_unmarked_prioritized+0xae>
movaps %xmm1,%xmm0
mov    -0x10(%r8,%r15,8),%rbx
mov    %rbx,%rax
imul   %r11,%rax
movss  (%rdx,%rax,4),%xmm1
ucomiss %xmm0,%xmm1
jbe    1180 <arr_float_max_unmarked_prioritized+0x80>
cmpq   $0xffffffffffffffff,(%rcx,%rbx,8)
cmovne %rbx,%r10
je     1180 <arr_float_max_unmarked_prioritized+0x80>
movaps %xmm1,%xmm0
jmp    1180 <arr_float_max_unmarked_prioritized+0x80>

LLVM IR (-O0):
define void @arr_float_max_unmarked_prioritized(float* %0, i64* %1, float* %2, i64* %3, i64* %4, i64 %5, i64 %6) {
%8 = alloca float*
%9 = alloca i64*
%10 = alloca float*
%11 = alloca i64*
%12 = alloca i64*
%13 = alloca i64
%14 = alloca i64
%15 = alloca float
%16 = alloca i64
%17 = alloca i64
%18 = alloca i64
%19 = alloca float
store float* %0, float** %8
store i64* %1, i64** %9
store float* %2, float** %10
store i64* %3, i64** %11
store i64* %4, i64** %12
store i64 %5, i64* %13
store i64 %6, i64* %14
store float 0.000000e+00, float* %15
store i64 -1, i64* %16
%20 = load i64, i64* %13
%21 = sub i64 %20, 1
store i64 %21, i64* %17
br label %22
22: ; preds = %49, %7
%23 = load i64, i64* %17
%24 = icmp ne i64 %23, -1
br i1 %24, label %25, label %52
25: ; preds = %22
%26 = load i64*, i64** %12
%27 = load i64, i64* %17
%28 = getelementptr inbounds i64, i64* %26, i64 %27
%29 = load i64, i64* %28
store i64 %29, i64* %18
%30 = load float*, float** %10
%31 = load i64, i64* %18
%32 = load i64, i64* %14
%33 = mul i64 %31, %32
%34 = getelementptr inbounds float, float* %30, i64 %33
%35 = load float, float* %34
store float %35, float* %19
%36 = load float, float* %19
%37 = load float, float* %15
%38 = fcmp ogt float %36, %37
br i1 %38, label %39, label %48
39: ; preds = %25
%40 = load i64*, i64** %11
%41 = load i64, i64* %18
%42 = getelementptr inbounds i64, i64* %40, i64 %41
%43 = load i64, i64* %42
%44 = icmp ne i64 %43, -1
br i1 %44, label %45, label %48
45: ; preds = %39
%46 = load float, float* %19
store float %46, float* %15
%47 = load i64, i64* %18
store i64 %47, i64* %16
br label %48
48: ; preds = %45, %39, %25
br label %49
49: ; preds = %48
%50 = load i64, i64* %17
%51 = add i64 %50, -1
store i64 %51, i64* %17
br label %22
52: ; preds = %22
%53 = load float, float* %15
%54 = load float*, float** %8
store float %53, float* %54
%55 = load i64, i64* %16
%56 = load i64*, i64** %9
store i64 %55, i64* %56
ret void
}

LLVM IR (-O2):
define void @arr_float_max_unmarked_prioritized(float* nocapture writeonly %0, i64* nocapture writeonly %1, float* nocapture %2, i64* nocapture %3, i64* nocapture %4, i64 %5, i64 %6) {
%8 = icmp eq i64 %5, 0
br i1 %8, label %35, label %9
9: ; preds = %7
%10 = and i64 %5, 1
%11 = icmp eq i64 %5, 1
br i1 %11, label %14, label %12
12: ; preds = %9
%13 = and i64 %5, -2
br label %38
14: ; preds = %72, %9
%15 = phi i64 [ undef, %9 ], [ %73, %72 ]
%16 = phi float [ undef, %9 ], [ %74, %72 ]
%17 = phi i64 [ %5, %9 ], [ %59, %72 ]
%18 = phi float [ 0.000000e+00, %9 ], [ %74, %72 ]
%19 = phi i64 [ -1, %9 ], [ %73, %72 ]
%20 = icmp eq i64 %10, 0
br i1 %20, label %35, label %21
21: ; preds = %14
%22 = add i64 %17, -1
%23 = getelementptr inbounds i64, i64* %4, i64 %22
%24 = load i64, i64* %23
%25 = mul i64 %24, %6
%26 = getelementptr inbounds float, float* %2, i64 %25
%27 = load float, float* %26
%28 = fcmp ogt float %27, %18
br i1 %28, label %29, label %35
29: ; preds = %21
%30 = getelementptr inbounds i64, i64* %3, i64 %24
%31 = load i64, i64* %30
%32 = icmp eq i64 %31, -1
%33 = select i1 %32, i64 %19, i64 %24
%34 = select i1 %32, float %18, float %27
br label %35
35: ; preds = %14, %29, %21, %7
%36 = phi i64 [ -1, %7 ], [ %15, %14 ], [ %19, %21 ], [ %33, %29 ]
%37 = phi float [ 0.000000e+00, %7 ], [ %16, %14 ], [ %18, %21 ], [ %34, %29 ]
store float %37, float* %0
store i64 %36, i64* %1
ret void
38: ; preds = %72, %12
%39 = phi i64 [ %5, %12 ], [ %59, %72 ]
%40 = phi float [ 0.000000e+00, %12 ], [ %74, %72 ]
%41 = phi i64 [ -1, %12 ], [ %73, %72 ]
%42 = phi i64 [ 0, %12 ], [ %75, %72 ]
%43 = add i64 %39, -1
%44 = getelementptr inbounds i64, i64* %4, i64 %43
%45 = load i64, i64* %44
%46 = mul i64 %45, %6
%47 = getelementptr inbounds float, float* %2, i64 %46
%48 = load float, float* %47
%49 = fcmp ogt float %48, %40
br i1 %49, label %50, label %56
50: ; preds = %38
%51 = getelementptr inbounds i64, i64* %3, i64 %45
%52 = load i64, i64* %51
%53 = icmp eq i64 %52, -1
%54 = select i1 %53, i64 %41, i64 %45
%55 = select i1 %53, float %40, float %48
br label %56
56: ; preds = %50, %38
%57 = phi i64 [ %41, %38 ], [ %54, %50 ]
%58 = phi float [ %40, %38 ], [ %55, %50 ]
%59 = add i64 %39, -2
%60 = getelementptr inbounds i64, i64* %4, i64 %59
%61 = load i64, i64* %60
%62 = mul i64 %61, %6
%63 = getelementptr inbounds float, float* %2, i64 %62
%64 = load float, float* %63
%65 = fcmp ogt float %64, %58
br i1 %65, label %66, label %72
66: ; preds = %56
%67 = getelementptr inbounds i64, i64* %3, i64 %61
%68 = load i64, i64* %67
%69 = icmp eq i64 %68, -1
%70 = select i1 %69, i64 %57, i64 %61
%71 = select i1 %69, float %58, float %64
br label %72
72: ; preds = %66, %56
%73 = phi i64 [ %57, %56 ], [ %70, %66 ]
%74 = phi float [ %58, %56 ], [ %71, %66 ]
%75 = add i64 %42, 2
%76 = icmp eq i64 %75, %13
br i1 %76, label %14, label %38
}