// File: /workspace/github_c_makefile_star2_O2/chatziko-k08[P]lecture-code/tests/../modules/UsingBTree/ADTSet.c
// Function: repair_underflow
static void repair_underflow(BTreeNode node) {
	// Εαν δοθεί κενός ή μη-ελλιπής κόμβος ή η ρίζα, το δέντρο δε χρειάζεται αναδιαμόρφωση.
	if (node == NULL || node->count >= MIN_VALUES || node->parent == NULL)
		return;

	BTreeNode left_sibling  = get_left_sibling(node);
	BTreeNode right_sibling = get_right_sibling(node);

	// Εαν υπάρχει ο δεξιός αδερφός & έχει περισσότερα δεδομένα από τα ελάχιστα δυνατά, κάνε αριστερή περιστροφή.
	if (right_sibling != NULL && right_sibling->count > MIN_VALUES)
		transfer_left(node, right_sibling);
	
	// Εαν υπάρχει ο αριστερός αδερφός & έχει περισσότερα δεδομένα από τα ελάχιστα δυνατά, κάνε δεξιά περιστροφή.
	else if (left_sibling != NULL && left_sibling->count > MIN_VALUES)
		tranfer_right(node, left_sibling);

	// Εαν υπάρχει ο αριστερός αδερφός, συγχώνευσέ τον με τον ελλιπή κόμβο, παίρνοντας μια διαχωριστική τιμή από τον πατέρα.
	else if (left_sibling != NULL) 
		merge(left_sibling, node);

	else // Εαν υπάρχει ο δεξιός αδερφός, συγχώνευσέ τον με τον ελλιπή κόμβο, παίρνοντας μια διαχωριστική τιμή από τον πατέρα.
		merge(node, right_sibling);
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
pushq %rax
testq %rdi, %rdi
je 0x5504
movq %rdi, %rbx
movl (%rdi), %edx
cmpl $0x1, %edx
jg 0x5504
movq 0x8(%rbx), %r12
testq %r12, %r12
je 0x5504
xorl %r14d, %r14d
movslq (%r12), %rax
cmpq %rbx, 0x10(%r12)
je 0x53c1
testl %eax, %eax
movl $0x0, %ecx
cmovgl %eax, %ecx
xorl %esi, %esi
cmpq %rsi, %rcx
je 0x53c1
cmpq %rbx, 0x18(%r12,%rsi,8)
je 0x53bc
incq %rsi
jmp 0x53ab
movq 0x10(%r12,%rsi,8), %r14
xorl %r15d, %r15d
cmpq %rbx, 0x10(%r12,%rax,8)
je 0x5468
testl %eax, %eax
cmovlel %r15d, %eax
xorl %ecx, %ecx
cmpq %rcx, %rax
je 0x5468
leaq 0x1(%rcx), %rsi
cmpq %rbx, 0x10(%r12,%rcx,8)
movq %rsi, %rcx
jne 0x53d7
movq 0x10(%r12,%rsi,8), %r15
testq %r15, %r15
je 0x5465
cmpl $0x3, (%r15)
jl 0x5468
leaq 0x38(%r12), %r14
movq %r14, %rax
addq $0x8, %r14
cmpq %rbx, -0x28(%rax)
jne 0x5403
movq (%r14), %rsi
movq %rbx, %rdi
callq 0x55df
movq 0x40(%r15), %rax
movq %rax, (%r14)
movq %r12, 0x8(%rax)
cmpq $0x0, 0x10(%rbx)
je 0x543b
movq 0x10(%r15), %rsi
movl (%rbx), %edx
movq %rbx, %rdi
callq 0x560a
movl (%r15), %eax
leal -0x1(%rax), %ecx
xorl %edx, %edx
testl %ecx, %ecx
movl $0x0, %esi
cmovgl %ecx, %esi
cmpq %rdx, %rsi
je 0x54e6
movq 0x48(%r15,%rdx,8), %rdi
movq %rdi, 0x40(%r15,%rdx,8)
incq %rdx
jmp 0x544d
xorl %r15d, %r15d
testq %r14, %r14
je 0x54c3
cmpl $0x3, (%r14)
jl 0x54cb
pushq $-0x1
popq %rax
movq %rax, %rcx
incq %rax
cmpq %rbx, 0x20(%r12,%rcx,8)
jne 0x5476
movl %eax, %r15d
movq 0x40(%r12,%r15,8), %rsi
movq %rbx, %rdi
xorl %edx, %edx
callq 0x55df
movslq (%r14), %rax
movq 0x38(%r14,%rax,8), %rcx
movq %rcx, 0x40(%r12,%r15,8)
movq %r12, 0x8(%rcx)
cmpq $0x0, 0x10(%rbx)
je 0x54de
movq 0x10(%r14,%rax,8), %rsi
movq %rbx, %rdi
xorl %edx, %edx
callq 0x560a
movl (%r14), %eax
decl %eax
jmp 0x54e1
movq %rbx, %rdi
movq %r15, %rsi
jmp 0x54d1
movq %r14, %rdi
movq %rbx, %rsi
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
jmp 0x5510
decq %rax
movl %eax, (%r14)
jmp 0x5504
xorl %edx, %edx
testl %eax, %eax
cmovlel %edx, %eax
cmpq %rdx, %rax
je 0x5501
movq 0x18(%r15,%rdx,8), %rsi
movq %rsi, 0x10(%r15,%rdx,8)
incq %rdx
jmp 0x54ed
movl %ecx, (%r15)
addq $0x8, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq