// File: /workspace/github_c_makefile_star2_O0/aerospike[P]aerospike-common/src/main/citrusleaf/cf_queue.c
// Function: cf_queue_push_index
int
cf_queue_push_index(cf_queue *q, const void *ptr, uint32_t ix)
{
	cf_queue_lock(q);

	uint32_t size = CF_Q_SZ(q);

	if (size == q->alloc_sz) {
		if (0 != cf_queue_resize(q, q->alloc_sz * 2)) {
			cf_queue_unlock(q);
			return CF_QUEUE_ERR;
		}
	}

	if (ix >= size) { // off the end - put element at tail
		memcpy(CF_Q_ELEM_PTR(q, q->write_offset), ptr, q->element_sz);
		q->write_offset++;
	}
	else if (ix > size / 2) { // nearer tail - move tail
		uint8_t *wp = CF_Q_ELEM_PTR(q, (q->read_offset + ix));
		uint8_t *tp = CF_Q_ELEM_PTR(q, q->write_offset);

		if (tp > wp) {
			memmove(wp + q->element_sz, wp, tp - wp);
		}
		else { // tp < wp - can't be equal
			memmove(q->elements + q->element_sz, q->elements, tp - q->elements);

			uint8_t *ep = q->elements + ((q->alloc_sz - 1) * q->element_sz);

			memcpy(q->elements, ep, q->element_sz);
			memmove(wp + q->element_sz, wp, ep - wp);
		}

		memcpy(wp, ptr, q->element_sz);
		q->write_offset++;
	}
	else { // nearer head - move head
		if (q->read_offset == 0) {
			q->read_offset += q->alloc_sz;
			q->write_offset += q->alloc_sz;
		}

		q->read_offset--;

		uint8_t *wp = CF_Q_ELEM_PTR(q, (q->read_offset + ix));
		uint8_t *hp = CF_Q_ELEM_PTR(q, q->read_offset);

		if (hp <= wp) {
			memmove(hp, hp + q->element_sz, wp - hp);
		}
		else { // hp > wp
			uint8_t *ep = q->elements + ((q->alloc_sz - 1) * q->element_sz);

			memmove(hp, hp + q->element_sz, ep - hp);
			memcpy(ep, q->elements, q->element_sz);
			memmove(q->elements, q->elements + q->element_sz, wp - q->elements);
		}

		memcpy(wp, ptr, q->element_sz);
	}

	q->n_eles++;
	cf_queue_unwrap(q);

	if (q->threadsafe) {
		pthread_cond_signal(&q->CV);
	}

	cf_queue_unlock(q);
	return CF_QUEUE_OK;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x70, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movl %edx, -0x1c(%rbp)
movq -0x10(%rbp), %rdi
callq 0x25260
movq -0x10(%rbp), %rax
movl 0xc(%rax), %eax
movq -0x10(%rbp), %rcx
subl 0x8(%rcx), %eax
movl %eax, -0x20(%rbp)
movl -0x20(%rbp), %eax
movq -0x10(%rbp), %rcx
cmpl 0x4(%rcx), %eax
jne 0x2562a
movq -0x10(%rbp), %rdi
movq -0x10(%rbp), %rax
movl 0x4(%rax), %esi
shll %esi
callq 0x25290
movl %eax, %ecx
xorl %eax, %eax
cmpl %ecx, %eax
je 0x25628
movq -0x10(%rbp), %rdi
callq 0x25420
movl $0xffffffff, -0x4(%rbp) # imm = 0xFFFFFFFF
jmp 0x2597c
jmp 0x2562a
movl -0x1c(%rbp), %eax
cmpl -0x20(%rbp), %eax
jb 0x2567b
movq -0x10(%rbp), %rax
movq 0x78(%rax), %rdi
movq -0x10(%rbp), %rax
movl 0xc(%rax), %eax
movq -0x10(%rbp), %rcx
xorl %edx, %edx
divl 0x4(%rcx)
movl %edx, %eax
movq -0x10(%rbp), %rcx
imulq 0x18(%rcx), %rax
addq %rax, %rdi
movq -0x18(%rbp), %rsi
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdx
callq 0x86b0
movq -0x10(%rbp), %rax
movl 0xc(%rax), %ecx
addl $0x1, %ecx
movl %ecx, 0xc(%rax)
jmp 0x25940
movl -0x1c(%rbp), %eax
movl -0x20(%rbp), %ecx
shrl %ecx
cmpl %ecx, %eax
jbe 0x257d1
movq -0x10(%rbp), %rax
movq 0x78(%rax), %rax
movq %rax, -0x60(%rbp)
movq -0x10(%rbp), %rax
movl 0x8(%rax), %eax
addl -0x1c(%rbp), %eax
movq -0x10(%rbp), %rcx
xorl %edx, %edx
divl 0x4(%rcx)
movq -0x60(%rbp), %rax
movl %edx, %ecx
movq -0x10(%rbp), %rdx
imulq 0x18(%rdx), %rcx
addq %rcx, %rax
movq %rax, -0x28(%rbp)
movq -0x10(%rbp), %rax
movq 0x78(%rax), %rax
movq %rax, -0x58(%rbp)
movq -0x10(%rbp), %rax
movl 0xc(%rax), %eax
movq -0x10(%rbp), %rcx
xorl %edx, %edx
divl 0x4(%rcx)
movq -0x58(%rbp), %rax
movl %edx, %ecx
movq -0x10(%rbp), %rdx
imulq 0x18(%rdx), %rcx
addq %rcx, %rax
movq %rax, -0x30(%rbp)
movq -0x30(%rbp), %rax
cmpq -0x28(%rbp), %rax
jbe 0x25721
movq -0x28(%rbp), %rdi
movq -0x10(%rbp), %rax
addq 0x18(%rax), %rdi
movq -0x28(%rbp), %rsi
movq -0x30(%rbp), %rdx
movq -0x28(%rbp), %rax
subq %rax, %rdx
callq 0x8970
jmp 0x257aa
movq -0x10(%rbp), %rax
movq 0x78(%rax), %rdi
movq -0x10(%rbp), %rax
addq 0x18(%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x78(%rax), %rsi
movq -0x30(%rbp), %rdx
movq -0x10(%rbp), %rax
movq 0x78(%rax), %rax
subq %rax, %rdx
callq 0x8970
movq -0x10(%rbp), %rax
movq 0x78(%rax), %rax
movq -0x10(%rbp), %rcx
movl 0x4(%rcx), %ecx
subl $0x1, %ecx
movl %ecx, %ecx
movq -0x10(%rbp), %rdx
imulq 0x18(%rdx), %rcx
addq %rcx, %rax
movq %rax, -0x38(%rbp)
movq -0x10(%rbp), %rax
movq 0x78(%rax), %rdi
movq -0x38(%rbp), %rsi
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdx
callq 0x86b0
movq -0x28(%rbp), %rdi
movq -0x10(%rbp), %rax
addq 0x18(%rax), %rdi
movq -0x28(%rbp), %rsi
movq -0x38(%rbp), %rdx
movq -0x28(%rbp), %rax
subq %rax, %rdx
callq 0x8970
movq -0x28(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdx
callq 0x86b0
movq -0x10(%rbp), %rax
movl 0xc(%rax), %ecx
addl $0x1, %ecx
movl %ecx, 0xc(%rax)
jmp 0x2593e
movq -0x10(%rbp), %rax
cmpl $0x0, 0x8(%rax)
jne 0x257fd
movq -0x10(%rbp), %rax
movl 0x4(%rax), %ecx
movq -0x10(%rbp), %rax
addl 0x8(%rax), %ecx
movl %ecx, 0x8(%rax)
movq -0x10(%rbp), %rax
movl 0x4(%rax), %ecx
movq -0x10(%rbp), %rax
addl 0xc(%rax), %ecx
movl %ecx, 0xc(%rax)
movq -0x10(%rbp), %rax
movl 0x8(%rax), %ecx
addl $-0x1, %ecx
movl %ecx, 0x8(%rax)
movq -0x10(%rbp), %rax
movq 0x78(%rax), %rax
movq %rax, -0x70(%rbp)
movq -0x10(%rbp), %rax
movl 0x8(%rax), %eax
addl -0x1c(%rbp), %eax
movq -0x10(%rbp), %rcx
xorl %edx, %edx
divl 0x4(%rcx)
movq -0x70(%rbp), %rax
movl %edx, %ecx
movq -0x10(%rbp), %rdx
imulq 0x18(%rdx), %rcx
addq %rcx, %rax
movq %rax, -0x40(%rbp)
movq -0x10(%rbp), %rax
movq 0x78(%rax), %rax
movq %rax, -0x68(%rbp)
movq -0x10(%rbp), %rax
movl 0x8(%rax), %eax
movq -0x10(%rbp), %rcx
xorl %edx, %edx
divl 0x4(%rcx)
movq -0x68(%rbp), %rax
movl %edx, %ecx
movq -0x10(%rbp), %rdx
imulq 0x18(%rdx), %rcx
addq %rcx, %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
cmpq -0x40(%rbp), %rax
ja 0x258a0
movq -0x48(%rbp), %rdi
movq -0x48(%rbp), %rsi
movq -0x10(%rbp), %rax
addq 0x18(%rax), %rsi
movq -0x40(%rbp), %rdx
movq -0x48(%rbp), %rax
subq %rax, %rdx
callq 0x8970
jmp 0x25929
movq -0x10(%rbp), %rax
movq 0x78(%rax), %rax
movq -0x10(%rbp), %rcx
movl 0x4(%rcx), %ecx
subl $0x1, %ecx
movl %ecx, %ecx
movq -0x10(%rbp), %rdx
imulq 0x18(%rdx), %rcx
addq %rcx, %rax
movq %rax, -0x50(%rbp)
movq -0x48(%rbp), %rdi
movq -0x48(%rbp), %rsi
movq -0x10(%rbp), %rax
addq 0x18(%rax), %rsi
movq -0x50(%rbp), %rdx
movq -0x48(%rbp), %rax
subq %rax, %rdx
callq 0x8970
movq -0x50(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x78(%rax), %rsi
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdx
callq 0x86b0
movq -0x10(%rbp), %rax
movq 0x78(%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x78(%rax), %rsi
movq -0x10(%rbp), %rax
addq 0x18(%rax), %rsi
movq -0x40(%rbp), %rdx
movq -0x10(%rbp), %rax
movq 0x78(%rax), %rax
subq %rax, %rdx
callq 0x8970
movq -0x40(%rbp), %rdi
movq -0x18(%rbp), %rsi
movq -0x10(%rbp), %rax
movq 0x18(%rax), %rdx
callq 0x86b0
jmp 0x25940
movq -0x10(%rbp), %rax
movl 0x10(%rax), %ecx
addl $0x1, %ecx
movl %ecx, 0x10(%rax)
movq -0x10(%rbp), %rdi
callq 0x25450
movq -0x10(%rbp), %rax
testb $0x1, (%rax)
je 0x2596c
movq -0x10(%rbp), %rdi
addq $0x48, %rdi
callq 0x8580
movq -0x10(%rbp), %rdi
callq 0x25420
movl $0x0, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x70, %rsp
popq %rbp
retq
nopw %cs:(%rax,%rax)
nop