void dSort2(int n, double *da, int *ib) {
  int l, j, ii, i, iib;
  double dda;
  if (n < 2)
    return;
  da--;
  ib--;
  l = (n >> 1) + 1;
  ii = n;
  for (;;) {
    if (l > 1) {
      dda = da[--l];
      iib = ib[l];
    } else {
      dda = da[ii];
      iib = ib[ii];
      da[ii] = da[1];
      ib[ii] = ib[1];
      if (--ii == 1) {
        da[1] = dda;
        ib[1] = iib;
        return;
      }
    }
    i = l;
    j = l << 1;
    while (j <= ii) {
      if (j < ii && da[j] < da[j + 1])
        ++j;
      if (dda < da[j]) {
        da[i] = da[j];
        ib[i] = ib[j];
        j += (i = j);
      } else {
        j = ii + 1;
      }
    }
    da[i] = dda;
    ib[i] = iib;
  }
}


x86 assembly (clang, -O0):
<dSort2>:
push   %rbp
mov    %rsp,%rbp
mov    %edi,-0x4(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
cmpl   $0x2,-0x4(%rbp)
jge    111e <dSort2+0x1e>
jmp    12e4 <dSort2+0x1e4>
mov    -0x10(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x10(%rbp)
mov    -0x18(%rbp),%rax
add    $0xfffffffffffffffc,%rax
mov    %rax,-0x18(%rbp)
mov    -0x4(%rbp),%eax
sar    $0x1,%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
mov    -0x4(%rbp),%eax
mov    %eax,-0x24(%rbp)
cmpl   $0x1,-0x1c(%rbp)
jle    117f <dSort2+0x7f>
mov    -0x10(%rbp),%rax
mov    -0x1c(%rbp),%ecx
add    $0xffffffff,%ecx
mov    %ecx,-0x1c(%rbp)
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x1c(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x2c(%rbp)
jmp    11fb <dSort2+0xfb>
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x38(%rbp)
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    (%rax,%rcx,4),%eax
mov    %eax,-0x2c(%rbp)
mov    -0x10(%rbp),%rax
movsd  0x8(%rax),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x24(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
mov    0x4(%rax),%edx
mov    -0x18(%rbp),%rax
movslq -0x24(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x24(%rbp),%eax
add    $0xffffffff,%eax
mov    %eax,-0x24(%rbp)
cmp    $0x1,%eax
jne    11f6 <dSort2+0xf6>
movsd  -0x38(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movsd  %xmm0,0x8(%rax)
mov    -0x2c(%rbp),%ecx
mov    -0x18(%rbp),%rax
mov    %ecx,0x4(%rax)
jmp    12e4 <dSort2+0x1e4>
jmp    11fb <dSort2+0xfb>
mov    -0x1c(%rbp),%eax
mov    %eax,-0x28(%rbp)
mov    -0x1c(%rbp),%eax
shl    $0x1,%eax
mov    %eax,-0x20(%rbp)
mov    -0x20(%rbp),%eax
cmp    -0x24(%rbp),%eax
jg     12bf <dSort2+0x1bf>
mov    -0x20(%rbp),%eax
cmp    -0x24(%rbp),%eax
jge    1254 <dSort2+0x154>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm1
mov    -0x10(%rbp),%rax
mov    -0x20(%rbp),%ecx
add    $0x1,%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
jbe    1254 <dSort2+0x154>
mov    -0x20(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
movsd  -0x38(%rbp),%xmm1
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd %xmm1,%xmm0
jbe    12b1 <dSort2+0x1b1>
mov    -0x10(%rbp),%rax
movslq -0x20(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x18(%rbp),%rax
movslq -0x20(%rbp),%rcx
mov    (%rax,%rcx,4),%edx
mov    -0x18(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
mov    -0x20(%rbp),%eax
mov    %eax,-0x28(%rbp)
add    -0x20(%rbp),%eax
mov    %eax,-0x20(%rbp)
jmp    12ba <dSort2+0x1ba>
mov    -0x24(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x20(%rbp)
jmp    120a <dSort2+0x10a>
movsd  -0x38(%rbp),%xmm0
mov    -0x10(%rbp),%rax
movslq -0x28(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x2c(%rbp),%edx
mov    -0x18(%rbp),%rax
movslq -0x28(%rbp),%rcx
mov    %edx,(%rax,%rcx,4)
jmp    1148 <dSort2+0x48>
pop    %rbp
ret

x86 assembly (clang, -O2):
<dSort2>:
cmp    $0x2,%edi
jl     11fe <dSort2+0xfe>
push   %r14
push   %rbx
mov    %edi,%r9d
shr    %r9d
add    $0x1,%r9d
jmp    1131 <dSort2+0x31>
nopl   0x0(%rax,%rax,1)
mov    %r11d,%r10d
movslq %r10d,%rax
movsd  %xmm0,-0x8(%rsi,%rax,8)
mov    %r8d,-0x4(%rdx,%rax,4)
cmp    $0x2,%r9d
jl     1150 <dSort2+0x50>
add    $0xffffffff,%r9d
movsd  -0x8(%rsi,%r9,8),%xmm0
mov    -0x4(%rdx,%r9,4),%r8d
jmp    117c <dSort2+0x7c>
nopl   0x0(%rax)
movslq %edi,%rdi
movsd  -0x8(%rsi,%rdi,8),%xmm0
mov    -0x4(%rdx,%rdi,4),%r8d
movsd  (%rsi),%xmm1
movsd  %xmm1,-0x8(%rsi,%rdi,8)
mov    (%rdx),%eax
mov    %eax,-0x4(%rdx,%rdi,4)
add    $0xffffffff,%edi
mov    $0x1,%r9d
cmp    $0x1,%edi
je     11f4 <dSort2+0xf4>
lea    (%r9,%r9,1),%eax
mov    %r9d,%r10d
cmp    %edi,%eax
jg     1123 <dSort2+0x23>
mov    %r9d,%r11d
nopw   0x0(%rax,%rax,1)
movslq %eax,%rcx
cmp    %edi,%eax
jge    11c0 <dSort2+0xc0>
mov    %ecx,%ebx
or     $0x1,%ebx
movslq %ebx,%r14
movsd  -0x8(%rsi,%r14,8),%xmm1
ucomisd -0x8(%rsi,%rcx,8),%xmm1
mov    %eax,%r10d
jbe    11c3 <dSort2+0xc3>
mov    %r14,%rcx
mov    %ebx,%r10d
jmp    11c3 <dSort2+0xc3>
nopl   0x0(%rax)
mov    %eax,%r10d
movsd  -0x8(%rsi,%rcx,8),%xmm1
ucomisd %xmm0,%xmm1
jbe    1120 <dSort2+0x20>
movslq %r11d,%rax
movsd  %xmm1,-0x8(%rsi,%rax,8)
mov    -0x4(%rdx,%rcx,4),%ecx
mov    %ecx,-0x4(%rdx,%rax,4)
lea    (%r10,%r10,1),%eax
mov    %r10d,%r11d
cmp    %edi,%eax
jle    1190 <dSort2+0x90>
jmp    1123 <dSort2+0x23>
movsd  %xmm0,(%rsi)
mov    %r8d,(%rdx)
pop    %rbx
pop    %r14
ret

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

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