// File: /workspace/github_c_makefile_star2_O3/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:
testq %rdx, %rdx
je 0x17de
movq %rsi, %rax
movq %rdx, %rsi
testq %rax, %rax
je 0x15d0
cmpl $0x0, 0x8(%rax)
jne 0x1669
movq 0x20(%rax), %rcx
cmpq %rax, 0x10(%rcx)
je 0x15d0
movq 0x10(%rsi), %rax
testq %rax, %rax
je 0x1657
cmpl $0x1, 0x8(%rax)
jne 0x15a1
movl $0x0, 0x8(%rax)
movl $0x1, 0x8(%rsi)
movq 0x18(%rax), %rcx
movq %rcx, 0x10(%rsi)
testq %rcx, %rcx
je 0x1569
movq %rsi, 0x20(%rcx)
movq 0x20(%rsi), %rdx
movq %rdx, 0x20(%rax)
movq %rdi, %rcx
testq %rdx, %rdx
je 0x1589
leaq 0x10(%rdx), %r8
leaq 0x18(%rdx), %rcx
cmpq %rsi, 0x10(%rdx)
cmoveq %r8, %rcx
movq %rax, (%rcx)
movq %rsi, 0x18(%rax)
movq %rax, 0x20(%rsi)
movq 0x10(%rsi), %rax
testq %rax, %rax
je 0x1657
movq 0x18(%rax), %rcx
testq %rcx, %rcx
je 0x15b4
cmpl $0x0, 0x8(%rcx)
jne 0x1690
movq 0x10(%rax), %rdx
testq %rdx, %rdx
je 0x1650
cmpl $0x0, 0x8(%rdx)
je 0x1650
jmp 0x1699
movq 0x18(%rsi), %rax
testq %rax, %rax
je 0x1657
cmpl $0x1, 0x8(%rax)
jne 0x1632
movl $0x0, 0x8(%rax)
movl $0x1, 0x8(%rsi)
movq 0x10(%rax), %rcx
movq %rcx, 0x18(%rsi)
testq %rcx, %rcx
je 0x15fe
movq %rsi, 0x20(%rcx)
movq 0x20(%rsi), %rdx
movq %rdx, 0x20(%rax)
movq %rdi, %rcx
testq %rdx, %rdx
je 0x161e
leaq 0x10(%rdx), %r8
leaq 0x18(%rdx), %rcx
cmpq %rsi, 0x10(%rdx)
cmoveq %r8, %rcx
movq %rax, (%rcx)
movq %rsi, 0x10(%rax)
movq %rax, 0x20(%rsi)
movq 0x18(%rsi), %rax
testq %rax, %rax
je 0x1657
movq 0x18(%rax), %rdx
testq %rdx, %rdx
je 0x1641
cmpl $0x0, 0x8(%rdx)
jne 0x1684
movq 0x10(%rax), %rcx
testq %rcx, %rcx
je 0x1650
cmpl $0x0, 0x8(%rcx)
jne 0x1671
movl $0x1, 0x8(%rax)
movq 0x20(%rsi), %rdx
testq %rdx, %rdx
jne 0x1510
jmp 0x17e3
movq %rax, %rsi
jmp 0x17e3
testq %rdx, %rdx
je 0x1744
cmpl $0x0, 0x8(%rdx)
je 0x1740
movl $0x0, 0x8(%rdx)
jmp 0x1792
movq 0x10(%rax), %rdx
testq %rdx, %rdx
je 0x16a8
cmpl $0x0, 0x8(%rdx)
je 0x16a8
movl $0x0, 0x8(%rdx)
jmp 0x16fa
movl $0x0, 0x8(%rcx)
movl $0x1, 0x8(%rax)
movq 0x10(%rcx), %rdx
movq %rdx, 0x18(%rax)
testq %rdx, %rdx
je 0x16c7
movq %rax, 0x20(%rdx)
movq 0x20(%rax), %r8
movq %r8, 0x20(%rcx)
movq %rdi, %rdx
testq %r8, %r8
je 0x16e7
leaq 0x10(%r8), %r9
leaq 0x18(%r8), %rdx
cmpq %rax, 0x10(%r8)
cmoveq %r9, %rdx
movq %rcx, (%rdx)
movq %rax, 0x10(%rcx)
movq %rcx, 0x20(%rax)
movq 0x10(%rsi), %rax
movq 0x18(%rax), %rcx
movl 0x8(%rsi), %edx
movl %edx, 0x8(%rax)
movl $0x0, 0x8(%rsi)
movq %rcx, 0x10(%rsi)
testq %rcx, %rcx
je 0x1714
movq %rsi, 0x20(%rcx)
movq 0x20(%rsi), %rdx
movq %rdx, 0x20(%rax)
movq %rdi, %rcx
testq %rdx, %rdx
je 0x1734
leaq 0x10(%rdx), %r8
leaq 0x18(%rdx), %rcx
cmpq %rsi, 0x10(%rdx)
cmoveq %r8, %rcx
movq %rax, (%rcx)
movq %rsi, 0x18(%rax)
jmp 0x17d7
movq 0x10(%rax), %rcx
movl $0x0, 0x8(%rcx)
movl $0x1, 0x8(%rax)
movq 0x18(%rcx), %rdx
movq %rdx, 0x10(%rax)
testq %rdx, %rdx
je 0x1763
movq %rax, 0x20(%rdx)
movq 0x20(%rax), %r8
movq %r8, 0x20(%rcx)
movq %rdi, %rdx
testq %r8, %r8
je 0x1783
leaq 0x10(%r8), %r9
leaq 0x18(%r8), %rdx
cmpq %rax, 0x10(%r8)
cmoveq %r9, %rdx
movq %rcx, (%rdx)
movq %rax, 0x18(%rcx)
movq %rcx, 0x20(%rax)
movq 0x18(%rsi), %rax
movl 0x8(%rsi), %ecx
movl %ecx, 0x8(%rax)
movl $0x0, 0x8(%rsi)
movq 0x10(%rax), %rcx
movq %rcx, 0x18(%rsi)
testq %rcx, %rcx
je 0x17b0
movq %rsi, 0x20(%rcx)
movq 0x20(%rsi), %rdx
movq %rdx, 0x20(%rax)
movq %rdi, %rcx
testq %rdx, %rdx
je 0x17d0
leaq 0x10(%rdx), %r8
leaq 0x18(%rdx), %rcx
cmpq %rsi, 0x10(%rdx)
cmoveq %r8, %rcx
movq %rax, (%rcx)
movq %rsi, 0x10(%rax)
movq %rax, 0x20(%rsi)
movq (%rdi), %rsi
testq %rsi, %rsi
je 0x17ea
movl $0x0, 0x8(%rsi)
retq