void sortbesto(double *obs, int nobs) {
  int gap, i, j, k;
  double v;
  int incs[16] = {1391376, 463792, 198768, 86961, 33936, 13776, 4592, 1968,
                  861,     336,    112,    48,    21,    7,     3,    1};
  for (k = 0; k < 16; k++)
    for (gap = incs[k], i = gap; i < nobs; i++) {
      v = obs[i];
      j = i;
      while (j >= gap && obs[j - gap] > v) {
        obs[j] = obs[j - gap];
        j -= gap;
      }
      obs[j] = v;
    }
}


x86 assembly (clang, -O0):
<sortbesto>:
push   %rbp
mov    %rsp,%rbp
sub    $0x80,%rsp
mov    %rdi,-0x8(%rbp)
mov    %esi,-0xc(%rbp)
lea    -0x70(%rbp),%rdi
lea    0xed3(%rip),%rsi
mov    $0x40,%edx
call   1030 <memcpy@plt>
movl   $0x0,-0x1c(%rbp)
cmpl   $0x10,-0x1c(%rbp)
jge    121d <sortbesto+0x10d>
movslq -0x1c(%rbp),%rax
mov    -0x70(%rbp,%rax,4),%eax
mov    %eax,-0x10(%rbp)
mov    -0x10(%rbp),%eax
mov    %eax,-0x14(%rbp)
mov    -0x14(%rbp),%eax
cmp    -0xc(%rbp),%eax
jge    120a <sortbesto+0xfa>
mov    -0x8(%rbp),%rax
movslq -0x14(%rbp),%rcx
movsd  (%rax,%rcx,8),%xmm0
movsd  %xmm0,-0x28(%rbp)
mov    -0x14(%rbp),%eax
mov    %eax,-0x18(%rbp)
mov    -0x18(%rbp),%ecx
xor    %eax,%eax
cmp    -0x10(%rbp),%ecx
mov    %al,-0x71(%rbp)
jl     11ab <sortbesto+0x9b>
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%ecx
sub    -0x10(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
ucomisd -0x28(%rbp),%xmm0
seta   %al
mov    %al,-0x71(%rbp)
mov    -0x71(%rbp),%al
test   $0x1,%al
jne    11bb <sortbesto+0xab>
jmp    11ea <sortbesto+0xda>
mov    -0x8(%rbp),%rax
mov    -0x18(%rbp),%ecx
sub    -0x10(%rbp),%ecx
movslq %ecx,%rcx
movsd  (%rax,%rcx,8),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x10(%rbp),%ecx
mov    -0x18(%rbp),%eax
sub    %ecx,%eax
mov    %eax,-0x18(%rbp)
jmp    117d <sortbesto+0x6d>
movsd  -0x28(%rbp),%xmm0
mov    -0x8(%rbp),%rax
movslq -0x18(%rbp),%rcx
movsd  %xmm0,(%rax,%rcx,8)
mov    -0x14(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x14(%rbp)
jmp    1159 <sortbesto+0x49>
jmp    120f <sortbesto+0xff>
mov    -0x1c(%rbp),%eax
add    $0x1,%eax
mov    %eax,-0x1c(%rbp)
jmp    113e <sortbesto+0x2e>
add    $0x80,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<sortbesto>:
push   %rbx
movslq %esi,%r10
xor    %r9d,%r9d
lea    0xef2(%rip),%r8
jmp    111a <sortbesto+0x1a>
add    $0x1,%r9
cmp    $0x10,%r9
je     117f <sortbesto+0x7f>
movslq (%r8,%r9,4),%rdx
cmp    %esi,%edx
jge    1110 <sortbesto+0x10>
xor    %r11d,%r11d
mov    %rdx,%rcx
jmp    1146 <sortbesto+0x46>
nopw   0x0(%rax,%rax,1)
add    %edx,%eax
cltq
movsd  %xmm0,(%rdi,%rax,8)
add    $0x1,%rcx
add    $0x1,%r11d
cmp    %r10,%rcx
je     1110 <sortbesto+0x10>
movsd  (%rdi,%rcx,8),%xmm0
mov    %ecx,%eax
cmp    %rdx,%rcx
jl     1132 <sortbesto+0x32>
mov    %r11d,%eax
cs nopw 0x0(%rax,%rax,1)
nop
movslq %eax,%rbx
movsd  (%rdi,%rbx,8),%xmm1
ucomisd %xmm0,%xmm1
jbe    1130 <sortbesto+0x30>
lea    (%rdx,%rax,1),%ebx
movslq %ebx,%rbx
movsd  %xmm1,(%rdi,%rbx,8)
sub    %edx,%eax
jge    1160 <sortbesto+0x60>
jmp    1130 <sortbesto+0x30>
pop    %rbx
ret

LLVM IR (-O0):
@__const.sortbesto.incs = [16 x i32] [i32 1391376, i32 463792, i32 198768, i32 86961, i32 33936, i32 13776, i32 4592, i32 1968, i32 861, i32 336, i32 112, i32 48, i32 21, i32 7, i32 3, i32 1]
define void @sortbesto(double* %0, i32 %1) {
%3 = alloca double*
%4 = alloca i32
%5 = alloca i32
%6 = alloca i32
%7 = alloca i32
%8 = alloca i32
%9 = alloca double
%10 = alloca [16 x i32]
store double* %0, double** %3
store i32 %1, i32* %4
%11 = bitcast [16 x i32]* %10 to i8*
store i32 0, i32* %8
br label %12
12: ; preds = %73, %2
%13 = load i32, i32* %8
%14 = icmp slt i32 %13, 16
br i1 %14, label %15, label %76
15: ; preds = %12
%16 = load i32, i32* %8
%17 = sext i32 %16 to i64
%18 = getelementptr inbounds [16 x i32], [16 x i32]* %10, i64 0, i64 %17
%19 = load i32, i32* %18
store i32 %19, i32* %5
%20 = load i32, i32* %5
store i32 %20, i32* %6
br label %21
21: ; preds = %69, %15
%22 = load i32, i32* %6
%23 = load i32, i32* %4
%24 = icmp slt i32 %22, %23
br i1 %24, label %25, label %72
25: ; preds = %21
%26 = load double*, double** %3
%27 = load i32, i32* %6
%28 = sext i32 %27 to i64
%29 = getelementptr inbounds double, double* %26, i64 %28
%30 = load double, double* %29
store double %30, double* %9
%31 = load i32, i32* %6
store i32 %31, i32* %7
br label %32
32: ; preds = %48, %25
%33 = load i32, i32* %7
%34 = load i32, i32* %5
%35 = icmp sge i32 %33, %34
br i1 %35, label %36, label %46
36: ; preds = %32
%37 = load double*, double** %3
%38 = load i32, i32* %7
%39 = load i32, i32* %5
%40 = sub nsw i32 %38, %39
%41 = sext i32 %40 to i64
%42 = getelementptr inbounds double, double* %37, i64 %41
%43 = load double, double* %42
%44 = load double, double* %9
%45 = fcmp ogt double %43, %44
br label %46
46: ; preds = %36, %32
%47 = phi i1 [ false, %32 ], [ %45, %36 ]
br i1 %47, label %48, label %63
48: ; preds = %46
%49 = load double*, double** %3
%50 = load i32, i32* %7
%51 = load i32, i32* %5
%52 = sub nsw i32 %50, %51
%53 = sext i32 %52 to i64
%54 = getelementptr inbounds double, double* %49, i64 %53
%55 = load double, double* %54
%56 = load double*, double** %3
%57 = load i32, i32* %7
%58 = sext i32 %57 to i64
%59 = getelementptr inbounds double, double* %56, i64 %58
store double %55, double* %59
%60 = load i32, i32* %5
%61 = load i32, i32* %7
%62 = sub nsw i32 %61, %60
store i32 %62, i32* %7
br label %32
63: ; preds = %46
%64 = load double, double* %9
%65 = load double*, double** %3
%66 = load i32, i32* %7
%67 = sext i32 %66 to i64
%68 = getelementptr inbounds double, double* %65, i64 %67
store double %64, double* %68
br label %69
69: ; preds = %63
%70 = load i32, i32* %6
%71 = add nsw i32 %70, 1
store i32 %71, i32* %6
br label %21
72: ; preds = %21
br label %73
73: ; preds = %72
%74 = load i32, i32* %8
%75 = add nsw i32 %74, 1
store i32 %75, i32* %8
br label %12
76: ; preds = %12
ret void
}

LLVM IR (-O2):
@__const.sortbesto.incs = [16 x i32] [i32 1391376, i32 463792, i32 198768, i32 86961, i32 33936, i32 13776, i32 4592, i32 1968, i32 861, i32 336, i32 112, i32 48, i32 21, i32 7, i32 3, i32 1]
define void @sortbesto(double* nocapture %0, i32 %1) {
%3 = sext i32 %1 to i64
br label %4
4: ; preds = %2, %34
%5 = phi i64 [ 0, %2 ], [ %35, %34 ]
%6 = getelementptr inbounds [16 x i32], [16 x i32]* @__const.sortbesto.incs, i64 0, i64 %5
%7 = load i32, i32* %6
%8 = icmp slt i32 %7, %1
br i1 %8, label %9, label %34
9: ; preds = %4
%10 = sext i32 %7 to i64
br label %11
11: ; preds = %9, %28
%12 = phi i64 [ %10, %9 ], [ %32, %28 ]
%13 = getelementptr inbounds double, double* %0, i64 %12
%14 = load double, double* %13
%15 = icmp slt i64 %12, %10
%16 = trunc i64 %12 to i32
br i1 %15, label %28, label %17
17: ; preds = %11, %24
%18 = phi i32 [ %19, %24 ], [ %16, %11 ]
%19 = sub nsw i32 %18, %7
%20 = sext i32 %19 to i64
%21 = getelementptr inbounds double, double* %0, i64 %20
%22 = load double, double* %21
%23 = fcmp ogt double %22, %14
br i1 %23, label %24, label %28
24: ; preds = %17
%25 = sext i32 %18 to i64
%26 = getelementptr inbounds double, double* %0, i64 %25
store double %22, double* %26
%27 = icmp slt i32 %19, %7
br i1 %27, label %28, label %17
28: ; preds = %17, %24, %11
%29 = phi i32 [ %16, %11 ], [ %19, %24 ], [ %18, %17 ]
%30 = sext i32 %29 to i64
%31 = getelementptr inbounds double, double* %0, i64 %30
store double %14, double* %31
%32 = add nsw i64 %12, 1
%33 = icmp eq i64 %32, %3
br i1 %33, label %34, label %11
34: ; preds = %28, %4
%35 = add nuw nsw i64 %5, 1
%36 = icmp eq i64 %35, 16
br i1 %36, label %37, label %4
37: ; preds = %34
ret void
}