void insert_position(int pl[5], float val[5], int i, int p, float v) {
  if (i >= 5)
    return;
  if (pl[i] == 0) {
    pl[i] = p;
    val[i] = v;
  } else {
    if (val[i] >= v) {
      insert_position(pl, val, i + 1, p, v);
    } else {
      int tp = pl[i];
      float tv = val[i];
      pl[i] = p;
      val[i] = v;
      insert_position(pl, val, i + 1, tp, tv);
    }
  }
}


x86 assembly (clang, -O0):
<insert_position>:
push   %rbp
mov    %rsp,%rbp
sub    $0x30,%rsp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %edx,-0x14(%rbp)
mov    %ecx,-0x18(%rbp)
movss  %xmm0,-0x1c(%rbp)
cmpl   $0x5,-0x14(%rbp)
jl     113a <insert_position+0x2a>
jmp    1208 <insert_position+0xf8>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
cmpl   $0x0,(%rax,%rcx,4)
jne    1171 <insert_position+0x61>
mov    -0x18(%rbp),%edx
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
movss  -0x1c(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
jmp    1208 <insert_position+0xf8>
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
ucomiss -0x1c(%rbp),%xmm0
jb     11a8 <insert_position+0x98>
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x14(%rbp),%edx
add    $0x1,%edx
mov    -0x18(%rbp),%ecx
movss  -0x1c(%rbp),%xmm0
call   1030 <insert_position@plt>
jmp    1203 <insert_position+0xf3>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x20(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movss  (%rax,%rcx,4),%xmm0
movss  %xmm0,-0x24(%rbp)
mov    -0x18(%rbp),%edx
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
movss  -0x1c(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
movss  %xmm0,(%rax,%rcx,4)
mov    -0x8(%rbp),%rdi
mov    -0x10(%rbp),%rsi
mov    -0x14(%rbp),%edx
add    $0x1,%edx
mov    -0x20(%rbp),%ecx
movss  -0x24(%rbp),%xmm0
call   1030 <insert_position@plt>
jmp    1208 <insert_position+0xf8>
add    $0x30,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<insert_position>:
push   %rbx
cmp    $0x4,%edx
jle    1110 <insert_position+0x10>
pop    %rbx
ret
nopl   0x0(%rax,%rax,1)
movslq %edx,%rax
cmp    $0x5,%eax
mov    $0x4,%r10d
cmovge %eax,%r10d
lea    (%rdi,%rax,4),%r9
lea    (%rsi,%rax,4),%r8
mov    %eax,%r11d
neg    %r10d
movslq %r10d,%rax
lea    (%rax,%r11,1),%r10
add    $0xffffffffffffffff,%r10
xor    %ebx,%ebx
nopl   0x0(%rax,%rax,1)
mov    (%r9,%rbx,4),%r11d
test   %r11d,%r11d
je     1192 <insert_position+0x92>
movss  (%r8,%rbx,4),%xmm1
ucomiss %xmm0,%xmm1
jb     1170 <insert_position+0x70>
add    $0x1,%rbx
mov    %ebx,%eax
add    %r10d,%eax
jne    1140 <insert_position+0x40>
jmp    1106 <insert_position+0x6>
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
lea    (%rdx,%rbx,1),%eax
mov    %ecx,(%r9,%rbx,4)
movss  %xmm0,(%r8,%rbx,4)
add    %ebx,%edx
add    $0x1,%edx
movaps %xmm1,%xmm0
mov    %r11d,%ecx
cmp    $0x4,%eax
jl     1110 <insert_position+0x10>
jmp    1106 <insert_position+0x6>
mov    %ecx,(%r9,%rbx,4)
movss  %xmm0,(%r8,%rbx,4)
pop    %rbx
ret

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

LLVM IR (-O2):
define void @insert_position(i32* %0, float* %1, i32 %2, i32 %3, float %4) {
%6 = icmp sgt i32 %2, 4
br i1 %6, label %36, label %7
7: ; preds = %5, %30
%8 = phi float [ %24, %30 ], [ %4, %5 ]
%9 = phi i32 [ %17, %30 ], [ %3, %5 ]
%10 = phi i32 [ %34, %30 ], [ %2, %5 ]
%11 = sext i32 %10 to i64
%12 = call i32 @llvm.smax.i32(i32 %10, i32 4)
%13 = add nuw nsw i32 %12, 1
br label %14
14: ; preds = %7, %26
%15 = phi i64 [ %11, %7 ], [ %27, %26 ]
%16 = getelementptr inbounds i32, i32* %0, i64 %15
%17 = load i32, i32* %16
%18 = icmp eq i32 %17, 0
br i1 %18, label %19, label %22
19: ; preds = %14
%20 = getelementptr inbounds i32, i32* %0, i64 %15
store i32 %9, i32* %20
%21 = getelementptr inbounds float, float* %1, i64 %15
store float %8, float* %21
br label %36
22: ; preds = %14
%23 = getelementptr inbounds float, float* %1, i64 %15
%24 = load float, float* %23
%25 = fcmp ult float %24, %8
br i1 %25, label %30, label %26
26: ; preds = %22
%27 = add nsw i64 %15, 1
%28 = trunc i64 %27 to i32
%29 = icmp eq i32 %13, %28
br i1 %29, label %36, label %14
30: ; preds = %22
%31 = getelementptr inbounds i32, i32* %0, i64 %15
%32 = getelementptr inbounds float, float* %1, i64 %15
%33 = trunc i64 %15 to i32
store i32 %9, i32* %31
store float %8, float* %32
%34 = add nsw i32 %33, 1
%35 = icmp sgt i32 %33, 3
br i1 %35, label %36, label %7
36: ; preds = %30, %26, %5, %19
ret void
}