// File: chhylp123[P]hifiasm/ecovlp.cpp
// Function: debug_retrive_bqual(asg8_v*, asg8_v*, unsigned long, unsigned long)
void debug_retrive_bqual(asg8_v *vq, asg8_v *vt, uint64_t id, uint64_t rn)
{
    uint64_t k, n, z[2], s, e, rev;
    retrive_bqual(vq, NULL, id, -1, -1, 0, sc_bn); n = vq->n;
    retrive_bqual(vt, NULL, id, -1, -1, 1, sc_bn);
    assert(vq->n == vt->n);
    for (k = 0; k < vq->n && vq->a[k] == vt->a[vt->n - k - 1]; k++);
    // if((k == vq->n)) {
    //     fprintf(stderr, "[M::%s] id::%lu, k::%lu, n::%lu\n", __func__, id, k, ((uint64_t)vq->n));
    // }
    assert(k == vq->n);

    // if(id == 0) {
    //     s = 21519; e = 22332; rev = 0;
    //     retrive_bqual(vt, NULL, id, s, e, rev, sc_bn);
    //     if(memcmp(vq->a + s, vt->a, e - s)) {
    //         fprintf(stderr, "+[M::%s] id::%lu, t::[%lu, %lu), rev::%lu\n", __func__, id, s, e, rev);
    //         exit(1);
    //     }

    // }
    // return;

    for (k = 0, rev = 0; k < rn; k++) {
        z[0] = rand()%(n + 1); 
        z[1] = rand()%(n + 1); 
        if(z[0] == z[1]) continue;
        s = MIN(z[0], z[1]); e = MAX(z[0], z[1]);
        retrive_bqual(vt, NULL, id, s, e, rev, sc_bn);
        if(memcmp(vq->a + s, vt->a, e - s)) {
            fprintf(stderr, "[M::%s] id::%lu, t::[%lu, %lu), rev::%lu\n", __func__, id, s, e, rev);
            exit(1);
        }
    }
    

    retrive_bqual(vq, NULL, id, -1, -1, 1, sc_bn);
    for (k = 0, rev = 1; k < rn; k++) {
        z[0] = rand()%(n + 1); 
        z[1] = rand()%(n + 1); 
        if(z[0] == z[1]) continue;
        s = MIN(z[0], z[1]); e = MAX(z[0], z[1]);
        retrive_bqual(vt, NULL, id, s, e, rev, sc_bn);
        if(memcmp(vq->a + s, vt->a, e - s)) {
            fprintf(stderr, "[M::%s] id::%lu, t::[%lu, %lu), rev::%lu\n", __func__, id, s, e, rev);
            exit(1);
        }
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x90, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rdx
xorl %eax, %eax
movl %eax, %esi
movq $-0x1, %r8
xorl %r9d, %r9d
movq %r8, %rcx
movq $0x2, (%rsp)
callq 0xaec0
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x30(%rbp)
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rdx
xorl %eax, %eax
movl %eax, %esi
movq $-0x1, %r8
movl $0x1, %r9d
movq %r8, %rcx
movq $0x2, (%rsp)
callq 0xaec0
movq -0x8(%rbp), %rax
movq (%rax), %rax
movq -0x10(%rbp), %rcx
cmpq (%rcx), %rax
jne 0x258967
jmp 0x258986
leaq 0x136aa5(%rip), %rdi    # 0x38f413
leaq 0x136296(%rip), %rsi    # 0x38ec0b
movl $0xbdd, %edx            # imm = 0xBDD
leaq 0x136aa1(%rip), %rcx    # 0x38f422
callq 0x2130
movq $0x0, -0x28(%rbp)
movq -0x28(%rbp), %rcx
movq -0x8(%rbp), %rdx
xorl %eax, %eax
cmpq (%rdx), %rcx
movb %al, -0x59(%rbp)
jae 0x2589d3
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x28(%rbp), %rcx
movzbl (%rax,%rcx), %eax
movq -0x10(%rbp), %rcx
movq 0x10(%rcx), %rcx
movq -0x10(%rbp), %rdx
movq (%rdx), %rdx
subq -0x28(%rbp), %rdx
subq $0x1, %rdx
movzbl (%rcx,%rdx), %ecx
cmpl %ecx, %eax
sete %al
movb %al, -0x59(%rbp)
movb -0x59(%rbp), %al
testb $0x1, %al
jne 0x2589dc
jmp 0x2589ec
jmp 0x2589de
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0x25898e
movq -0x28(%rbp), %rax
movq -0x8(%rbp), %rcx
cmpq (%rcx), %rax
jne 0x2589fb
jmp 0x258a1a
leaq 0x136a61(%rip), %rdi    # 0x38f463
leaq 0x136202(%rip), %rsi    # 0x38ec0b
movl $0xbe2, %edx            # imm = 0xBE2
leaq 0x136a0d(%rip), %rcx    # 0x38f422
callq 0x2130
movq $0x0, -0x28(%rbp)
movq $0x0, -0x58(%rbp)
movq -0x28(%rbp), %rax
cmpq -0x20(%rbp), %rax
jae 0x258b5c
callq 0x2060
cltq
movq -0x30(%rbp), %rcx
addq $0x1, %rcx
xorl %edx, %edx
divq %rcx
movq %rdx, -0x40(%rbp)
callq 0x2060
cltq
movq -0x30(%rbp), %rcx
addq $0x1, %rcx
xorl %edx, %edx
divq %rcx
movq %rdx, -0x38(%rbp)
movq -0x40(%rbp), %rax
cmpq -0x38(%rbp), %rax
jne 0x258a77
jmp 0x258b4b
movq -0x40(%rbp), %rax
cmpq -0x38(%rbp), %rax
ja 0x258a8b
movq -0x40(%rbp), %rax
movq %rax, -0x68(%rbp)
jmp 0x258a93
movq -0x38(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x68(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x40(%rbp), %rax
cmpq -0x38(%rbp), %rax
jb 0x258aaf
movq -0x40(%rbp), %rax
movq %rax, -0x70(%rbp)
jmp 0x258ab7
movq -0x38(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rdx
movq -0x48(%rbp), %rcx
movq -0x50(%rbp), %r8
movq -0x58(%rbp), %rax
xorl %esi, %esi
movzbl %al, %r9d
movq $0x2, (%rsp)
callq 0xaec0
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rdi
addq -0x48(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rsi
movq -0x50(%rbp), %rdx
subq -0x48(%rbp), %rdx
callq 0x20b0
cmpl $0x0, %eax
je 0x258b49
movq 0x16b4cd(%rip), %rax    # 0x3c3fe0
movq (%rax), %rdi
movq -0x18(%rbp), %rcx
movq -0x48(%rbp), %r8
movq -0x50(%rbp), %r9
movq -0x58(%rbp), %rax
leaq 0x136941(%rip), %rsi    # 0x38f46e
leaq 0x136964(%rip), %rdx    # 0x38f498
movq %rax, (%rsp)
movb $0x0, %al
callq 0x22a0
movl $0x1, %edi
callq 0x2240
jmp 0x258b4b
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0x258a2a
movq -0x8(%rbp), %rdi
movq -0x18(%rbp), %rdx
xorl %eax, %eax
movl %eax, %esi
movq $-0x1, %r8
movl $0x1, %r9d
movq %r8, %rcx
movq $0x2, (%rsp)
callq 0xaec0
movq $0x0, -0x28(%rbp)
movq $0x1, -0x58(%rbp)
movq -0x28(%rbp), %rax
cmpq -0x20(%rbp), %rax
jae 0x258cc7
callq 0x2060
cltq
movq -0x30(%rbp), %rcx
addq $0x1, %rcx
xorl %edx, %edx
divq %rcx
movq %rdx, -0x40(%rbp)
callq 0x2060
cltq
movq -0x30(%rbp), %rcx
addq $0x1, %rcx
xorl %edx, %edx
divq %rcx
movq %rdx, -0x38(%rbp)
movq -0x40(%rbp), %rax
cmpq -0x38(%rbp), %rax
jne 0x258be2
jmp 0x258cb6
movq -0x40(%rbp), %rax
cmpq -0x38(%rbp), %rax
ja 0x258bf6
movq -0x40(%rbp), %rax
movq %rax, -0x78(%rbp)
jmp 0x258bfe
movq -0x38(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x78(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x40(%rbp), %rax
cmpq -0x38(%rbp), %rax
jb 0x258c1a
movq -0x40(%rbp), %rax
movq %rax, -0x80(%rbp)
jmp 0x258c22
movq -0x38(%rbp), %rax
movq %rax, -0x80(%rbp)
movq -0x80(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rdx
movq -0x48(%rbp), %rcx
movq -0x50(%rbp), %r8
movq -0x58(%rbp), %rax
xorl %esi, %esi
movzbl %al, %r9d
movq $0x2, (%rsp)
callq 0xaec0
movq -0x8(%rbp), %rax
movq 0x10(%rax), %rdi
addq -0x48(%rbp), %rdi
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rsi
movq -0x50(%rbp), %rdx
subq -0x48(%rbp), %rdx
callq 0x20b0
cmpl $0x0, %eax
je 0x258cb4
movq 0x16b362(%rip), %rax    # 0x3c3fe0
movq (%rax), %rdi
movq -0x18(%rbp), %rcx
movq -0x48(%rbp), %r8
movq -0x50(%rbp), %r9
movq -0x58(%rbp), %rax
leaq 0x1367d6(%rip), %rsi    # 0x38f46e
leaq 0x1367f9(%rip), %rdx    # 0x38f498
movq %rax, (%rsp)
movb $0x0, %al
callq 0x22a0
movl $0x1, %edi
callq 0x2240
jmp 0x258cb6
movq -0x28(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x28(%rbp)
jmp 0x258b95
addq $0x90, %rsp
popq %rbp
retq