// File: chhylp123[P]hifiasm/inter.cpp
// Function: comput_linear_ctg_trans_sc(ul_ov_t*, ul_ov_t*, double, double, long)
inline int64_t comput_linear_ctg_trans_sc(ul_ov_t *li, ul_ov_t *lj, double diff_ec_ul, double ovlp_max, int64_t bw)
{	///li is the suffix of lj
	int64_t dq, dt, dd, mm, os, oe;
	if(lj->rev != li->rev) return INT32_MIN;
	int64_t iqs, iqe, its, ite, jqs, jqe, jts, jte;
	iqs = li->qs; iqe = li->qe; 
	jqs = lj->qs; jqe = lj->qe; 
	its = li->ts; ite = li->te;
	jts = lj->ts; jte = lj->te;
	// if(li->rev) {
	// 	its = lj->ts; ite = lj->te;
	// 	jts = li->ts; jte = li->te;
	// } 
	if(jte > ite) return INT32_MIN;
	
	


	dq = iqs - jqe; 
	dt = its - jte;
	dd = (dq>dt? dq-dt:dt-dq); 

	dq = iqe - jqs; 
	dt = ite - jts;
	mm = MAX(dq, dt); mm *= diff_ec_ul; if(mm < bw) mm = bw;
	if(dd > mm) return INT32_MIN;

	///too long overlap
	dd = iqe - iqs; if(dd > jqe - jqs) dd = jqe - jqs;
	dd *= ovlp_max; if(dd < bw) dd = bw;
	os = MAX(iqs, jqs), oe = MIN(iqe, jqe);
    mm = ((oe > os)? (oe - os):0);
	if(mm > 0 && mm > dd) return INT32_MIN;

	dd = ite - its; if(dd > jte - jts) dd = jte - jts;
	dd *= ovlp_max; if(dd < bw) dd = bw;
	os = MAX(its, jts), oe = MIN(ite, jte);
    mm = ((oe > os)? (oe - os):0);
	if(mm > dd) return INT32_MIN;

	return li->sec;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movsd %xmm0, -0x20(%rbp)
movsd %xmm1, -0x28(%rbp)
movq %rdx, -0x30(%rbp)
movq -0x18(%rbp), %rax
movl 0x18(%rax), %eax
shrl $0x1f, %eax
movq -0x10(%rbp), %rcx
movl 0x18(%rcx), %ecx
shrl $0x1f, %ecx
cmpl %ecx, %eax
je 0x30d913
movq $-0x80000000, -0x8(%rbp) # imm = 0x80000000
jmp 0x30dca0
movq -0x10(%rbp), %rax
movl 0x4(%rax), %eax
movq %rax, -0x68(%rbp)
movq -0x10(%rbp), %rax
movl 0x8(%rax), %eax
movq %rax, -0x70(%rbp)
movq -0x18(%rbp), %rax
movl 0x4(%rax), %eax
movq %rax, -0x88(%rbp)
movq -0x18(%rbp), %rax
movl 0x8(%rax), %eax
movq %rax, -0x90(%rbp)
movq -0x10(%rbp), %rax
movl 0x10(%rax), %eax
movq %rax, -0x78(%rbp)
movq -0x10(%rbp), %rax
movl 0x14(%rax), %eax
movq %rax, -0x80(%rbp)
movq -0x18(%rbp), %rax
movl 0x10(%rax), %eax
movq %rax, -0x98(%rbp)
movq -0x18(%rbp), %rax
movl 0x14(%rax), %eax
movq %rax, -0xa0(%rbp)
movq -0xa0(%rbp), %rax
cmpq -0x80(%rbp), %rax
jle 0x30d991
movq $-0x80000000, -0x8(%rbp) # imm = 0x80000000
jmp 0x30dca0
movq -0x68(%rbp), %rax
subq -0x90(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x78(%rbp), %rax
subq -0xa0(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x38(%rbp), %rax
cmpq -0x40(%rbp), %rax
jle 0x30d9ca
movq -0x38(%rbp), %rax
subq -0x40(%rbp), %rax
movq %rax, -0xa8(%rbp)
jmp 0x30d9d9
movq -0x40(%rbp), %rax
subq -0x38(%rbp), %rax
movq %rax, -0xa8(%rbp)
movq -0xa8(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x70(%rbp), %rax
subq -0x88(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x80(%rbp), %rax
subq -0x98(%rbp), %rax
movq %rax, -0x40(%rbp)
movq -0x38(%rbp), %rax
cmpq -0x40(%rbp), %rax
jl 0x30da19
movq -0x38(%rbp), %rax
movq %rax, -0xb0(%rbp)
jmp 0x30da24
movq -0x40(%rbp), %rax
movq %rax, -0xb0(%rbp)
movq -0xb0(%rbp), %rax
movq %rax, -0x50(%rbp)
movsd -0x20(%rbp), %xmm1
cvtsi2sdq -0x50(%rbp), %xmm0
mulsd %xmm1, %xmm0
cvttsd2si %xmm0, %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rax
cmpq -0x30(%rbp), %rax
jge 0x30da59
movq -0x30(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x48(%rbp), %rax
cmpq -0x50(%rbp), %rax
jle 0x30da70
movq $-0x80000000, -0x8(%rbp) # imm = 0x80000000
jmp 0x30dca0
movq -0x70(%rbp), %rax
subq -0x68(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
movq -0x90(%rbp), %rcx
subq -0x88(%rbp), %rcx
cmpq %rcx, %rax
jle 0x30daa5
movq -0x90(%rbp), %rax
subq -0x88(%rbp), %rax
movq %rax, -0x48(%rbp)
movsd -0x28(%rbp), %xmm1
cvtsi2sdq -0x48(%rbp), %xmm0
mulsd %xmm1, %xmm0
cvttsd2si %xmm0, %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
cmpq -0x30(%rbp), %rax
jge 0x30dacf
movq -0x30(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x68(%rbp), %rax
cmpq -0x88(%rbp), %rax
jl 0x30dae9
movq -0x68(%rbp), %rax
movq %rax, -0xb8(%rbp)
jmp 0x30daf7
movq -0x88(%rbp), %rax
movq %rax, -0xb8(%rbp)
movq -0xb8(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x70(%rbp), %rax
cmpq -0x90(%rbp), %rax
jg 0x30db1c
movq -0x70(%rbp), %rax
movq %rax, -0xc0(%rbp)
jmp 0x30db2a
movq -0x90(%rbp), %rax
movq %rax, -0xc0(%rbp)
movq -0xc0(%rbp), %rax
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rax
cmpq -0x58(%rbp), %rax
jle 0x30db50
movq -0x60(%rbp), %rax
subq -0x58(%rbp), %rax
movq %rax, -0xc8(%rbp)
jmp 0x30db5b
xorl %eax, %eax
movq %rax, -0xc8(%rbp)
jmp 0x30db5b
movq -0xc8(%rbp), %rax
movq %rax, -0x50(%rbp)
cmpq $0x0, -0x50(%rbp)
jle 0x30db84
movq -0x50(%rbp), %rax
cmpq -0x48(%rbp), %rax
jle 0x30db84
movq $-0x80000000, -0x8(%rbp) # imm = 0x80000000
jmp 0x30dca0
movq -0x80(%rbp), %rax
subq -0x78(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
movq -0xa0(%rbp), %rcx
subq -0x98(%rbp), %rcx
cmpq %rcx, %rax
jle 0x30dbb9
movq -0xa0(%rbp), %rax
subq -0x98(%rbp), %rax
movq %rax, -0x48(%rbp)
movsd -0x28(%rbp), %xmm1
cvtsi2sdq -0x48(%rbp), %xmm0
mulsd %xmm1, %xmm0
cvttsd2si %xmm0, %rax
movq %rax, -0x48(%rbp)
movq -0x48(%rbp), %rax
cmpq -0x30(%rbp), %rax
jge 0x30dbe3
movq -0x30(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x78(%rbp), %rax
cmpq -0x98(%rbp), %rax
jl 0x30dbfd
movq -0x78(%rbp), %rax
movq %rax, -0xd0(%rbp)
jmp 0x30dc0b
movq -0x98(%rbp), %rax
movq %rax, -0xd0(%rbp)
movq -0xd0(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x80(%rbp), %rax
cmpq -0xa0(%rbp), %rax
jg 0x30dc30
movq -0x80(%rbp), %rax
movq %rax, -0xd8(%rbp)
jmp 0x30dc3e
movq -0xa0(%rbp), %rax
movq %rax, -0xd8(%rbp)
movq -0xd8(%rbp), %rax
movq %rax, -0x60(%rbp)
movq -0x60(%rbp), %rax
cmpq -0x58(%rbp), %rax
jle 0x30dc64
movq -0x60(%rbp), %rax
subq -0x58(%rbp), %rax
movq %rax, -0xe0(%rbp)
jmp 0x30dc6f
xorl %eax, %eax
movq %rax, -0xe0(%rbp)
jmp 0x30dc6f
movq -0xe0(%rbp), %rax
movq %rax, -0x50(%rbp)
movq -0x50(%rbp), %rax
cmpq -0x48(%rbp), %rax
jle 0x30dc8e
movq $-0x80000000, -0x8(%rbp) # imm = 0x80000000
jmp 0x30dca0
movq -0x10(%rbp), %rax
movl 0x18(%rax), %eax
andl $0x3fffffff, %eax       # imm = 0x3FFFFFFF
movl %eax, %eax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x60, %rsp
popq %rbp
retq
nopw (%rax,%rax)