int partition(int A[], int i, int k) {
  int midpoint = i + (k - i) / 2;
  int pivot = A[midpoint];
  int low = i;
  int high = k;
  while (1) {
    while (A[low] < pivot)
      ++low;
    while (A[high] > pivot)
      --high;
    if (low >= high)
      break;
    int T = A[low];
    A[low] = A[high];
    A[high] = T;
    ++low;
    --high;
  }
  return high;
}


x86 assembly (clang, -O0):
<partition>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
mov    %edx,-0x10(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x10(%rbp),%eax
sub    -0xc(%rbp),%eax
mov    $0x2,%ecx
cltd
idiv   %ecx
mov    %eax,%ecx
mov    -0x28(%rbp),%eax
add    %ecx,%eax
mov    %eax,-0x14(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x18(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,-0x1c(%rbp)
mov    -0x10(%rbp),%eax
mov    %eax,-0x20(%rbp)
jmp    114b <partition+0x4b>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x18(%rbp),%eax
jge    116d <partition+0x6d>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    114b <partition+0x4b>
jmp    1172 <partition+0x72>
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
cmp    -0x18(%rbp),%eax
jle    1194 <partition+0x94>
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
jmp    1172 <partition+0x72>
mov    -0x1c(%rbp),%eax
cmp    -0x20(%rbp),%eax
jl     11a5 <partition+0xa5>
jmp    11ee <partition+0xee>
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x24(%rbp)
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x8(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x24(%rbp),%edx
mov    -0x8(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x20(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x20(%rbp)
jmp    1146 <partition+0x46>
mov    -0x20(%rbp),%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<partition>:
push   %rbp
push   %rbx
mov    %edx,%eax
sub    %esi,%eax
mov    %eax,%ecx
shr    $0x1f,%ecx
add    %eax,%ecx
sar    %ecx
add    %esi,%ecx
movslq %ecx,%rax
mov    (%rdi,%rax,4),%r9d
lea    0x4(%rdi),%r8
nopl   0x0(%rax)
movslq %esi,%rax
lea    (%rdi,%rax,4),%r11
nopw   0x0(%rax,%rax,1)
mov    (%r11),%r10d
add    $0x4,%r11
add    $0x1,%esi
cmp    %r9d,%r10d
jl     1130 <partition+0x30>
lea    -0x1(%rsi),%ebx
movslq %edx,%rax
lea    (%r8,%rax,4),%rcx
nopl   0x0(%rax)
mov    -0x4(%rcx),%ebp
add    $0xfffffffffffffffc,%rcx
add    $0xffffffff,%edx
cmp    %r9d,%ebp
jg     1150 <partition+0x50>
lea    0x1(%rdx),%eax
cmp    %eax,%ebx
jge    116f <partition+0x6f>
mov    %ebp,-0x4(%r11)
mov    %r10d,(%rcx)
jmp    1120 <partition+0x20>
pop    %rbx
pop    %rbp
ret

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

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