int upsort(double a[], long n) {
  long i, j;
  double aip1;
  double *pai, *paip1, *paj, *pajp1;
  pai = a;
  paip1 = a + 1;
  for (i = 0; i < n - 1; i++) {
    aip1 = *paip1;
    if (aip1 < *pai) {
      paj = pai;
      pajp1 = pai + 1;
      for (j = i; j >= 0; j--) {
        if (aip1 < *paj)
          *pajp1 = *paj;
        else
          break;
        paj--;
        pajp1--;
      }
      *pajp1 = aip1;
    }
    pai++;
    paip1++;
  }
  return (0);
}


x86 assembly (clang, -O0):
<upsort>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    -0x8(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x8(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x38(%rbp)
movq   $0x0,-0x18(%rbp)
mov    -0x18(%rbp),%rax
mov    -0x10(%rbp),%rcx
sub    $0x1,%rcx
cmp    %rcx,%rax
jge    1218 <upsort+0x118>
mov    -0x38(%rbp),%rax
movsd  (%rax),%xmm0
movsd  %xmm0,-0x28(%rbp)
movsd  -0x28(%rbp),%xmm1
mov    -0x30(%rbp),%rax
movsd  (%rax),%xmm0
ucomisd %xmm1,%xmm0
jbe    11ef <upsort+0xef>
mov    -0x30(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x30(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x48(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x20(%rbp)
cmpq   $0x0,-0x20(%rbp)
jl     11e2 <upsort+0xe2>
movsd  -0x28(%rbp),%xmm1
mov    -0x40(%rbp),%rax
movsd  (%rax),%xmm0
ucomisd %xmm1,%xmm0
jbe    11b4 <upsort+0xb4>
mov    -0x40(%rbp),%rax
movsd  (%rax),%xmm0
mov    -0x48(%rbp),%rax
movsd  %xmm0,(%rax)
jmp    11b9 <upsort+0xb9>
jmp    11e2 <upsort+0xe2>
mov    -0x40(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x40(%rbp)
mov    -0x48(%rbp),%rax
add    $0xfffffffffffffff8,%rax
mov    %rax,-0x48(%rbp)
mov    -0x20(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x20(%rbp)
jmp    117d <upsort+0x7d>
movsd  -0x28(%rbp),%xmm0
mov    -0x48(%rbp),%rax
movsd  %xmm0,(%rax)
mov    -0x30(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x30(%rbp)
mov    -0x38(%rbp),%rax
add    $0x8,%rax
mov    %rax,-0x38(%rbp)
mov    -0x18(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x18(%rbp)
jmp    1128 <upsort+0x28>
xor    %eax,%eax
pop    %rbp
ret

x86 assembly (clang, -O2):
<upsort>:
cmp    $0x2,%rsi
jl     1171 <upsort+0x71>
add    $0xffffffffffffffff,%rsi
xor    %ecx,%ecx
mov    %rdi,%r8
jmp    1121 <upsort+0x21>
mov    %rdi,%rdx
movsd  %xmm0,(%rdx)
add    $0x1,%rcx
cmp    %rsi,%rcx
je     1171 <upsort+0x71>
movsd  (%r8),%xmm1
movsd  0x8(%r8),%xmm0
add    $0x8,%r8
ucomisd %xmm0,%xmm1
jbe    1118 <upsort+0x18>
mov    %r8,%rdx
jbe    1114 <upsort+0x14>
mov    %rcx,%rax
mov    %r8,%rdx
cs nopw 0x0(%rax,%rax,1)
nopl   0x0(%rax,%rax,1)
movsd  %xmm1,0x8(%rdi,%rax,8)
test   %rax,%rax
jle    1111 <upsort+0x11>
add    $0xfffffffffffffff8,%rdx
movsd  -0x8(%rdi,%rax,8),%xmm1
add    $0xffffffffffffffff,%rax
ucomisd %xmm0,%xmm1
ja     1150 <upsort+0x50>
jmp    1114 <upsort+0x14>
xor    %eax,%eax
ret

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

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