void arr_float_max_nostride(unsigned short int *puIndex, float *pFloat,
                            unsigned long int count) {
  float fMaxValue = pFloat[0];
  unsigned short int uIndex = 0;
  unsigned short int i;
  for (i = 1; i < count; i++) {
    float v = pFloat[i];
    if (v > fMaxValue) {
      uIndex = i;
      fMaxValue = v;
    }
  }
  *puIndex = uIndex;
}


x86 assembly (clang, -O0):
<arr_float_max_nostride>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movss  (%rax),%xmm0
movss  %xmm0,-0x1c(%rbp)
movw   $0x0,-0x1e(%rbp)
movw   $0x1,-0x20(%rbp)
movzwl -0x20(%rbp),%eax
cmp    -0x18(%rbp),%rax
jae    1180 <arr_float_max_nostride+0x80>
mov    -0x10(%rbp),%rax
movzwl -0x20(%rbp),%ecx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x24(%rbp)
movss  -0x24(%rbp),%xmm0
ucomiss -0x1c(%rbp),%xmm0
jbe    116a <arr_float_max_nostride+0x6a>
mov    -0x20(%rbp),%ax
mov    %ax,-0x1e(%rbp)
movss  -0x24(%rbp),%xmm0
movss  %xmm0,-0x1c(%rbp)
jmp    116f <arr_float_max_nostride+0x6f>
mov    -0x20(%rbp),%ax
add    $0x1,%ax
mov    %ax,-0x20(%rbp)
jmp    1129 <arr_float_max_nostride+0x29>
mov    -0x1e(%rbp),%cx
mov    -0x8(%rbp),%rax
mov    %cx,(%rax)
pop    %rbp
ret

x86 assembly (clang, -O2):
<arr_float_max_nostride>:
cmp    $0x2,%rdx
jb     1141 <arr_float_max_nostride+0x41>
movss  (%rsi),%xmm0
mov    $0x1,%ecx
xor    %eax,%eax
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movss  (%rsi,%rcx,4),%xmm1
ucomiss %xmm0,%xmm1
cmova  %ecx,%eax
maxss  %xmm0,%xmm1
add    $0x1,%ecx
movzwl %cx,%ecx
movaps %xmm1,%xmm0
cmp    %rdx,%rcx
jb     1120 <arr_float_max_nostride+0x20>
mov    %ax,(%rdi)
ret
xor    %eax,%eax
mov    %ax,(%rdi)
ret

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

LLVM IR (-O2):
define void @arr_float_max_nostride(i16* nocapture writeonly %0, float* nocapture %1, i64 %2) {
%4 = icmp ugt i64 %2, 1
br i1 %4, label %5, label %20
5: ; preds = %3
%6 = load float, float* %1
br label %7
7: ; preds = %5, %7
%8 = phi i64 [ %18, %7 ], [ 1, %5 ]
%9 = phi float [ %16, %7 ], [ %6, %5 ]
%10 = phi i16 [ %15, %7 ], [ 0, %5 ]
%11 = trunc i64 %8 to i16
%12 = getelementptr inbounds float, float* %1, i64 %8
%13 = load float, float* %12
%14 = fcmp ogt float %13, %9
%15 = select i1 %14, i16 %11, i16 %10
%16 = select i1 %14, float %13, float %9
%17 = add nuw nsw i64 %8, 1
%18 = and i64 %17, 65535
%19 = icmp ult i64 %18, %2
br i1 %19, label %7, label %20
20: ; preds = %7, %3
%21 = phi i16 [ 0, %3 ], [ %15, %7 ]
store i16 %21, i16* %0
ret void
}