unsigned long partition(a, p, r)
double a[];
unsigned long p, r;
{
  double x, tmp;
  unsigned long i, j;
  x = a[p];
  i = p - 1;
  j = r + 1;
  while (1) {
    for (j--; a[j] > x; j--)
      ;
    for (i++; a[i] < x; i++)
      ;
    if (i < j) {
      tmp = a[i];
      a[i] = a[j];
      a[j] = tmp;
    } else
      return (j);
  }
}


x86 assembly (clang, -O0):
<partition>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x10(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x20(%rbp)
mov    -0x10(%rbp),%rax
sub    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x38(%rbp)
mov    -0x38(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x38(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x20(%rbp),%xmm0
jbe    1174 <partition+0x74>
jmp    1163 <partition+0x63>
mov    -0x38(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x38(%rbp)
jmp    1146 <partition+0x46>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
movsd  -0x20(%rbp),%xmm0
ucomisd %xmm1,%xmm0
jbe    11b2 <partition+0xb2>
jmp    11a1 <partition+0xa1>
mov    -0x30(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x30(%rbp)
jmp    1180 <partition+0x80>
mov    -0x30(%rbp),%rax
cmp    -0x38(%rbp),%rax
jae    1203 <partition+0x103>
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
movsd  -0x28(%rbp),%xmm0
mov    -0x8(%rbp),%rax
mov    -0x38(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
jmp    1209 <partition+0x109>
mov    -0x38(%rbp),%rax
pop    %rbp
ret
jmp    113a <partition+0x3a>

x86 assembly (clang, -O2):
<partition>:
mov    %rdx,%rax
movsd  (%rdi,%rsi,8),%xmm0
add    $0xffffffffffffffff,%rsi
add    $0x1,%rax
movsd  -0x8(%rdi,%rax,8),%xmm1
add    $0xffffffffffffffff,%rax
ucomisd %xmm0,%xmm1
ja     1110 <partition+0x10>
movsd  0x8(%rdi,%rsi,8),%xmm2
add    $0x1,%rsi
ucomisd %xmm2,%xmm0
ja     1120 <partition+0x20>
cmp    %rax,%rsi
jae    1141 <partition+0x41>
movsd  %xmm1,(%rdi,%rsi,8)
movsd  %xmm2,(%rdi,%rax,8)
jmp    1110 <partition+0x10>
ret

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

LLVM IR (-O2):
define i64 @partition(double* nocapture %0, i64 %1, i64 %2) {
%4 = getelementptr inbounds double, double* %0, i64 %1
%5 = load double, double* %4
%6 = add i64 %1, -1
%7 = add i64 %2, 1
br label %8
8: ; preds = %27, %3
%9 = phi i64 [ %6, %3 ], [ %21, %27 ]
%10 = phi i64 [ %7, %3 ], [ %13, %27 ]
br label %11
11: ; preds = %11, %8
%12 = phi i64 [ %10, %8 ], [ %13, %11 ]
%13 = add i64 %12, -1
%14 = getelementptr inbounds double, double* %0, i64 %13
%15 = load double, double* %14
%16 = fcmp ogt double %15, %5
br i1 %16, label %11, label %17
17: ; preds = %11
%18 = getelementptr inbounds double, double* %0, i64 %13
br label %19
19: ; preds = %17, %19
%20 = phi i64 [ %21, %19 ], [ %9, %17 ]
%21 = add i64 %20, 1
%22 = getelementptr inbounds double, double* %0, i64 %21
%23 = load double, double* %22
%24 = fcmp olt double %23, %5
br i1 %24, label %19, label %25
25: ; preds = %19
%26 = icmp ult i64 %21, %13
br i1 %26, label %27, label %29
27: ; preds = %25
%28 = getelementptr inbounds double, double* %0, i64 %21
store double %15, double* %28
store double %23, double* %18
br label %8
29: ; preds = %25
ret i64 %13
}