int _topnsel_quicksort(long *data, int startidx, int endidx) {
  long pivot = data[startidx];
  int p = startidx + 1;
  int q = endidx;
  long swapbuf;
  if (startidx == endidx)
    return startidx;
  while (1) {
    while (1) {
      if (p == q || data[p] < pivot)
        break;
      p++;
    }
    if (p == q)
      break;
    while (1) {
      if (p == q || data[q] > pivot)
        break;
      q--;
    }
    if (p == q)
      break;
    swapbuf = data[p];
    data[p] = data[q];
    data[q] = swapbuf;
  }
  if (data[p] < pivot)
    p--;
  if (p != startidx) {
    swapbuf = data[p];
    data[p] = data[startidx];
    data[startidx] = swapbuf;
  }
  return p;
}


x86 assembly (clang, -O0):
<_topnsel_quicksort>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x10(%rbp)
mov    %esi,-0x14(%rbp)
mov    %edx,-0x18(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x20(%rbp)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
mov    -0x18(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0x18(%rbp),%eax
jne    1144 <_topnsel_quicksort+0x44>
mov    -0x14(%rbp),%eax
mov    %eax,-0x4(%rbp)
jmp    1285 <_topnsel_quicksort+0x185>
jmp    1149 <_topnsel_quicksort+0x49>
jmp    114e <_topnsel_quicksort+0x4e>
mov    -0x24(%rbp),%eax
cmp    -0x28(%rbp),%eax
je     1170 <_topnsel_quicksort+0x70>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
cmp    -0x20(%rbp),%rax
jge    1175 <_topnsel_quicksort+0x75>
jmp    1183 <_topnsel_quicksort+0x83>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x24(%rbp)
jmp    114e <_topnsel_quicksort+0x4e>
mov    -0x24(%rbp),%eax
cmp    -0x28(%rbp),%eax
jne    1194 <_topnsel_quicksort+0x94>
jmp    121c <_topnsel_quicksort+0x11c>
jmp    1199 <_topnsel_quicksort+0x99>
mov    -0x24(%rbp),%eax
cmp    -0x28(%rbp),%eax
je     11bb <_topnsel_quicksort+0xbb>
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
cmp    -0x20(%rbp),%rax
jle    11c0 <_topnsel_quicksort+0xc0>
jmp    11ce <_topnsel_quicksort+0xce>
mov    -0x28(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x28(%rbp)
jmp    1199 <_topnsel_quicksort+0x99>
mov    -0x24(%rbp),%eax
cmp    -0x28(%rbp),%eax
jne    11df <_topnsel_quicksort+0xdf>
jmp    121c <_topnsel_quicksort+0x11c>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x30(%rbp),%rdx
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
jmp    1149 <_topnsel_quicksort+0x49>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
cmp    -0x20(%rbp),%rax
jge    123b <_topnsel_quicksort+0x13b>
mov    -0x24(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x24(%rbp)
mov    -0x24(%rbp),%eax
cmp    -0x14(%rbp),%eax
je     127f <_topnsel_quicksort+0x17f>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,8),%rax
mov    %rax,-0x30(%rbp)
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x30(%rbp),%rdx
mov    -0x10(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x24(%rbp),%eax
mov    %eax,-0x4(%rbp)
mov    -0x4(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<_topnsel_quicksort>:
push   %rbx
mov    %esi,%eax
cmp    %edx,%esi
je     113f <_topnsel_quicksort+0x3f>
movslq %eax,%r8
mov    (%rdi,%r8,8),%r9
lea    0x1(%r8),%ecx
cmp    %edx,%ecx
jne    1150 <_topnsel_quicksort+0x50>
mov    %edx,%ecx
movslq %ecx,%rcx
xor    %edx,%edx
cmp    %r9,(%rdi,%rcx,8)
setl   %dl
sub    %edx,%ecx
cmp    %eax,%ecx
je     113f <_topnsel_quicksort+0x3f>
movslq %ecx,%rax
mov    (%rdi,%rax,8),%rdx
mov    (%rdi,%r8,8),%rsi
mov    %rsi,(%rdi,%rax,8)
mov    %rdx,(%rdi,%r8,8)
mov    %ecx,%eax
pop    %rbx
ret
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movslq %ecx,%rsi
lea    (%rdi,%rsi,8),%rsi
nopw   0x0(%rax,%rax,1)
mov    (%rsi),%r10
cmp    %r9,%r10
jl     1175 <_topnsel_quicksort+0x75>
add    $0x1,%ecx
add    $0x8,%rsi
cmp    %ecx,%edx
jne    1160 <_topnsel_quicksort+0x60>
jmp    1116 <_topnsel_quicksort+0x16>
cmp    %ecx,%edx
je     1116 <_topnsel_quicksort+0x16>
movslq %edx,%rbx
lea    (%rdi,%rbx,8),%r11
mov    (%r11),%rbx
cmp    %r9,%rbx
jg     1195 <_topnsel_quicksort+0x95>
add    $0xfffffffffffffff8,%r11
add    $0xffffffff,%edx
cmp    %edx,%ecx
jne    1180 <_topnsel_quicksort+0x80>
jmp    1118 <_topnsel_quicksort+0x18>
mov    %rbx,(%rsi)
mov    %r10,(%r11)
cmp    %edx,%ecx
jne    1150 <_topnsel_quicksort+0x50>
jmp    1118 <_topnsel_quicksort+0x18>

LLVM IR (-O0):
define i32 @_topnsel_quicksort(i64* %0, i32 %1, i32 %2) {
%4 = alloca i32
%5 = alloca i64*
%6 = alloca i32
%7 = alloca i32
%8 = alloca i64
%9 = alloca i32
%10 = alloca i32
%11 = alloca i64
store i64* %0, i64** %5
store i32 %1, i32* %6
store i32 %2, i32* %7
%12 = load i64*, i64** %5
%13 = load i32, i32* %6
%14 = sext i32 %13 to i64
%15 = getelementptr inbounds i64, i64* %12, i64 %14
%16 = load i64, i64* %15
store i64 %16, i64* %8
%17 = load i32, i32* %6
%18 = add nsw i32 %17, 1
store i32 %18, i32* %9
%19 = load i32, i32* %7
store i32 %19, i32* %10
%20 = load i32, i32* %6
%21 = load i32, i32* %7
%22 = icmp eq i32 %20, %21
br i1 %22, label %23, label %25
23: ; preds = %3
%24 = load i32, i32* %6
store i32 %24, i32* %4
br label %127
25: ; preds = %3
br label %26
26: ; preds = %25, %70
br label %27
27: ; preds = %26, %40
%28 = load i32, i32* %9
%29 = load i32, i32* %10
%30 = icmp eq i32 %28, %29
br i1 %30, label %39, label %31
31: ; preds = %27
%32 = load i64*, i64** %5
%33 = load i32, i32* %9
%34 = sext i32 %33 to i64
%35 = getelementptr inbounds i64, i64* %32, i64 %34
%36 = load i64, i64* %35
%37 = load i64, i64* %8
%38 = icmp slt i64 %36, %37
br i1 %38, label %39, label %40
39: ; preds = %31, %27
br label %43
40: ; preds = %31
%41 = load i32, i32* %9
%42 = add nsw i32 %41, 1
store i32 %42, i32* %9
br label %27
43: ; preds = %39
%44 = load i32, i32* %9
%45 = load i32, i32* %10
%46 = icmp eq i32 %44, %45
br i1 %46, label %47, label %48
47: ; preds = %43
br label %90
48: ; preds = %43
br label %49
49: ; preds = %48, %62
%50 = load i32, i32* %9
%51 = load i32, i32* %10
%52 = icmp eq i32 %50, %51
br i1 %52, label %61, label %53
53: ; preds = %49
%54 = load i64*, i64** %5
%55 = load i32, i32* %10
%56 = sext i32 %55 to i64
%57 = getelementptr inbounds i64, i64* %54, i64 %56
%58 = load i64, i64* %57
%59 = load i64, i64* %8
%60 = icmp sgt i64 %58, %59
br i1 %60, label %61, label %62
61: ; preds = %53, %49
br label %65
62: ; preds = %53
%63 = load i32, i32* %10
%64 = add nsw i32 %63, -1
store i32 %64, i32* %10
br label %49
65: ; preds = %61
%66 = load i32, i32* %9
%67 = load i32, i32* %10
%68 = icmp eq i32 %66, %67
br i1 %68, label %69, label %70
69: ; preds = %65
br label %90
70: ; preds = %65
%71 = load i64*, i64** %5
%72 = load i32, i32* %9
%73 = sext i32 %72 to i64
%74 = getelementptr inbounds i64, i64* %71, i64 %73
%75 = load i64, i64* %74
store i64 %75, i64* %11
%76 = load i64*, i64** %5
%77 = load i32, i32* %10
%78 = sext i32 %77 to i64
%79 = getelementptr inbounds i64, i64* %76, i64 %78
%80 = load i64, i64* %79
%81 = load i64*, i64** %5
%82 = load i32, i32* %9
%83 = sext i32 %82 to i64
%84 = getelementptr inbounds i64, i64* %81, i64 %83
store i64 %80, i64* %84
%85 = load i64, i64* %11
%86 = load i64*, i64** %5
%87 = load i32, i32* %10
%88 = sext i32 %87 to i64
%89 = getelementptr inbounds i64, i64* %86, i64 %88
store i64 %85, i64* %89
br label %26
90: ; preds = %69, %47
%91 = load i64*, i64** %5
%92 = load i32, i32* %9
%93 = sext i32 %92 to i64
%94 = getelementptr inbounds i64, i64* %91, i64 %93
%95 = load i64, i64* %94
%96 = load i64, i64* %8
%97 = icmp slt i64 %95, %96
br i1 %97, label %98, label %101
98: ; preds = %90
%99 = load i32, i32* %9
%100 = add nsw i32 %99, -1
store i32 %100, i32* %9
br label %101
101: ; preds = %98, %90
%102 = load i32, i32* %9
%103 = load i32, i32* %6
%104 = icmp ne i32 %102, %103
br i1 %104, label %105, label %125
105: ; preds = %101
%106 = load i64*, i64** %5
%107 = load i32, i32* %9
%108 = sext i32 %107 to i64
%109 = getelementptr inbounds i64, i64* %106, i64 %108
%110 = load i64, i64* %109
store i64 %110, i64* %11
%111 = load i64*, i64** %5
%112 = load i32, i32* %6
%113 = sext i32 %112 to i64
%114 = getelementptr inbounds i64, i64* %111, i64 %113
%115 = load i64, i64* %114
%116 = load i64*, i64** %5
%117 = load i32, i32* %9
%118 = sext i32 %117 to i64
%119 = getelementptr inbounds i64, i64* %116, i64 %118
store i64 %115, i64* %119
%120 = load i64, i64* %11
%121 = load i64*, i64** %5
%122 = load i32, i32* %6
%123 = sext i32 %122 to i64
%124 = getelementptr inbounds i64, i64* %121, i64 %123
store i64 %120, i64* %124
br label %125
125: ; preds = %105, %101
%126 = load i32, i32* %9
store i32 %126, i32* %4
br label %127
127: ; preds = %125, %23
%128 = load i32, i32* %4
ret i32 %128
}

LLVM IR (-O2):
define i32 @_topnsel_quicksort(i64* nocapture %0, i32 %1, i32 %2) {
%4 = sext i32 %1 to i64
%5 = getelementptr inbounds i64, i64* %0, i64 %4
%6 = load i64, i64* %5
%7 = add nsw i32 %1, 1
%8 = icmp eq i32 %1, %2
br i1 %8, label %61, label %9
9: ; preds = %3
%10 = icmp eq i32 %7, %2
br i1 %10, label %47, label %11
11: ; preds = %9, %39
%12 = phi i32 [ %41, %39 ], [ %2, %9 ]
%13 = phi i32 [ %22, %39 ], [ %7, %9 ]
%14 = sext i32 %13 to i64
br label %15
15: ; preds = %11, %26
%16 = phi i64 [ %14, %11 ], [ %27, %26 ]
%17 = getelementptr inbounds i64, i64* %0, i64 %16
%18 = load i64, i64* %17
%19 = icmp slt i64 %18, %6
br i1 %19, label %20, label %26
20: ; preds = %15
%21 = getelementptr inbounds i64, i64* %0, i64 %16
%22 = trunc i64 %16 to i32
%23 = icmp eq i32 %12, %22
br i1 %23, label %47, label %24
24: ; preds = %20
%25 = sext i32 %12 to i64
br label %30
26: ; preds = %15
%27 = add nsw i64 %16, 1
%28 = trunc i64 %27 to i32
%29 = icmp eq i32 %12, %28
br i1 %29, label %47, label %15
30: ; preds = %24, %35
%31 = phi i64 [ %25, %24 ], [ %36, %35 ]
%32 = getelementptr inbounds i64, i64* %0, i64 %31
%33 = load i64, i64* %32
%34 = icmp sgt i64 %33, %6
br i1 %34, label %39, label %35
35: ; preds = %30
%36 = add nsw i64 %31, -1
%37 = trunc i64 %36 to i32
%38 = icmp eq i32 %22, %37
br i1 %38, label %43, label %30
39: ; preds = %30
%40 = getelementptr inbounds i64, i64* %0, i64 %31
%41 = trunc i64 %31 to i32
store i64 %33, i64* %21
store i64 %18, i64* %40
%42 = icmp eq i32 %22, %41
br i1 %42, label %45, label %11
43: ; preds = %35
%44 = trunc i64 %16 to i32
br label %47
45: ; preds = %39
%46 = trunc i64 %16 to i32
br label %47
47: ; preds = %20, %26, %45, %43, %9
%48 = phi i32 [ %2, %9 ], [ %44, %43 ], [ %46, %45 ], [ %12, %26 ], [ %12, %20 ]
%49 = sext i32 %48 to i64
%50 = getelementptr inbounds i64, i64* %0, i64 %49
%51 = load i64, i64* %50
%52 = icmp slt i64 %51, %6
%53 = sext i1 %52 to i32
%54 = add nsw i32 %48, %53
%55 = icmp eq i32 %54, %1
br i1 %55, label %61, label %56
56: ; preds = %47
%57 = sext i32 %54 to i64
%58 = getelementptr inbounds i64, i64* %0, i64 %57
%59 = load i64, i64* %58
%60 = load i64, i64* %5
store i64 %60, i64* %58
store i64 %59, i64* %5
br label %61
61: ; preds = %47, %56, %3
%62 = phi i32 [ %1, %3 ], [ %54, %56 ], [ %1, %47 ]
ret i32 %62
}