// File: /workspace/github_c_makefile_star2_O2/GangZhuo[P]rbtree/rbtree.c
// Function: rbtree_remove_fixup
static void rbtree_remove_fixup(rbtree_t *tree, rbnode_t *x, rbnode_t *p)
{
	rbnode_t *b;

	while (!rbnode_is_nil(p) && rbnode_is_black(x)) {
		if (rbnode_is_nil(x) || rbnode_is_left(x)) {
			b = p->right;
			if (rbnode_is_red(b)) {
				rbnode_set_black(b);
				rbnode_set_red(p);
				rbtree_left_rotate(tree, p);
				b = p->right;
			}
			if (rbnode_is_nil(b) || (rbnode_is_black(b->right) && rbnode_is_black(b->left))) {
				if (!rbnode_is_nil(b))
					rbnode_set_red(b);
				x = p;
                p = p->parent;
			}
			else {
				if (rbnode_is_black(b->right)) {
					rbnode_set_black(b->left);
					rbnode_set_red(b);
					rbtree_right_rotate(tree, b);
					b = p->right;
				}
				else
					rbnode_set_black(b->right);
				b->color = p->color;
				rbnode_set_black(p);
				rbtree_left_rotate(tree, p);
				x = tree->root;
                p = rbnode_nil;
			}
		}
		else {
			b = p->left;
			if (rbnode_is_red(b)) {
				rbnode_set_black(b);
				rbnode_set_red(p);
				rbtree_right_rotate(tree, p);
				b = p->left;
			}
			if (rbnode_is_nil(b) || (rbnode_is_black(b->right) && rbnode_is_black(b->left))) {
				if (!rbnode_is_nil(b))
					rbnode_set_red(b);
				x = p;
                p = p->parent;
			}
			else {
				if (rbnode_is_black(b->left)) {
					rbnode_set_black(b->right);
					rbnode_set_red(b);
					rbtree_left_rotate(tree, b);
					b = p->left;
				}
				else
					rbnode_set_black(b->left);
				b->color = p->color;
				rbnode_set_black(p);
				rbtree_right_rotate(tree, p);
				x = tree->root;
                p = rbnode_nil;
			}
		}
	}
    if (!rbnode_is_nil(x))
        rbnode_set_black(x);
}

// Assembly:
pushq %r14
pushq %rbx
pushq %rax
movq %rdx, %r14
movq %rdi, %rbx
testq %r14, %r14
je 0x159c
testq %rsi, %rsi
je 0x149b
cmpl $0x0, 0x8(%rsi)
jne 0x15a1
movq 0x20(%rsi), %rax
cmpq %rsi, 0x10(%rax)
je 0x149b
movq 0x10(%r14), %rsi
testq %rsi, %rsi
je 0x1557
cmpl $0x1, 0x8(%rsi)
jne 0x1472
andl $0x0, 0x8(%rsi)
movl $0x1, 0x8(%r14)
movq %rbx, %rdi
movq %r14, %rsi
callq 0x1842
movq 0x10(%r14), %rsi
testq %rsi, %rsi
je 0x1557
movq 0x18(%rsi), %rax
testq %rax, %rax
je 0x1535
cmpl $0x0, 0x8(%rax)
je 0x1535
movq 0x10(%rsi), %rcx
testq %rcx, %rcx
jne 0x1544
jmp 0x1563
movq 0x18(%r14), %rsi
testq %rsi, %rsi
je 0x1557
cmpl $0x1, 0x8(%rsi)
jne 0x14d2
andl $0x0, 0x8(%rsi)
movl $0x1, 0x8(%r14)
movq %rbx, %rdi
movq %r14, %rsi
callq 0x1804
movq 0x18(%r14), %rsi
testq %rsi, %rsi
je 0x1557
movq 0x18(%rsi), %rax
testq %rax, %rax
je 0x14e7
cmpl $0x0, 0x8(%rax)
je 0x14e7
andl $0x0, 0x8(%rax)
jmp 0x151c
movq 0x10(%rsi), %rcx
testq %rcx, %rcx
je 0x1550
cmpl $0x0, 0x8(%rcx)
je 0x1550
testq %rax, %rax
je 0x1505
cmpl $0x0, 0x8(%rax)
jne 0x14e1
movq 0x10(%rsi), %rcx
andl $0x0, 0x8(%rcx)
movl $0x1, 0x8(%rsi)
movq %rbx, %rdi
callq 0x1842
movq 0x18(%r14), %rsi
movl 0x8(%r14), %eax
movl %eax, 0x8(%rsi)
andl $0x0, 0x8(%r14)
movq %rbx, %rdi
movq %r14, %rsi
callq 0x1804
jmp 0x1591
movq 0x10(%rsi), %rcx
testq %rcx, %rcx
je 0x1550
cmpl $0x0, 0x8(%rcx)
je 0x1550
cmpl $0x0, 0x8(%rcx)
je 0x1563
andl $0x0, 0x8(%rcx)
jmp 0x157a
movl $0x1, 0x8(%rsi)
movq %r14, %rsi
movq 0x20(%r14), %r14
jmp 0x1419
andl $0x0, 0x8(%rax)
movl $0x1, 0x8(%rsi)
movq %rbx, %rdi
callq 0x1804
movq 0x10(%r14), %rsi
movl 0x8(%r14), %eax
movl %eax, 0x8(%rsi)
andl $0x0, 0x8(%r14)
movq %rbx, %rdi
movq %r14, %rsi
callq 0x1842
movq (%rbx), %rsi
xorl %r14d, %r14d
jmp 0x1419
testq %rsi, %rsi
je 0x15a5
andl $0x0, 0x8(%rsi)
addq $0x8, %rsp
popq %rbx
popq %r14
retq