// File: chhylp123[P]hifiasm/anchor.cpp
// Function: h_ec_lchain_re_chn(ha_abuf_s*, unsigned long, unsigned long, unsigned int, char*, unsigned long, unsigned long, char*, unsigned long, unsigned long, unsigned long, unsigned long, overlap_region_alloc*, Candidates_list*, double, int, unsigned long, unsigned long, unsigned int, long, double, unsigned int, long, long, long, long, double, double, tiny_queue_t*, asg16_v*, long*, long*)
uint64_t h_ec_lchain_re_chn(ha_abuf_t *ab, uint64_t si, uint64_t ei, uint32_t rid, char* rs, uint64_t rl, uint64_t tid, char* ts, uint64_t tl, uint64_t trev, uint64_t mz_w, uint64_t mz_k, overlap_region_alloc *olst, Candidates_list *cl, double bw_thres, 
								 int apend_be, uint64_t max_cnt, uint64_t min_cnt, uint32_t gen_off, int64_t enable_mcopy, double mcopy_rate, uint32_t mcopy_khit_cut, int64_t max_skip, int64_t max_iter, int64_t max_dis, int64_t quick_check, double chn_pen_gap, double chn_pen_skip, tiny_queue_t *tq, asg16_v *scc, int64_t *n, int64_t *zn)
{
	// char dbg[768]; uint64_t rpos, rspan, thash;

	int64_t ok, nk, ck, n0; uint64_t i, m, tspan, on0; k_mer_hit *p;
	for (i = si, m = ok = nk = ck = 0; i < ei; i++) {
		if(!recalu_minimizer_non_retrieve(rid, &(ab->a[i]), &(scc[tid]), &ok, &nk, &ck, mz_k, ab->mz.a[ab->a[i].self_off].x, tq, ts, tl, trev)) continue;
		///debug
		// thash = ab->mz.a[ab->a[i].self_off].x;
		
		ab->a[m] = ab->a[i]; tspan = ab->a[m].other_off;
		ab->a[m].other_off = (uint32_t)ab->a[m].srt;
		if(trev) ab->a[m].other_off = tl - (ab->a[m].other_off+1-tspan) - 1;///looks like a bug
		ab->a[m].self_off = ab->mz.a[ab->a[m].self_off].pos;
		ab->a[m].srt = ab->a[m].self_off; ab->a[m].srt <<= 32; ab->a[m].srt |= ab->a[m].other_off;


		///debug
		// recover_UC_Read_sub_region(dbg, ab->a[m].other_off + 1 - tspan, tspan, trev, &R_INF, tid);
		// if(recalu_minimizer0(dbg, tspan, !(asm_opt.flag & HA_F_NO_HPC), mz_k, thash, tq, &rpos, &rspan) && (rpos + 1 == tspan) && (tspan == rspan)) {
		//  	// fprintf(stderr, "-0-[M::%s]\n", __func__);
		// } else {
		//  	fprintf(stderr, "-1-[M::%s]\ttrev::%lu\n", __func__, trev);
		// }
		///debug
		// hpc_ext_check(&R_INF, tid, ab->a[m].other_off + 1 - tspan, ab->a[m].other_off + 1, tl, trev, dbg);

		m++;
	}

	if(m > 1) radix_sort_ha_an1(ab->a, ab->a + m);

	for (i = 0, n0 = (*n); i < m; i++) {
		p = &cl->list[(*n)++];
		p->readID = tid;
		p->strand = trev;
		p->offset = ab->a[i].other_off;
		p->self_offset = ab->a[i].self_off;
		if(((ab->a[i].cnt>>8) < max_cnt) && ((ab->a[i].cnt>>8) > min_cnt)){
			p->cnt = 1;
		} else if((ab->a[i].cnt>>8) <= min_cnt) {
			p->cnt = 2;
		} else{
			p->cnt = 1 + (((ab->a[i].cnt>>8) + (max_cnt<<1) - 1)/(max_cnt<<1));
			p->cnt = pow(p->cnt, 1.1);
		}
		if(p->cnt > ((uint32_t)(0xffffffu))) p->cnt = 0xffffffu;
		p->cnt <<= 8; p->cnt |= (((uint32_t)(0xffu))&(ab->a[i].cnt));
	}

	// if(rid == 3196 && tid == 3199) fprintf(stderr, "[M::%s]\ttid::%lu\ttrev::%lu\told::%lu\tnew::%lu\n", __func__, tid, trev, k - l, m);
	// fprintf(stderr, "[M::%s]\ttid::%lu\ttrev::%lu\told::%lu\tnew::%lu\n", __func__, tid, trev, ei - si, m);

	if(m > 0 && tid != rid) {
		on0 = olst->length;
		*zn += lchain_qdp_mcopy_fast(cl, n0, (*n)-n0, *zn, &(cl->chainDP), olst, max_skip, max_iter, max_dis, chn_pen_gap, chn_pen_skip, bw_thres, 
																	rid, rl, tl, quick_check, apend_be, gen_off, enable_mcopy, mcopy_rate, mcopy_khit_cut, 1);
		cl->length = *zn;
		if(olst->length > on0) return 1;
	}

	cl->length = *zn;
	return 0;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
pushq %r15
pushq %r14
pushq %r13
pushq %r12
pushq %rbx
subq $0x128, %rsp            # imm = 0x128
movq 0xb8(%rbp), %rax
movq 0xb0(%rbp), %rax
movq 0xa8(%rbp), %rax
movq 0xa0(%rbp), %rax
movq 0x98(%rbp), %rax
movq 0x90(%rbp), %rax
movq 0x88(%rbp), %rax
movq 0x80(%rbp), %rax
movl 0x78(%rbp), %eax
movq 0x70(%rbp), %rax
movl 0x68(%rbp), %eax
movq 0x60(%rbp), %rax
movq 0x58(%rbp), %rax
movl 0x50(%rbp), %eax
movq 0x48(%rbp), %rax
movq 0x40(%rbp), %rax
movq 0x38(%rbp), %rax
movq 0x30(%rbp), %rax
movq 0x28(%rbp), %rax
movq 0x20(%rbp), %rax
movq 0x18(%rbp), %rax
movq 0x10(%rbp), %rax
movq %rdi, -0x38(%rbp)
movq %rsi, -0x40(%rbp)
movq %rdx, -0x48(%rbp)
movl %ecx, -0x4c(%rbp)
movq %r8, -0x58(%rbp)
movq %r9, -0x60(%rbp)
movsd %xmm0, -0x68(%rbp)
movsd %xmm1, -0x70(%rbp)
movsd %xmm2, -0x78(%rbp)
movsd %xmm3, -0x80(%rbp)
movq -0x40(%rbp), %rax
movq %rax, -0xa8(%rbp)
movq $0x0, -0x98(%rbp)
movq $0x0, -0x90(%rbp)
movq $0x0, -0x88(%rbp)
movq $0x0, -0xb0(%rbp)
movq -0xa8(%rbp), %rax
cmpq -0x48(%rbp), %rax
jae 0x1b354f
movl -0x4c(%rbp), %eax
movl %eax, %edi
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rsi
imulq $0x18, -0xa8(%rbp), %rax
addq %rax, %rsi
movq 0xa8(%rbp), %rdx
imulq $0x18, 0x10(%rbp), %rax
addq %rax, %rdx
movq 0x38(%rbp), %r15
movq -0x38(%rbp), %rax
movq 0x20(%rax), %rax
movq -0x38(%rbp), %rcx
movq 0x30(%rcx), %rcx
imulq $0x18, -0xa8(%rbp), %r8
addq %r8, %rcx
movl 0x8(%rcx), %ecx
shlq $0x4, %rcx
addq %rcx, %rax
movq (%rax), %r14
movq 0xa0(%rbp), %rbx
movq 0x18(%rbp), %r11
movq 0x20(%rbp), %r10
movq 0x28(%rbp), %rax
leaq -0x88(%rbp), %rcx
leaq -0x90(%rbp), %r8
leaq -0x98(%rbp), %r9
movq %r15, (%rsp)
movq %r14, 0x8(%rsp)
movq %rbx, 0x10(%rsp)
movq %r11, 0x18(%rsp)
movq %r10, 0x20(%rsp)
movq %rax, 0x28(%rsp)
callq 0x1b0030
cmpq $0x0, %rax
jne 0x1b338c
jmp 0x1b3538
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rcx
imulq $0x18, -0xa8(%rbp), %rax
addq %rax, %rcx
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rax
imulq $0x18, -0xb0(%rbp), %rdx
addq %rdx, %rax
movq (%rcx), %rdx
movq %rdx, (%rax)
movq 0x8(%rcx), %rdx
movq %rdx, 0x8(%rax)
movq 0x10(%rcx), %rcx
movq %rcx, 0x10(%rax)
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rax
imulq $0x18, -0xb0(%rbp), %rcx
addq %rcx, %rax
movl 0xc(%rax), %eax
movq %rax, -0xb8(%rbp)
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rax
imulq $0x18, -0xb0(%rbp), %rcx
addq %rcx, %rax
movq (%rax), %rax
movl %eax, %ecx
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rax
imulq $0x18, -0xb0(%rbp), %rdx
addq %rdx, %rax
movl %ecx, 0xc(%rax)
cmpq $0x0, 0x28(%rbp)
je 0x1b345f
movq 0x20(%rbp), %rax
movq -0x38(%rbp), %rcx
movq 0x30(%rcx), %rcx
imulq $0x18, -0xb0(%rbp), %rdx
addq %rdx, %rcx
movl 0xc(%rcx), %ecx
addl $0x1, %ecx
movl %ecx, %ecx
subq -0xb8(%rbp), %rcx
subq %rcx, %rax
subq $0x1, %rax
movl %eax, %ecx
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rax
imulq $0x18, -0xb0(%rbp), %rdx
addq %rdx, %rax
movl %ecx, 0xc(%rax)
movq -0x38(%rbp), %rax
movq 0x20(%rax), %rax
movq -0x38(%rbp), %rcx
movq 0x30(%rcx), %rcx
imulq $0x18, -0xb0(%rbp), %rdx
addq %rdx, %rcx
movl 0x8(%rcx), %ecx
shlq $0x4, %rcx
addq %rcx, %rax
movq 0x8(%rax), %rax
shrq $0x1c, %rax
andq $0x7ffffff, %rax        # imm = 0x7FFFFFF
movl %eax, %ecx
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rax
imulq $0x18, -0xb0(%rbp), %rdx
addq %rdx, %rax
movl %ecx, 0x8(%rax)
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rax
imulq $0x18, -0xb0(%rbp), %rcx
addq %rcx, %rax
movl 0x8(%rax), %eax
movl %eax, %ecx
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rax
imulq $0x18, -0xb0(%rbp), %rdx
addq %rdx, %rax
movq %rcx, (%rax)
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rax
imulq $0x18, -0xb0(%rbp), %rcx
addq %rcx, %rax
movq (%rax), %rcx
shlq $0x20, %rcx
movq %rcx, (%rax)
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rax
imulq $0x18, -0xb0(%rbp), %rcx
addq %rcx, %rax
movl 0xc(%rax), %eax
movl %eax, %ecx
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rax
imulq $0x18, -0xb0(%rbp), %rdx
addq %rdx, %rax
orq (%rax), %rcx
movq %rcx, (%rax)
movq -0xb0(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xb0(%rbp)
movq -0xa8(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xa8(%rbp)
jmp 0x1b32d3
cmpq $0x1, -0xb0(%rbp)
jbe 0x1b3579
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rdi
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rsi
imulq $0x18, -0xb0(%rbp), %rax
addq %rax, %rsi
callq 0x19c150
movq $0x0, -0xa8(%rbp)
movq 0xb0(%rbp), %rax
movq (%rax), %rax
movq %rax, -0xa0(%rbp)
movq -0xa8(%rbp), %rax
cmpq -0xb0(%rbp), %rax
jae 0x1b37aa
movq 0x48(%rbp), %rax
movq (%rax), %rax
movq 0xb0(%rbp), %rdx
movq (%rdx), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, (%rdx)
shlq $0x4, %rcx
addq %rcx, %rax
movq %rax, -0xc8(%rbp)
movq 0x10(%rbp), %rax
movl %eax, %edx
movq -0xc8(%rbp), %rax
movl (%rax), %ecx
andl $0x7fffffff, %edx       # imm = 0x7FFFFFFF
andl $0x80000000, %ecx       # imm = 0x80000000
orl %edx, %ecx
movl %ecx, (%rax)
movq 0x28(%rbp), %rax
movl %eax, %edx
movq -0xc8(%rbp), %rax
movl (%rax), %ecx
andl $0x1, %edx
shll $0x1f, %edx
andl $0x7fffffff, %ecx       # imm = 0x7FFFFFFF
orl %edx, %ecx
movl %ecx, (%rax)
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rax
imulq $0x18, -0xa8(%rbp), %rcx
addq %rcx, %rax
movl 0xc(%rax), %ecx
movq -0xc8(%rbp), %rax
movl %ecx, 0x4(%rax)
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rax
imulq $0x18, -0xa8(%rbp), %rcx
addq %rcx, %rax
movl 0x8(%rax), %ecx
movq -0xc8(%rbp), %rax
movl %ecx, 0x8(%rax)
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rax
imulq $0x18, -0xa8(%rbp), %rcx
addq %rcx, %rax
movl 0x10(%rax), %eax
shrl $0x8, %eax
movl %eax, %eax
cmpq 0x58(%rbp), %rax
jae 0x1b36a5
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rax
imulq $0x18, -0xa8(%rbp), %rcx
addq %rcx, %rax
movl 0x10(%rax), %eax
shrl $0x8, %eax
movl %eax, %eax
cmpq 0x60(%rbp), %rax
jbe 0x1b36a5
movq -0xc8(%rbp), %rax
movl $0x1, 0xc(%rax)
jmp 0x1b373c
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rax
imulq $0x18, -0xa8(%rbp), %rcx
addq %rcx, %rax
movl 0x10(%rax), %eax
shrl $0x8, %eax
movl %eax, %eax
cmpq 0x60(%rbp), %rax
ja 0x1b36d6
movq -0xc8(%rbp), %rax
movl $0x2, 0xc(%rax)
jmp 0x1b373a
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rax
movq -0xa8(%rbp), %rcx
leaq (%rcx,%rcx,2), %rcx
movl 0x10(%rax,%rcx,8), %eax
shrl $0x8, %eax
movq 0x58(%rbp), %rdx
movq %rdx, %rcx
addq %rcx, %rcx
leaq -0x1(%rax,%rdx,2), %rax
xorl %edx, %edx
divq %rcx
movl %eax, %ecx
incl %ecx
movq -0xc8(%rbp), %rax
movl %ecx, 0xc(%rax)
movq -0xc8(%rbp), %rax
movl 0xc(%rax), %edi
movsd 0x1d3124(%rip), %xmm0   # 0x386848
callq 0x1b4690
cvttsd2si %xmm0, %rax
movl %eax, %ecx
movq -0xc8(%rbp), %rax
movl %ecx, 0xc(%rax)
jmp 0x1b373c
movq -0xc8(%rbp), %rax
cmpl $0xffffff, 0xc(%rax)    # imm = 0xFFFFFF
jbe 0x1b375a
movq -0xc8(%rbp), %rax
movl $0xffffff, 0xc(%rax)    # imm = 0xFFFFFF
movq -0xc8(%rbp), %rax
movl 0xc(%rax), %ecx
shll $0x8, %ecx
movl %ecx, 0xc(%rax)
movq -0x38(%rbp), %rax
movq 0x30(%rax), %rax
imulq $0x18, -0xa8(%rbp), %rcx
addq %rcx, %rax
movl 0x10(%rax), %ecx
andl $0xff, %ecx
movq -0xc8(%rbp), %rax
orl 0xc(%rax), %ecx
movl %ecx, 0xc(%rax)
movq -0xa8(%rbp), %rax
addq $0x1, %rax
movq %rax, -0xa8(%rbp)
jmp 0x1b3595
cmpq $0x0, -0xb0(%rbp)
jbe 0x1b390f
movq 0x10(%rbp), %rax
movl -0x4c(%rbp), %ecx
cmpq %rcx, %rax
je 0x1b390f
movq 0x40(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0xc0(%rbp)
movq 0x48(%rbp), %rdi
movq -0xa0(%rbp), %rsi
movq 0xb0(%rbp), %rax
movq (%rax), %rdx
subq -0xa0(%rbp), %rdx
movq 0xb8(%rbp), %rax
movq (%rax), %rcx
movq 0x48(%rbp), %r8
addq $0x18, %r8
movq 0x40(%rbp), %r9
movq 0x80(%rbp), %rax
movq %rax, -0xe8(%rbp)
movq 0x88(%rbp), %rax
movq %rax, -0xe0(%rbp)
movq 0x90(%rbp), %rax
movq %rax, -0xd8(%rbp)
movsd -0x78(%rbp), %xmm0
movsd -0x80(%rbp), %xmm1
movsd -0x68(%rbp), %xmm2
movl -0x4c(%rbp), %r13d
movq -0x60(%rbp), %r12
movq 0x20(%rbp), %r15
movq 0x98(%rbp), %r14
movl 0x50(%rbp), %ebx
movl 0x68(%rbp), %eax
movl %eax, %r11d
movq 0x70(%rbp), %r10
movsd -0x70(%rbp), %xmm3
movl 0x78(%rbp), %eax
movq %rax, -0xd0(%rbp)
movq -0xe8(%rbp), %rax
movq %rax, (%rsp)
movq -0xe0(%rbp), %rax
movq %rax, 0x8(%rsp)
movq -0xd8(%rbp), %rax
movq %rax, 0x10(%rsp)
movq -0xd0(%rbp), %rax
movl %r13d, 0x18(%rsp)
movq %r12, 0x20(%rsp)
movq %r15, 0x28(%rsp)
movq %r14, 0x30(%rsp)
movl %ebx, 0x38(%rsp)
movq %r11, 0x40(%rsp)
movq %r10, 0x48(%rsp)
movq %rax, 0x50(%rsp)
movq $0x1, 0x58(%rsp)
callq 0x275f0
movq %rax, %rcx
movq 0xb8(%rbp), %rax
addq (%rax), %rcx
movq %rcx, (%rax)
movq 0xb8(%rbp), %rax
movq (%rax), %rcx
movq 0x48(%rbp), %rax
movq %rcx, 0x8(%rax)
movq 0x40(%rbp), %rax
movq 0x10(%rax), %rax
cmpq -0xc0(%rbp), %rax
jbe 0x1b390d
movq $0x1, -0x30(%rbp)
jmp 0x1b3929
jmp 0x1b390f
movq 0xb8(%rbp), %rax
movq (%rax), %rcx
movq 0x48(%rbp), %rax
movq %rcx, 0x8(%rax)
movq $0x0, -0x30(%rbp)
movq -0x30(%rbp), %rax
addq $0x128, %rsp            # imm = 0x128
popq %rbx
popq %r12
popq %r13
popq %r14
popq %r15
popq %rbp
retq
nop