// File: chhylp123[P]hifiasm/Correct.cpp
// Function: get_chain_x_by_y(overlap_region*, long)
int64_t get_chain_x_by_y(overlap_region* ot, int64_t q)
{
	int64_t x, y, off, i, lx = -1, ly = -1; Fake_Cigar* o = &(ot->f_cigar);
	x = get_fake_gap_pos(o, o->length - 1); 
	off = get_fake_gap_shift(o, o->length - 1);
	y = x - ot->x_pos_s + ot->y_pos_s + off;
	if(y == q) return x;

	for (i = 0; i < (int64_t)o->length; i++){
		x = get_fake_gap_pos(o, i); off = get_fake_gap_shift(o, i);
		y = x - ot->x_pos_s + ot->y_pos_s + off;
		if(q < y) {
			lx = x; ly = y;
			break;
		}
	}

    assert((i!=0)&&(i!=(int64_t)o->length));
	x = get_fake_gap_pos(o, i-1); off = get_fake_gap_shift(o, i-1);
	y = x - ot->x_pos_s + ot->y_pos_s + off;
	y = (((double)(q - y))/((double)(ly - y)))*((double)(lx -x)) + x;
	if(y < ot->x_pos_s) y = ot->x_pos_s;
	if(y > ot->x_pos_e) y = ot->x_pos_e;
	return y;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq $-0x1, -0x40(%rbp)
movq $-0x1, -0x48(%rbp)
movq -0x10(%rbp), %rax
addq $0x38, %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rdi
movq -0x50(%rbp), %rax
movl 0x8(%rax), %esi
subl $0x1, %esi
callq 0x1e320
cltq
movq %rax, -0x20(%rbp)
movq -0x50(%rbp), %rdi
movq -0x50(%rbp), %rax
movl 0x8(%rax), %esi
subl $0x1, %esi
callq 0x1e340
cltq
movq %rax, -0x30(%rbp)
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
movl 0x4(%rcx), %ecx
subq %rcx, %rax
movq -0x10(%rbp), %rcx
movl 0x14(%rcx), %ecx
addq %rcx, %rax
addq -0x30(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
cmpq -0x18(%rbp), %rax
jne 0x8a895
movq -0x20(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x8aa42
movq $0x0, -0x38(%rbp)
movq -0x38(%rbp), %rax
movq -0x50(%rbp), %rcx
movl 0x8(%rcx), %ecx
cmpq %rcx, %rax
jge 0x8a926
movq -0x50(%rbp), %rdi
movq -0x38(%rbp), %rax
movl %eax, %esi
callq 0x1e320
cltq
movq %rax, -0x20(%rbp)
movq -0x50(%rbp), %rdi
movq -0x38(%rbp), %rax
movl %eax, %esi
callq 0x1e340
cltq
movq %rax, -0x30(%rbp)
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
movl 0x4(%rcx), %ecx
subq %rcx, %rax
movq -0x10(%rbp), %rcx
movl 0x14(%rcx), %ecx
addq %rcx, %rax
addq -0x30(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x18(%rbp), %rax
cmpq -0x28(%rbp), %rax
jge 0x8a913
movq -0x20(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x28(%rbp), %rax
movq %rax, -0x48(%rbp)
jmp 0x8a926
jmp 0x8a915
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
jmp 0x8a89d
xorl %eax, %eax
cmpq $0x0, -0x38(%rbp)
movb %al, -0x51(%rbp)
je 0x8a946
movq -0x38(%rbp), %rax
movq -0x50(%rbp), %rcx
movl 0x8(%rcx), %ecx
cmpq %rcx, %rax
setne %al
movb %al, -0x51(%rbp)
movb -0x51(%rbp), %al
testb $0x1, %al
jne 0x8a94f
jmp 0x8a951
jmp 0x8a970
leaq 0x2fb015(%rip), %rdi    # 0x38596d
leaq 0x2f79bc(%rip), %rsi    # 0x38231b
movl $0x5809, %edx           # imm = 0x5809
leaq 0x2fb022(%rip), %rcx    # 0x38598d
callq 0x2130
movq -0x50(%rbp), %rdi
movq -0x38(%rbp), %rax
subq $0x1, %rax
movl %eax, %esi
callq 0x1e320
cltq
movq %rax, -0x20(%rbp)
movq -0x50(%rbp), %rdi
movq -0x38(%rbp), %rax
subq $0x1, %rax
movl %eax, %esi
callq 0x1e340
cltq
movq %rax, -0x30(%rbp)
movq -0x20(%rbp), %rax
movq -0x10(%rbp), %rcx
movl 0x4(%rcx), %ecx
subq %rcx, %rax
movq -0x10(%rbp), %rcx
movl 0x14(%rcx), %ecx
addq %rcx, %rax
addq -0x30(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x18(%rbp), %rax
subq -0x28(%rbp), %rax
cvtsi2sd %rax, %xmm0
movq -0x48(%rbp), %rax
subq -0x28(%rbp), %rax
cvtsi2sd %rax, %xmm1
divsd %xmm1, %xmm0
movq -0x40(%rbp), %rax
subq -0x20(%rbp), %rax
cvtsi2sd %rax, %xmm2
cvtsi2sdq -0x20(%rbp), %xmm1
mulsd %xmm2, %xmm0
addsd %xmm1, %xmm0
cvttsd2si %xmm0, %rax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
movq -0x10(%rbp), %rcx
movl 0x4(%rcx), %ecx
cmpq %rcx, %rax
jge 0x8aa1f
movq -0x10(%rbp), %rax
movl 0x4(%rax), %eax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
movq -0x10(%rbp), %rcx
movl 0x8(%rcx), %ecx
cmpq %rcx, %rax
jle 0x8aa3a
movq -0x10(%rbp), %rax
movl 0x8(%rax), %eax
movq %rax, -0x28(%rbp)
movq -0x28(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x60, %rsp
popq %rbp
retq
nopl (%rax)