void sort_sq(float *xq, int *strchr, float x, const float *cb, int cb_size) {
  int i;
  if (x <= cb[0]) {
    *strchr = 0;
    *xq = cb[0];
  } else {
    i = 0;
    while ((x > cb[i]) && i < cb_size - 1) {
      i++;
    }
    if (x > ((cb[i] + cb[i - 1]) / 2)) {
      *strchr = i;
      *xq = cb[i];
    } else {
      *strchr = i - 1;
      *xq = cb[i - 1];
    }
  }
}


x86 assembly (clang, -O0):
<sort_sq>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
movss  %xmm0,-0x14(%rbp)
mov    %rdx,-0x20(%rbp)
mov    %ecx,-0x24(%rbp)
movss  -0x14(%rbp),%xmm1
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
ucomiss %xmm1,%xmm0
jb     114d <sort_sq+0x4d>
mov    -0x10(%rbp),%rax
movl   $0x0,(%rax)
mov    -0x20(%rbp),%rax
movss  (%rax),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
jmp    1226 <sort_sq+0x126>
movl   $0x0,-0x28(%rbp)
movss  -0x14(%rbp),%xmm0
mov    -0x20(%rbp),%rcx
movslq -0x28(%rbp),%rdx
xor    %eax,%eax
ucomiss (%rcx,%rdx,4),%xmm0
mov    %al,-0x29(%rbp)
jbe    1181 <sort_sq+0x81>
mov    -0x28(%rbp),%eax
mov    -0x24(%rbp),%ecx
sub    $0x1,%ecx
cmp    %ecx,%eax
setl   %al
mov    %al,-0x29(%rbp)
mov    -0x29(%rbp),%al
test   $0x1,%al
jne    1191 <sort_sq+0x91>
jmp    119f <sort_sq+0x9f>
mov    -0x28(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x28(%rbp)
jmp    1154 <sort_sq+0x54>
movss  -0x14(%rbp),%xmm0
mov    -0x20(%rbp),%rax
movslq -0x28(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm1
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
addss  (%rax,%rcx,4),%xmm1
movss  0xe35(%rip),%xmm2
divss  %xmm2,%xmm1
ucomiss %xmm1,%xmm0
jbe    11fb <sort_sq+0xfb>
mov    -0x28(%rbp),%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x20(%rbp),%rax
movslq -0x28(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
jmp    1221 <sort_sq+0x121>
mov    -0x28(%rbp),%ecx
sub    $0x1,%ecx
mov    -0x10(%rbp),%rax
mov    %ecx,(%rax)
mov    -0x20(%rbp),%rax
mov    -0x28(%rbp),%ecx
sub    $0x1,%ecx
movslq %ecx,%rcx
movss  (%rax,%rcx,4),%xmm0
mov    -0x8(%rbp),%rax
movss  %xmm0,(%rax)
jmp    1226 <sort_sq+0x126>
pop    %rbp
ret

x86 assembly (clang, -O2):
<sort_sq>:
movss  (%rdx),%xmm1
xor    %r8d,%r8d
ucomiss %xmm0,%xmm1
jae    1173 <sort_sq+0x73>
xor    %r9d,%r9d
ucomiss %xmm1,%xmm0
jbe    114a <sort_sq+0x4a>
cmp    $0x2,%ecx
jl     114a <sort_sq+0x4a>
add    $0xffffffff,%ecx
movslq %ecx,%rcx
mov    $0x1,%eax
cs nopw 0x0(%rax,%rax,1)
xchg   %ax,%ax
movss  (%rdx,%rax,4),%xmm1
lea    0x1(%rax),%r9
ucomiss %xmm1,%xmm0
jbe    1146 <sort_sq+0x46>
cmp    %rcx,%rax
mov    %r9,%rax
jl     1130 <sort_sq+0x30>
add    $0xffffffffffffffff,%r9
movslq %r9d,%r8
add    $0xffffffff,%r9d
movss  -0x4(%rdx,%r8,4),%xmm2
movaps %xmm1,%xmm3
addss  %xmm2,%xmm3
mulss  0xe99(%rip),%xmm3
ucomiss %xmm3,%xmm0
cmovbe %r9d,%r8d
ja     1173 <sort_sq+0x73>
movaps %xmm2,%xmm1
mov    %r8d,(%rsi)
movss  %xmm1,(%rdi)
ret

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

LLVM IR (-O2):
define void @sort_sq(float* nocapture writeonly %0, i32* nocapture writeonly %1, float %2, float* nocapture %3, i32 %4) {
%6 = load float, float* %3
%7 = fcmp ult float %6, %2
br i1 %7, label %8, label %35
8: ; preds = %5
%9 = add nsw i32 %4, -1
%10 = sext i32 %9 to i64
%11 = fcmp olt float %6, %2
%12 = icmp sgt i32 %4, 1
%13 = and i1 %11, %12
br i1 %13, label %14, label %22
14: ; preds = %8, %14
%15 = phi i64 [ %21, %14 ], [ 1, %8 ]
%16 = getelementptr inbounds float, float* %3, i64 %15
%17 = load float, float* %16
%18 = fcmp olt float %17, %2
%19 = icmp slt i64 %15, %10
%20 = select i1 %18, i1 %19, i1 false
%21 = add nuw nsw i64 %15, 1
br i1 %20, label %14, label %22
22: ; preds = %14, %8
%23 = phi float [ %6, %8 ], [ %17, %14 ]
%24 = phi i64 [ 0, %8 ], [ %15, %14 ]
%25 = trunc i64 %24 to i32
%26 = add nsw i32 %25, -1
%27 = sext i32 %26 to i64
%28 = getelementptr inbounds float, float* %3, i64 %27
%29 = load float, float* %28
%30 = fadd float %23, %29
%31 = fmul float %30, 5.000000e-01
%32 = fcmp olt float %31, %2
%33 = select i1 %32, i32 %25, i32 %26
%34 = select i1 %32, float %23, float %29
br label %35
35: ; preds = %22, %5
%36 = phi i32 [ 0, %5 ], [ %33, %22 ]
%37 = phi float [ %6, %5 ], [ %34, %22 ]
store i32 %36, i32* %1
store float %37, float* %0
ret void
}