// File: /workspace/github_c_makefile_star2_O0/nilyang[P]redis-tdd-annotation/src/t_zset.c
// Function: zslDelete
int zslDelete(zskiplist *zsl, double score, robj *obj) {
    zskiplistNode *update[ZSKIPLIST_MAXLEVEL], *x;
    int i;

    // 遍历跳跃表，查找目标节点，并记录所有沿途节点
    // T_wrost = O(N^2), T_avg = O(N log N)
    x = zsl->header;
    for (i = zsl->level-1; i >= 0; i--) {

        // 遍历跳跃表的复杂度为 T_wrost = O(N), T_avg = O(log N)
        while (x->level[i].forward &&
            (x->level[i].forward->score < score ||
                // 比对分值
                (x->level[i].forward->score == score &&
                // 比对对象，T = O(N)
                compareStringObjects(x->level[i].forward->obj,obj) < 0)))

            // 沿着前进指针移动
            x = x->level[i].forward;

        // 记录沿途节点
        update[i] = x;
    }

    /* We may have multiple elements with the same score, what we need
     * is to find the element with both the right score and object. 
     *
     * 检查找到的元素 x ，只有在它的分值和对象都相同时，才将它删除。
     */
    x = x->level[0].forward;
    if (x && score == x->score && equalStringObjects(x->obj,obj)) {
        // T = O(1)
        zslDeleteNode(zsl, x, update);
        // T = O(1)
        zslFreeNode(x);
        return 1;
    } else {
        return 0; /* not found */
    }

    return 0; /* not found */
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x130, %rsp            # imm = 0x130
movq %rdi, -0x10(%rbp)
movsd %xmm0, -0x18(%rbp)
movq %rsi, -0x20(%rbp)
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x128(%rbp)
movq -0x10(%rbp), %rax
movl 0x18(%rax), %eax
subl $0x1, %eax
movl %eax, -0x12c(%rbp)
cmpl $0x0, -0x12c(%rbp)
jl 0x4da30
jmp 0x4d8f5
movq -0x128(%rbp), %rcx
addq $0x18, %rcx
movslq -0x12c(%rbp), %rax
shlq $0x4, %rax
addq %rax, %rcx
xorl %eax, %eax
cmpq $0x0, (%rcx)
movb %al, -0x12d(%rbp)
je 0x4d9d2
movq -0x128(%rbp), %rax
addq $0x18, %rax
movslq -0x12c(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movq (%rax), %rax
movsd 0x8(%rax), %xmm1
movsd -0x18(%rbp), %xmm0
movb $0x1, %al
ucomisd %xmm1, %xmm0
movb %al, -0x12e(%rbp)
ja 0x4d9c6
movq -0x128(%rbp), %rax
addq $0x18, %rax
movslq -0x12c(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movq (%rax), %rax
movsd 0x8(%rax), %xmm0
xorl %eax, %eax
ucomisd -0x18(%rbp), %xmm0
movb %al, -0x12f(%rbp)
jne 0x4d9ba
jp 0x4d9ba
movq -0x128(%rbp), %rax
addq $0x18, %rax
movslq -0x12c(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movq (%rax), %rax
movq (%rax), %rdi
movq -0x20(%rbp), %rsi
callq 0x3b1e0
cmpl $0x0, %eax
setl %al
movb %al, -0x12f(%rbp)
movb -0x12f(%rbp), %al
movb %al, -0x12e(%rbp)
movb -0x12e(%rbp), %al
movb %al, -0x12d(%rbp)
movb -0x12d(%rbp), %al
testb $0x1, %al
jne 0x4d9de
jmp 0x4da06
movq -0x128(%rbp), %rax
addq $0x18, %rax
movslq -0x12c(%rbp), %rcx
shlq $0x4, %rcx
addq %rcx, %rax
movq (%rax), %rax
movq %rax, -0x128(%rbp)
jmp 0x4d8f5
movq -0x128(%rbp), %rcx
movslq -0x12c(%rbp), %rax
movq %rcx, -0x120(%rbp,%rax,8)
movl -0x12c(%rbp), %eax
addl $-0x1, %eax
movl %eax, -0x12c(%rbp)
jmp 0x4d8e6
movq -0x128(%rbp), %rax
movq 0x18(%rax), %rax
movq %rax, -0x128(%rbp)
cmpq $0x0, -0x128(%rbp)
je 0x4daa5
movsd -0x18(%rbp), %xmm0
movq -0x128(%rbp), %rax
ucomisd 0x8(%rax), %xmm0
jne 0x4daa5
jp 0x4daa5
movq -0x128(%rbp), %rax
movq (%rax), %rdi
movq -0x20(%rbp), %rsi
callq 0x3b240
cmpl $0x0, %eax
je 0x4daa5
movq -0x10(%rbp), %rdi
movq -0x128(%rbp), %rsi
leaq -0x120(%rbp), %rdx
callq 0x4d720
movq -0x128(%rbp), %rdi
callq 0x4d120
movl $0x1, -0x4(%rbp)
jmp 0x4daac
movl $0x0, -0x4(%rbp)
movl -0x4(%rbp), %eax
addq $0x130, %rsp            # imm = 0x130
popq %rbp
retq
nopl (%rax,%rax)