// File: chhylp123[P]hifiasm/Correct.cpp
// Function: retrieve_cigar_xcoord(bit_extz_t*, long, long, long*, long*, long*, long*, long*)
void retrieve_cigar_xcoord(bit_extz_t *ez, int64_t is, int64_t ie, int64_t *yk, int64_t *xk, int64_t *ck, int64_t *rxs, int64_t *rxe)
{
    if(!ez->cigar.n) return;
    int64_t cn = ez->cigar.n, op; int64_t ws, we, ws0, we0, os, oe;
    if(((*ck) < 0) || ((*ck) > cn)) {//(*ck) == cn is allowed
        (*ck) = 0; (*yk) = ez->ps; (*xk) = ez->ts; 
    }

    while ((*ck) > 0 && (*yk) > is) {
        --(*ck);
        op = ez->cigar.a[(*ck)]>>14;
        if(op!=3) (*yk) -= (ez->cigar.a[(*ck)]&(0x3fff));
        if(op!=2) (*xk) -= (ez->cigar.a[(*ck)]&(0x3fff));
    }

    //some cigar will span s or e
    while ((*ck) < cn && (*yk) < ie) {//[s, e)
        ws = (*yk); ws0 = (*xk); 
        op = ez->cigar.a[(*ck)]>>14;
        if(op!=3) (*yk) += (ez->cigar.a[(*ck)]&(0x3fff));
        if(op!=2) (*xk) += (ez->cigar.a[(*ck)]&(0x3fff));
        we = (*yk); we0 = (*xk); 
        if(ws >= is && we <= ie) {///the cigar is fully contained
            if((*rxs) > ws0) (*rxs) = ws0;
            if((*rxe) < we0) (*rxe) = we0;
        } else if(op == 0 || op == 1) {///overlap, it is hard to handle indels
            os = MAX(is, ws); oe = MIN(ie, we);
            if(oe > os) {
                ws0 += (os - ws);
                we0 = ws0 + (oe - os);
                if((*rxs) > ws0) (*rxs) = ws0;
                if((*rxe) < we0) (*rxe) = we0;
            }
        }
        (*ck)++;
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %rax
movq 0x18(%rbp), %rax
movq 0x10(%rbp), %rax
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq %r8, -0x28(%rbp)
movq %r9, -0x30(%rbp)
movq -0x8(%rbp), %rax
cmpq $0x0, 0xa8(%rax)
jne 0x7e4a8
jmp 0x7e7b7
movq -0x8(%rbp), %rax
movq 0xa8(%rax), %rax
movq %rax, -0x38(%rbp)
movq -0x30(%rbp), %rax
cmpq $0x0, (%rax)
jl 0x7e4ce
movq -0x30(%rbp), %rax
movq (%rax), %rax
cmpq -0x38(%rbp), %rax
jle 0x7e4f7
movq -0x30(%rbp), %rax
movq $0x0, (%rax)
movq -0x8(%rbp), %rax
movslq 0x10(%rax), %rcx
movq -0x20(%rbp), %rax
movq %rcx, (%rax)
movq -0x8(%rbp), %rax
movslq 0x1c(%rax), %rcx
movq -0x28(%rbp), %rax
movq %rcx, (%rax)
jmp 0x7e4f9
movq -0x30(%rbp), %rcx
xorl %eax, %eax
cmpq $0x0, (%rcx)
movb %al, -0x71(%rbp)
jle 0x7e519
movq -0x20(%rbp), %rax
movq (%rax), %rax
cmpq -0x10(%rbp), %rax
setg %al
movb %al, -0x71(%rbp)
movb -0x71(%rbp), %al
testb $0x1, %al
jne 0x7e525
jmp 0x7e5bb
movq -0x30(%rbp), %rax
movq (%rax), %rcx
addq $-0x1, %rcx
movq %rcx, (%rax)
movq -0x8(%rbp), %rax
movq 0xb8(%rax), %rax
movq -0x30(%rbp), %rcx
movq (%rcx), %rcx
movzwl (%rax,%rcx,2), %eax
sarl $0xe, %eax
cltq
movq %rax, -0x40(%rbp)
cmpq $0x3, -0x40(%rbp)
je 0x7e584
movq -0x8(%rbp), %rax
movq 0xb8(%rax), %rax
movq -0x30(%rbp), %rcx
movq (%rcx), %rcx
movzwl (%rax,%rcx,2), %eax
andl $0x3fff, %eax           # imm = 0x3FFF
movslq %eax, %rdx
movq -0x20(%rbp), %rax
movq (%rax), %rcx
subq %rdx, %rcx
movq %rcx, (%rax)
cmpq $0x2, -0x40(%rbp)
je 0x7e5b6
movq -0x8(%rbp), %rax
movq 0xb8(%rax), %rax
movq -0x30(%rbp), %rcx
movq (%rcx), %rcx
movzwl (%rax,%rcx,2), %eax
andl $0x3fff, %eax           # imm = 0x3FFF
movslq %eax, %rdx
movq -0x28(%rbp), %rax
movq (%rax), %rcx
subq %rdx, %rcx
movq %rcx, (%rax)
jmp 0x7e4f9
jmp 0x7e5bd
movq -0x30(%rbp), %rax
movq (%rax), %rcx
xorl %eax, %eax
cmpq -0x38(%rbp), %rcx
movb %al, -0x72(%rbp)
jge 0x7e5e0
movq -0x20(%rbp), %rax
movq (%rax), %rax
cmpq -0x18(%rbp), %rax
setl %al
movb %al, -0x72(%rbp)
movb -0x72(%rbp), %al
testb $0x1, %al
jne 0x7e5ec
jmp 0x7e7b7
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x48(%rbp)
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x58(%rbp)
movq -0x8(%rbp), %rax
movq 0xb8(%rax), %rax
movq -0x30(%rbp), %rcx
movq (%rcx), %rcx
movzwl (%rax,%rcx,2), %eax
sarl $0xe, %eax
cltq
movq %rax, -0x40(%rbp)
cmpq $0x3, -0x40(%rbp)
je 0x7e650
movq -0x8(%rbp), %rax
movq 0xb8(%rax), %rax
movq -0x30(%rbp), %rcx
movq (%rcx), %rcx
movzwl (%rax,%rcx,2), %eax
andl $0x3fff, %eax           # imm = 0x3FFF
movslq %eax, %rcx
movq -0x20(%rbp), %rax
addq (%rax), %rcx
movq %rcx, (%rax)
cmpq $0x2, -0x40(%rbp)
je 0x7e67f
movq -0x8(%rbp), %rax
movq 0xb8(%rax), %rax
movq -0x30(%rbp), %rcx
movq (%rcx), %rcx
movzwl (%rax,%rcx,2), %eax
andl $0x3fff, %eax           # imm = 0x3FFF
movslq %eax, %rcx
movq -0x28(%rbp), %rax
addq (%rax), %rcx
movq %rcx, (%rax)
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x50(%rbp)
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq %rax, -0x60(%rbp)
movq -0x48(%rbp), %rax
cmpq -0x10(%rbp), %rax
jl 0x7e6de
movq -0x50(%rbp), %rax
cmpq -0x18(%rbp), %rax
jg 0x7e6de
movq 0x10(%rbp), %rax
movq (%rax), %rax
cmpq -0x58(%rbp), %rax
jle 0x7e6c1
movq -0x58(%rbp), %rcx
movq 0x10(%rbp), %rax
movq %rcx, (%rax)
movq 0x18(%rbp), %rax
movq (%rax), %rax
cmpq -0x60(%rbp), %rax
jge 0x7e6d9
movq -0x60(%rbp), %rcx
movq 0x18(%rbp), %rax
movq %rcx, (%rax)
jmp 0x7e7a4
cmpq $0x0, -0x40(%rbp)
je 0x7e6f0
cmpq $0x1, -0x40(%rbp)
jne 0x7e7a2
movq -0x10(%rbp), %rax
cmpq -0x48(%rbp), %rax
jl 0x7e704
movq -0x10(%rbp), %rax
movq %rax, -0x80(%rbp)
jmp 0x7e70c
movq -0x48(%rbp), %rax
movq %rax, -0x80(%rbp)
movq -0x80(%rbp), %rax
movq %rax, -0x68(%rbp)
movq -0x18(%rbp), %rax
cmpq -0x50(%rbp), %rax
jg 0x7e72b
movq -0x18(%rbp), %rax
movq %rax, -0x88(%rbp)
jmp 0x7e736
movq -0x50(%rbp), %rax
movq %rax, -0x88(%rbp)
movq -0x88(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
cmpq -0x68(%rbp), %rax
jle 0x7e7a0
movq -0x68(%rbp), %rax
subq -0x48(%rbp), %rax
addq -0x58(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rax
movq -0x70(%rbp), %rcx
subq -0x68(%rbp), %rcx
addq %rcx, %rax
movq %rax, -0x60(%rbp)
movq 0x10(%rbp), %rax
movq (%rax), %rax
cmpq -0x58(%rbp), %rax
jle 0x7e786
movq -0x58(%rbp), %rcx
movq 0x10(%rbp), %rax
movq %rcx, (%rax)
movq 0x18(%rbp), %rax
movq (%rax), %rax
cmpq -0x60(%rbp), %rax
jge 0x7e79e
movq -0x60(%rbp), %rcx
movq 0x18(%rbp), %rax
movq %rcx, (%rax)
jmp 0x7e7a0
jmp 0x7e7a2
jmp 0x7e7a4
movq -0x30(%rbp), %rax
movq (%rax), %rcx
addq $0x1, %rcx
movq %rcx, (%rax)
jmp 0x7e5bd
addq $0x8, %rsp
popq %rbp
retq
nopl (%rax)