unsigned char MaxArg(double *val, unsigned char n) {
  double maximum;
  unsigned char i, index;
  maximum = val[0];
  index = 1;
  for (i = 1; i < n; i++) {
    if (val[i] > maximum) {
      index = i + 1;
      maximum = val[i];
    }
  }
  return (index);
}


x86 assembly (clang, -O0):
<MaxArg>:
push   %rbp
mov    %rsp,%rbp
mov    %sil,%al
mov    %rdi,-0x8(%rbp)
mov    %al,-0x9(%rbp)
mov    -0x8(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x18(%rbp)
movb   $0x1,-0x1a(%rbp)
movb   $0x1,-0x19(%rbp)
movzbl -0x19(%rbp),%eax
movzbl -0x9(%rbp),%ecx
cmp    %ecx,%eax
jge    1179 <MaxArg+0x79>
mov    -0x8(%rbp),%rax
movzbl -0x19(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x18(%rbp),%xmm0
jbe    1167 <MaxArg+0x67>
movzbl -0x19(%rbp),%eax
add    $0x1,%eax
mov    %al,-0x1a(%rbp)
mov    -0x8(%rbp),%rax
movzbl -0x19(%rbp),%ecx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x18(%rbp)
jmp    116c <MaxArg+0x6c>
mov    -0x19(%rbp),%al
add    $0x1,%al
mov    %al,-0x19(%rbp)
jmp    1123 <MaxArg+0x23>
movzbl -0x1a(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<MaxArg>:
mov    $0x1,%al
cmp    $0x2,%sil
jb     11f3 <MaxArg+0xf3>
movsd  (%rdi),%xmm0
movzbl %sil,%eax
lea    -0x1(%rax),%r9
add    $0xfffffffffffffffe,%rax
mov    %r9d,%r8d
and    $0x3,%r8d
cmp    $0x3,%rax
jae    113e <MaxArg+0x3e>
mov    $0x1,%al
mov    $0x1,%esi
test   %r8,%r8
jne    11bd <MaxArg+0xbd>
jmp    11f3 <MaxArg+0xf3>
and    $0xfffffffffffffffc,%r9
mov    $0x1,%al
xor    %esi,%esi
cs nopw 0x0(%rax,%rax,1)
lea    0x2(%rsi),%ecx
movsd  0x8(%rdi,%rsi,8),%xmm1
movsd  0x10(%rdi,%rsi,8),%xmm2
ucomisd %xmm0,%xmm1
movzbl %al,%eax
movzbl %cl,%ecx
cmovbe %eax,%ecx
maxsd  %xmm0,%xmm1
lea    0x3(%rsi),%eax
ucomisd %xmm1,%xmm2
movzbl %al,%eax
cmovbe %ecx,%eax
maxsd  %xmm1,%xmm2
movsd  0x18(%rdi,%rsi,8),%xmm1
movsd  0x20(%rdi,%rsi,8),%xmm0
lea    0x5(%rsi),%ecx
add    $0x4,%rsi
ucomisd %xmm2,%xmm1
maxsd  %xmm2,%xmm1
mov    %esi,%edx
cmovbe %eax,%edx
ucomisd %xmm1,%xmm0
maxsd  %xmm1,%xmm0
movzbl %cl,%eax
cmovbe %edx,%eax
cmp    %rsi,%r9
jne    1150 <MaxArg+0x50>
add    $0x1,%rsi
test   %r8,%r8
je     11f3 <MaxArg+0xf3>
lea    0x1(%rsi),%ecx
movzbl %cl,%edx
lea    (%rdi,%rsi,8),%rsi
xor    %edi,%edi
nopl   0x0(%rax)
movsd  (%rsi,%rdi,8),%xmm1
lea    (%rdx,%rdi,1),%ecx
ucomisd %xmm0,%xmm1
movzbl %al,%eax
cmova  %ecx,%eax
maxsd  %xmm0,%xmm1
add    $0x1,%rdi
movapd %xmm1,%xmm0
cmp    %rdi,%r8
jne    11d0 <MaxArg+0xd0>
ret

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

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