int diferencia(float *c1, float *c2) {
  int max1 = 0;
  int max2 = 0;
  int dif = 0;
  int i;
  char ch1, ch2;
  for (i = 0; i < 26; i++) {
    if (c1[i] > max1) {
      max1 = c1[i];
      ch1 = (char)i + 97;
    }
    if (c2[i] > max2) {
      max2 = c2[i];
      ch2 = (char)i + 97;
    }
  }
  int max, min;
  if ((int)ch1 > (int)ch2) {
    max = (int)ch1;
    min = (int)ch2;
  } else {
    max = (int)ch2;
    min = (int)ch1;
  }
  dif = max - min;
  return dif;
}


x86 assembly (clang, -O0):
<diferencia>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movl   $0x0,-0x14(%rbp)
movl   $0x0,-0x18(%rbp)
movl   $0x0,-0x1c(%rbp)
movl   $0x0,-0x20(%rbp)
cmpl   $0x1a,-0x20(%rbp)
jge    11b3 <diferencia+0xb3>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtsi2ssl -0x14(%rbp),%xmm1
ucomiss %xmm1,%xmm0
jbe    1169 <diferencia+0x69>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
cvttss2si (%rax,%rcx,4),%eax
mov    %eax,-0x14(%rbp)
mov    -0x20(%rbp),%eax
movsbl %al,%eax
add    $0x61,%eax
mov    %al,-0x21(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
cvtsi2ssl -0x18(%rbp),%xmm1
ucomiss %xmm1,%xmm0
jbe    11a0 <diferencia+0xa0>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
cvttss2si (%rax,%rcx,4),%eax
mov    %eax,-0x18(%rbp)
mov    -0x20(%rbp),%eax
movsbl %al,%eax
add    $0x61,%eax
mov    %al,-0x22(%rbp)
jmp    11a5 <diferencia+0xa5>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    1128 <diferencia+0x28>
movsbl -0x21(%rbp),%eax
movsbl -0x22(%rbp),%ecx
cmp    %ecx,%eax
jle    11d6 <diferencia+0xd6>
movsbl -0x21(%rbp),%eax
mov    %eax,-0x28(%rbp)
movsbl -0x22(%rbp),%eax
mov    %eax,-0x2c(%rbp)
jmp    11e4 <diferencia+0xe4>
movsbl -0x22(%rbp),%eax
mov    %eax,-0x28(%rbp)
movsbl -0x21(%rbp),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x28(%rbp),%eax
sub    -0x2c(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x1c(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<diferencia>:
xorps  %xmm1,%xmm1
xor    %ecx,%ecx
cs nopw 0x0(%rax,%rax,1)
nop
cvtdq2ps %xmm1,%xmm0
movss  (%rdi,%rcx,4),%xmm2
movss  (%rsi,%rcx,4),%xmm3
unpcklps %xmm2,%xmm3
cmpltps %xmm3,%xmm0
pextrw $0x2,%xmm0,%r8d
lea    0x61(%rcx),%r9d
movzbl %dl,%edx
movzbl %r9b,%r9d
test   $0x1,%r8b
cmovne %r9d,%edx
cvttps2dq %xmm3,%xmm2
andps  %xmm0,%xmm2
movd   %xmm0,%r8d
andnps %xmm1,%xmm0
orps   %xmm2,%xmm0
movzbl %al,%eax
test   $0x1,%r8b
cmovne %r9d,%eax
add    $0x1,%rcx
movaps %xmm0,%xmm1
cmp    $0x1a,%rcx
jne    1110 <diferencia+0x10>
cmp    %al,%dl
movzbl %dl,%ecx
movzbl %al,%edx
mov    %edx,%eax
cmovg  %ecx,%eax
movsbl %al,%eax
cmovg  %edx,%ecx
movsbl %cl,%ecx
sub    %ecx,%eax
ret

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

LLVM IR (-O2):
define i32 @diferencia(float* nocapture %0, float* nocapture %1) {
br label %3
3: ; preds = %2, %3
%4 = phi i64 [ 0, %2 ], [ %25, %3 ]
%5 = phi i8 [ undef, %2 ], [ %24, %3 ]
%6 = phi i8 [ undef, %2 ], [ %20, %3 ]
%7 = phi i32 [ 0, %2 ], [ %26, %3 ]
%8 = phi <2 x i32> [ zeroinitializer, %2 ], [ %22, %3 ]
%9 = getelementptr inbounds float, float* %0, i64 %4
%10 = load float, float* %9
%11 = trunc i32 %7 to i8
%12 = add nuw nsw i8 %11, 97
%13 = getelementptr inbounds float, float* %1, i64 %4
%14 = load float, float* %13
%15 = sitofp <2 x i32> %8 to <2 x float>
%16 = insertelement <2 x float> poison, float %14, i64 0
%17 = insertelement <2 x float> %16, float %10, i64 1
%18 = fcmp ogt <2 x float> %17, %15
%19 = extractelement <2 x i1> %18, i64 1
%20 = select i1 %19, i8 %12, i8 %6
%21 = fptosi <2 x float> %17 to <2 x i32>
%22 = select <2 x i1> %18, <2 x i32> %21, <2 x i32> %8
%23 = extractelement <2 x i1> %18, i64 0
%24 = select i1 %23, i8 %12, i8 %5
%25 = add nuw nsw i64 %4, 1
%26 = add nuw nsw i32 %7, 1
%27 = icmp eq i64 %25, 26
br i1 %27, label %28, label %3
28: ; preds = %3
%29 = icmp sgt i8 %20, %24
%30 = select i1 %29, i8 %20, i8 %24
%31 = sext i8 %30 to i32
%32 = select i1 %29, i8 %24, i8 %20
%33 = sext i8 %32 to i32
%34 = sub nsw i32 %31, %33
ret i32 %34
}