// File: /workspace/github_cpp_makefile_star2_O2/Fohlen[P]cubescript-standalone/./tools.h
// Function: void quicksort<sortitem, sortfun>(sortitem*, sortitem*, sortfun)
static inline void quicksort(T *start, T *end, F fun)
{
    while(end-start > 10)
    {
        T *mid = &start[(end-start)/2], *i = start+1, *j = end-2, pivot;
        if(fun(*start, *mid)) /* start < mid */
        {
            if(fun(end[-1], *start)) { pivot = *start; *start = end[-1]; end[-1] = *mid; } /* end < start < mid */
            else if(fun(end[-1], *mid)) { pivot = end[-1]; end[-1] = *mid; } /* start <= end < mid */
            else { pivot = *mid; } /* start < mid <= end */
        }
        else if(fun(*start, end[-1])) { pivot = *start; *start = *mid; } /*mid <= start < end */
        else if(fun(*mid, end[-1])) { pivot = end[-1]; end[-1] = *start; *start = *mid; } /* mid < end <= start */
        else { pivot = *mid; swap(*start, end[-1]); }  /* end <= mid <= start */
        *mid = end[-2];
        do
        {
            while(fun(*i, pivot)) if(++i >= j) goto partitioned;
            while(fun(pivot, *--j)) if(i >= j) goto partitioned;
            swap(*i, *j);
        }
        while(++i < j);
    partitioned:
        end[-2] = *i;
        *i = pivot;

        if(i-start < end-(i+1))
        {
            quicksort(start, i, fun);
            start = i+1;
        }
        else
        {
            quicksort(i+1, end, fun);
            end = i;
        }
    }

    insertionsort(start, end, fun);
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x68, %rsp
movq %rsi, %rbx
movq %rdi, %r14
leaq 0x10(%rbp), %r15
movq %rbx, %rax
subq %r14, %rax
cmpq $0xf1, %rax
movq %r14, -0x30(%rbp)
movq %rbx, -0x78(%rbp)
jl 0xcf69
xorl %edx, %edx
pushq $0x18
popq %rcx
divq %rcx
shrq %rax
imulq $0x18, %rax, %r13
addq %r14, %r13
movq %r15, %rdi
movq %r14, %rsi
movq %r13, %rdx
callq 0xdbda
movq %rbx, %r12
addq $-0x18, %rbx
movq %r15, %rdi
testb %al, %al
je 0xcd39
movq %rbx, %rsi
movq %r14, %rdx
callq 0xdbda
testb %al, %al
je 0xcd6e
movq 0x10(%r14), %rax
movq %rax, -0x40(%rbp)
movups (%r14), %xmm0
movaps %xmm0, -0x50(%rbp)
movq 0x10(%rbx), %rax
movq %rax, 0x10(%r14)
movups (%rbx), %xmm0
movups %xmm0, (%r14)
movq 0x10(%r13), %rax
movq %rax, 0x10(%rbx)
movups (%r13), %xmm0
jmp 0xce3f
movq %r14, %rsi
movq %rbx, %rdx
callq 0xdbda
testb %al, %al
je 0xcda1
movq 0x10(%r14), %rax
movq %rax, -0x40(%rbp)
movups (%r14), %xmm0
movaps %xmm0, -0x50(%rbp)
movups (%r13), %xmm0
movups %xmm0, (%r14)
movq 0x10(%r13), %rax
movq %rax, 0x10(%r14)
jmp 0xce42
movq %r15, %rdi
movq %rbx, %rsi
movq %r13, %rdx
callq 0xdbda
testb %al, %al
je 0xcde8
movq 0x10(%rbx), %rax
movq %rax, -0x40(%rbp)
movups (%rbx), %xmm0
movaps %xmm0, -0x50(%rbp)
movups (%r13), %xmm0
movups %xmm0, (%rbx)
movq 0x10(%r13), %rax
movq %rax, 0x10(%rbx)
jmp 0xcdf9
movq %r15, %rdi
movq %r13, %rsi
movq %rbx, %rdx
callq 0xdbda
testb %al, %al
je 0xcdff
movq 0x10(%rbx), %rax
movq %rax, -0x40(%rbp)
movups (%rbx), %xmm0
movaps %xmm0, -0x50(%rbp)
movq -0x30(%rbp), %r14
movq 0x10(%r14), %rax
movq %rax, 0x10(%rbx)
movups (%r14), %xmm0
movups %xmm0, (%rbx)
movq 0x10(%r13), %rax
movq %rax, 0x10(%r14)
movups (%r13), %xmm0
movups %xmm0, (%r14)
jmp 0xce42
movq 0x10(%r13), %rax
movq %rax, -0x40(%rbp)
movups (%r13), %xmm0
movaps %xmm0, -0x50(%rbp)
movq -0x30(%rbp), %r14
jmp 0xce42
movq 0x10(%r13), %rax
movq %rax, -0x40(%rbp)
movups (%r13), %xmm0
movaps %xmm0, -0x50(%rbp)
movq -0x30(%rbp), %r14
movq 0x10(%r14), %rax
movq %rax, -0x60(%rbp)
movups (%r14), %xmm0
movaps %xmm0, -0x70(%rbp)
movq 0x10(%rbx), %rax
movq %rax, 0x10(%r14)
movups (%rbx), %xmm0
movups %xmm0, (%r14)
movq -0x60(%rbp), %rax
movq %rax, 0x10(%rbx)
movaps -0x70(%rbp), %xmm0
movups %xmm0, (%rbx)
leaq 0x18(%r14), %rax
leaq -0x30(%r12), %r14
movq 0x10(%r14), %rcx
movq %rcx, 0x10(%r13)
movups (%r14), %xmm0
movups %xmm0, (%r13)
movq %r14, %rbx
leaq -0x50(%rbp), %r12
movq %rax, %r13
movq %r15, %rdi
movq %r13, %rsi
movq %r12, %rdx
callq 0xdbda
testb %al, %al
je 0xce83
addq $0x18, %r13
cmpq %rbx, %r13
jb 0xce66
jmp 0xcee4
addq $-0x18, %rbx
movq %r15, %rdi
movq %r12, %rsi
movq %rbx, %rdx
callq 0xdbda
testb %al, %al
je 0xcea7
leaq -0x18(%rbx), %rax
cmpq %rbx, %r13
movq %rax, %rbx
jb 0xce87
jmp 0xcee4
movq 0x10(%r13), %rax
movq %rax, -0x60(%rbp)
movups (%r13), %xmm0
movaps %xmm0, -0x70(%rbp)
movq 0x10(%rbx), %rax
movq %rax, 0x10(%r13)
movups (%rbx), %xmm0
movups %xmm0, (%r13)
movq -0x60(%rbp), %rax
movq %rax, 0x10(%rbx)
movaps -0x70(%rbp), %xmm0
movups %xmm0, (%rbx)
leaq 0x18(%r13), %rax
cmpq %rbx, %rax
jb 0xce63
addq $0x18, %r13
movq 0x10(%r13), %rax
movq %rax, 0x10(%r14)
movups (%r13), %xmm0
movups %xmm0, (%r14)
movaps -0x50(%rbp), %xmm0
movups %xmm0, (%r13)
movq -0x40(%rbp), %rax
movq %rax, 0x10(%r13)
movq %r13, %rax
movq -0x30(%rbp), %rdi
subq %rdi, %rax
leaq 0x18(%r13), %r14
movq -0x78(%rbp), %rbx
movq %rbx, %rcx
subq %r14, %rcx
cmpq %rcx, %rax
jge 0xcf41
movq 0x10(%r15), %rax
movq %rax, 0x10(%rsp)
movups (%r15), %xmm0
movups %xmm0, (%rsp)
movq %r13, %rsi
callq 0xcc96
jmp 0xccb1
movq 0x10(%r15), %rax
movq %rax, 0x10(%rsp)
movups (%r15), %xmm0
movups %xmm0, (%rsp)
movq %r14, %rdi
movq %rbx, %rsi
callq 0xcc96
movq -0x30(%rbp), %r14
movq %r13, %rbx
jmp 0xccb1
movq 0x10(%r15), %rax
leaq -0x50(%rbp), %rbx
movq %rax, 0x10(%rbx)
movups (%r15), %xmm0
movaps %xmm0, (%rbx)
leaq -0x70(%rbp), %r15
movq %r14, %r12
addq $0x18, %r14
cmpq -0x78(%rbp), %r14
jae 0xd018
movq %rbx, %rdi
movq %r14, %rsi
movq %r12, %rdx
callq 0xdbda
movq -0x30(%rbp), %rcx
testb %al, %al
je 0xcf80
movq 0x10(%r14), %rax
movq %rax, -0x60(%rbp)
movups (%r14), %xmm0
movaps %xmm0, -0x70(%rbp)
movups (%r12), %xmm0
movups %xmm0, (%r14)
movq 0x10(%r12), %rax
movq %rax, 0x10(%r14)
cmpq %rcx, %r12
jbe 0xd001
leaq -0x18(%r12), %r13
movq %rbx, %rdi
movq %r15, %rsi
movq %r13, %rdx
callq 0xdbda
movq -0x30(%rbp), %rcx
testb %al, %al
je 0xd001
movq 0x10(%r13), %rax
movq %rax, 0x10(%r12)
movups (%r13), %xmm0
movups %xmm0, (%r12)
movq %r13, %r12
jmp 0xcfc9
movq -0x60(%rbp), %rax
movq %rax, 0x10(%r12)
movaps -0x70(%rbp), %xmm0
movups %xmm0, (%r12)
jmp 0xcf80
addq $0x68, %rsp
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
nop