void _qspalint(long int *a, long int b, long int e, long int *p) {
  long int L = b, R = e;
  *p = L;
  while (1) {
    while (*(a + *p) <= *(a + R) && *p != R) {
      R--;
    }
    if (*p == R) {
      break;
    } else if (*(a + *p) > *(a + R)) {
      *(a + R) = *(a + R) + *(a + *p);
      *(a + *p) = *(a + R) - *(a + *p);
      *(a + R) = *(a + R) - *(a + *p);
      *p = R;
    }
    while (*(a + *p) >= *(a + L) && *p != L) {
      L++;
    }
    if (*p == L) {
      break;
    } else if (*(a + *p) < *(a + L)) {
      *(a + L) = *(a + L) + *(a + *p);
      *(a + *p) = *(a + L) - *(a + *p);
      *(a + L) = *(a + L) - *(a + *p);
      *p = L;
    }
  }
}


x86 assembly (clang, -O0):
<_qspalint>:
push   %rbp
mov    %rsp,%rbp
mov    %rdi,-0x8(%rbp)
mov    %rsi,-0x10(%rbp)
mov    %rdx,-0x18(%rbp)
mov    %rcx,-0x20(%rbp)
mov    -0x10(%rbp),%rax
mov    %rax,-0x28(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x28(%rbp),%rcx
mov    -0x20(%rbp),%rax
mov    %rcx,(%rax)
jmp    1134 <_qspalint+0x34>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    (%rcx),%rcx
mov    (%rax,%rcx,8),%rcx
mov    -0x8(%rbp),%rdx
mov    -0x30(%rbp),%rsi
xor    %eax,%eax
cmp    (%rdx,%rsi,8),%rcx
mov    %al,-0x31(%rbp)
jg     116b <_qspalint+0x6b>
mov    -0x20(%rbp),%rax
mov    (%rax),%rax
cmp    -0x30(%rbp),%rax
setne  %al
mov    %al,-0x31(%rbp)
mov    -0x31(%rbp),%al
test   $0x1,%al
jne    117b <_qspalint+0x7b>
jmp    118c <_qspalint+0x8c>
mov    -0x30(%rbp),%rax
add    $0xffffffffffffffff,%rax
mov    %rax,-0x30(%rbp)
jmp    1134 <_qspalint+0x34>
mov    -0x20(%rbp),%rax
mov    (%rax),%rax
cmp    -0x30(%rbp),%rax
jne    11a2 <_qspalint+0xa2>
jmp    136c <_qspalint+0x26c>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    (%rcx),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x8(%rbp),%rcx
mov    -0x30(%rbp),%rdx
cmp    (%rcx,%rdx,8),%rax
jle    1246 <_qspalint+0x146>
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    (%rcx),%rcx
add    (%rax,%rcx,8),%rdx
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    (%rcx),%rcx
sub    (%rax,%rcx,8),%rdx
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    (%rcx),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    (%rcx),%rcx
sub    (%rax,%rcx,8),%rdx
mov    -0x8(%rbp),%rax
mov    -0x30(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x30(%rbp),%rcx
mov    -0x20(%rbp),%rax
mov    %rcx,(%rax)
jmp    124b <_qspalint+0x14b>
jmp    1250 <_qspalint+0x150>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    (%rcx),%rcx
mov    (%rax,%rcx,8),%rcx
mov    -0x8(%rbp),%rdx
mov    -0x28(%rbp),%rsi
xor    %eax,%eax
cmp    (%rdx,%rsi,8),%rcx
mov    %al,-0x32(%rbp)
jl     1287 <_qspalint+0x187>
mov    -0x20(%rbp),%rax
mov    (%rax),%rax
cmp    -0x28(%rbp),%rax
setne  %al
mov    %al,-0x32(%rbp)
mov    -0x32(%rbp),%al
test   $0x1,%al
jne    1297 <_qspalint+0x197>
jmp    12a8 <_qspalint+0x1a8>
mov    -0x28(%rbp),%rax
add    $0x1,%rax
mov    %rax,-0x28(%rbp)
jmp    1250 <_qspalint+0x150>
mov    -0x20(%rbp),%rax
mov    (%rax),%rax
cmp    -0x28(%rbp),%rax
jne    12be <_qspalint+0x1be>
jmp    136c <_qspalint+0x26c>
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    (%rcx),%rcx
mov    (%rax,%rcx,8),%rax
mov    -0x8(%rbp),%rcx
mov    -0x28(%rbp),%rdx
cmp    (%rcx,%rdx,8),%rax
jge    1362 <_qspalint+0x262>
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    (%rcx),%rcx
add    (%rax,%rcx,8),%rdx
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    (%rcx),%rcx
sub    (%rax,%rcx,8),%rdx
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    (%rcx),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    (%rax,%rcx,8),%rdx
mov    -0x8(%rbp),%rax
mov    -0x20(%rbp),%rcx
mov    (%rcx),%rcx
sub    (%rax,%rcx,8),%rdx
mov    -0x8(%rbp),%rax
mov    -0x28(%rbp),%rcx
mov    %rdx,(%rax,%rcx,8)
mov    -0x28(%rbp),%rcx
mov    -0x20(%rbp),%rax
mov    %rcx,(%rax)
jmp    1367 <_qspalint+0x267>
jmp    112f <_qspalint+0x2f>
pop    %rbp
ret

x86 assembly (clang, -O2):
<_qspalint>:
mov    %rsi,(%rcx)
mov    %rsi,%r8
cs nopw 0x0(%rax,%rax,1)
mov    (%rdi,%r8,8),%r9
add    $0x1,%rdx
mov    %r8,%r10
neg    %r10
xchg   %ax,%ax
lea    (%r10,%rdx,1),%rax
mov    -0x8(%rdi,%rdx,8),%r11
add    $0xffffffffffffffff,%rdx
cmp    %r11,%r9
jg     1138 <_qspalint+0x38>
cmp    $0x1,%rax
jne    1120 <_qspalint+0x20>
cmp    $0x1,%rax
je     11c9 <_qspalint+0xc9>
cmp    %r11,%r9
jle    116e <_qspalint+0x6e>
add    %r9,%r11
mov    %r11,(%rdi,%rdx,8)
mov    (%rcx),%rax
sub    (%rdi,%rax,8),%r11
mov    %r11,(%rdi,%rax,8)
mov    (%rcx),%rax
mov    (%rdi,%rax,8),%rax
sub    %rax,(%rdi,%rdx,8)
mov    %rdx,(%rcx)
mov    (%rdi,%rdx,8),%r9
mov    %rdx,%r8
add    $0xffffffffffffffff,%rsi
mov    %r8,%r10
neg    %r10
nopl   0x0(%rax,%rax,1)
lea    (%r10,%rsi,1),%rax
mov    0x8(%rdi,%rsi,8),%r11
add    $0x1,%rsi
cmp    %r11,%r9
jl     1198 <_qspalint+0x98>
cmp    $0xffffffffffffffff,%rax
jne    1180 <_qspalint+0x80>
cmp    $0xffffffffffffffff,%rax
je     11c9 <_qspalint+0xc9>
cmp    %r11,%r9
jge    1110 <_qspalint+0x10>
add    %r9,%r11
mov    %r11,(%rdi,%rsi,8)
mov    (%rcx),%rax
sub    (%rdi,%rax,8),%r11
mov    %r11,(%rdi,%rax,8)
mov    (%rcx),%rax
mov    (%rdi,%rax,8),%rax
sub    %rax,(%rdi,%rsi,8)
jmp    1100 <_qspalint>
ret

LLVM IR (-O0):
define void @_qspalint(i64* %0, i64 %1, i64 %2, i64* %3) {
%5 = alloca i64*
%6 = alloca i64
%7 = alloca i64
%8 = alloca i64*
%9 = alloca i64
%10 = alloca i64
store i64* %0, i64** %5
store i64 %1, i64* %6
store i64 %2, i64* %7
store i64* %3, i64** %8
%11 = load i64, i64* %6
store i64 %11, i64* %9
%12 = load i64, i64* %7
store i64 %12, i64* %10
%13 = load i64, i64* %9
%14 = load i64*, i64** %8
store i64 %13, i64* %14
br label %15
15: ; preds = %4, %181
br label %16
16: ; preds = %34, %15
%17 = load i64*, i64** %5
%18 = load i64*, i64** %8
%19 = load i64, i64* %18
%20 = getelementptr inbounds i64, i64* %17, i64 %19
%21 = load i64, i64* %20
%22 = load i64*, i64** %5
%23 = load i64, i64* %10
%24 = getelementptr inbounds i64, i64* %22, i64 %23
%25 = load i64, i64* %24
%26 = icmp sle i64 %21, %25
br i1 %26, label %27, label %32
27: ; preds = %16
%28 = load i64*, i64** %8
%29 = load i64, i64* %28
%30 = load i64, i64* %10
%31 = icmp ne i64 %29, %30
br label %32
32: ; preds = %27, %16
%33 = phi i1 [ false, %16 ], [ %31, %27 ]
br i1 %33, label %34, label %37
34: ; preds = %32
%35 = load i64, i64* %10
%36 = add nsw i64 %35, -1
store i64 %36, i64* %10
br label %16
37: ; preds = %32
%38 = load i64*, i64** %8
%39 = load i64, i64* %38
%40 = load i64, i64* %10
%41 = icmp eq i64 %39, %40
br i1 %41, label %42, label %43
42: ; preds = %37
br label %182
43: ; preds = %37
%44 = load i64*, i64** %5
%45 = load i64*, i64** %8
%46 = load i64, i64* %45
%47 = getelementptr inbounds i64, i64* %44, i64 %46
%48 = load i64, i64* %47
%49 = load i64*, i64** %5
%50 = load i64, i64* %10
%51 = getelementptr inbounds i64, i64* %49, i64 %50
%52 = load i64, i64* %51
%53 = icmp sgt i64 %48, %52
br i1 %53, label %54, label %97
54: ; preds = %43
%55 = load i64*, i64** %5
%56 = load i64, i64* %10
%57 = getelementptr inbounds i64, i64* %55, i64 %56
%58 = load i64, i64* %57
%59 = load i64*, i64** %5
%60 = load i64*, i64** %8
%61 = load i64, i64* %60
%62 = getelementptr inbounds i64, i64* %59, i64 %61
%63 = load i64, i64* %62
%64 = add nsw i64 %58, %63
%65 = load i64*, i64** %5
%66 = load i64, i64* %10
%67 = getelementptr inbounds i64, i64* %65, i64 %66
store i64 %64, i64* %67
%68 = load i64*, i64** %5
%69 = load i64, i64* %10
%70 = getelementptr inbounds i64, i64* %68, i64 %69
%71 = load i64, i64* %70
%72 = load i64*, i64** %5
%73 = load i64*, i64** %8
%74 = load i64, i64* %73
%75 = getelementptr inbounds i64, i64* %72, i64 %74
%76 = load i64, i64* %75
%77 = sub nsw i64 %71, %76
%78 = load i64*, i64** %5
%79 = load i64*, i64** %8
%80 = load i64, i64* %79
%81 = getelementptr inbounds i64, i64* %78, i64 %80
store i64 %77, i64* %81
%82 = load i64*, i64** %5
%83 = load i64, i64* %10
%84 = getelementptr inbounds i64, i64* %82, i64 %83
%85 = load i64, i64* %84
%86 = load i64*, i64** %5
%87 = load i64*, i64** %8
%88 = load i64, i64* %87
%89 = getelementptr inbounds i64, i64* %86, i64 %88
%90 = load i64, i64* %89
%91 = sub nsw i64 %85, %90
%92 = load i64*, i64** %5
%93 = load i64, i64* %10
%94 = getelementptr inbounds i64, i64* %92, i64 %93
store i64 %91, i64* %94
%95 = load i64, i64* %10
%96 = load i64*, i64** %8
store i64 %95, i64* %96
br label %97
97: ; preds = %54, %43
br label %98
98: ; preds = %97
br label %99
99: ; preds = %117, %98
%100 = load i64*, i64** %5
%101 = load i64*, i64** %8
%102 = load i64, i64* %101
%103 = getelementptr inbounds i64, i64* %100, i64 %102
%104 = load i64, i64* %103
%105 = load i64*, i64** %5
%106 = load i64, i64* %9
%107 = getelementptr inbounds i64, i64* %105, i64 %106
%108 = load i64, i64* %107
%109 = icmp sge i64 %104, %108
br i1 %109, label %110, label %115
110: ; preds = %99
%111 = load i64*, i64** %8
%112 = load i64, i64* %111
%113 = load i64, i64* %9
%114 = icmp ne i64 %112, %113
br label %115
115: ; preds = %110, %99
%116 = phi i1 [ false, %99 ], [ %114, %110 ]
br i1 %116, label %117, label %120
117: ; preds = %115
%118 = load i64, i64* %9
%119 = add nsw i64 %118, 1
store i64 %119, i64* %9
br label %99
120: ; preds = %115
%121 = load i64*, i64** %8
%122 = load i64, i64* %121
%123 = load i64, i64* %9
%124 = icmp eq i64 %122, %123
br i1 %124, label %125, label %126
125: ; preds = %120
br label %182
126: ; preds = %120
%127 = load i64*, i64** %5
%128 = load i64*, i64** %8
%129 = load i64, i64* %128
%130 = getelementptr inbounds i64, i64* %127, i64 %129
%131 = load i64, i64* %130
%132 = load i64*, i64** %5
%133 = load i64, i64* %9
%134 = getelementptr inbounds i64, i64* %132, i64 %133
%135 = load i64, i64* %134
%136 = icmp slt i64 %131, %135
br i1 %136, label %137, label %180
137: ; preds = %126
%138 = load i64*, i64** %5
%139 = load i64, i64* %9
%140 = getelementptr inbounds i64, i64* %138, i64 %139
%141 = load i64, i64* %140
%142 = load i64*, i64** %5
%143 = load i64*, i64** %8
%144 = load i64, i64* %143
%145 = getelementptr inbounds i64, i64* %142, i64 %144
%146 = load i64, i64* %145
%147 = add nsw i64 %141, %146
%148 = load i64*, i64** %5
%149 = load i64, i64* %9
%150 = getelementptr inbounds i64, i64* %148, i64 %149
store i64 %147, i64* %150
%151 = load i64*, i64** %5
%152 = load i64, i64* %9
%153 = getelementptr inbounds i64, i64* %151, i64 %152
%154 = load i64, i64* %153
%155 = load i64*, i64** %5
%156 = load i64*, i64** %8
%157 = load i64, i64* %156
%158 = getelementptr inbounds i64, i64* %155, i64 %157
%159 = load i64, i64* %158
%160 = sub nsw i64 %154, %159
%161 = load i64*, i64** %5
%162 = load i64*, i64** %8
%163 = load i64, i64* %162
%164 = getelementptr inbounds i64, i64* %161, i64 %163
store i64 %160, i64* %164
%165 = load i64*, i64** %5
%166 = load i64, i64* %9
%167 = getelementptr inbounds i64, i64* %165, i64 %166
%168 = load i64, i64* %167
%169 = load i64*, i64** %5
%170 = load i64*, i64** %8
%171 = load i64, i64* %170
%172 = getelementptr inbounds i64, i64* %169, i64 %171
%173 = load i64, i64* %172
%174 = sub nsw i64 %168, %173
%175 = load i64*, i64** %5
%176 = load i64, i64* %9
%177 = getelementptr inbounds i64, i64* %175, i64 %176
store i64 %174, i64* %177
%178 = load i64, i64* %9
%179 = load i64*, i64** %8
store i64 %178, i64* %179
br label %180
180: ; preds = %137, %126
br label %181
181: ; preds = %180
br label %15
182: ; preds = %125, %42
ret void
}

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