// File: chhylp123[P]hifiasm/Process_Read.cpp
// Function: retrive_bqual(asg8_v*, unsigned char*, unsigned long, long, long, unsigned char, long)
int64_t retrive_bqual(asg8_v *dv, uint8_t *ds, uint64_t id, int64_t s, int64_t e, uint8_t rev, int64_t bitn)
{
	int64_t rl = Get_READ_LENGTH(R_INF, id), l; 
	if(s < 0) s = 0; if(e < 0) e = rl;
	if(s >= e || e > rl) return -1;

	uint8_t *da = NULL, *src = Get_QUAL(R_INF, id), mm = (((uint8_t)1)<<bitn)-1, mlf = 8 - bitn, mrf;
	int64_t bitr = 8/bitn, dk, sk, swk;
	l = e - s;
	if(dv) {
		kv_resize(uint8_t, *dv, ((uint64_t)l)); da = dv->a;
	} else {
		da = ds;
	}

	if(!rev) {
		dk = 0; sk = s;

		mrf = ((s%bitr)*bitn);
		// if(s == 21519 && e == 22332) {
		// 	fprintf(stderr, "+[M::%s] id::%lu, in::[%ld, %ld), rev::%u, bitn::%ld, bitr::%ld, mrf::%u\n", __func__, id, s, e, rev, bitn, bitr, mrf);
		// }
		if(mrf) {
			for (swk = sk/bitr; mrf < 8 && sk < e; mrf += bitn, sk++) da[dk++] = ((src[swk]<<mrf)>>mlf)&mm;
		}
		
		for (swk = sk/bitr; (sk + bitr) <= e; sk += bitr, swk++) {
			for (mrf = 0; mrf < 8; mrf += bitn) da[dk++] = ((src[swk]<<mrf)>>mlf)&mm;
		}

		if(sk < e) {
			for (mrf = 0; sk < e; mrf += bitn, sk++) da[dk++] = ((src[swk]<<mrf)>>mlf)&mm;
		}
		// if(dk != l) {
		// 	fprintf(stderr, "+[M::%s] id::%lu, in::[%ld, %ld), rev::%u, bitn::%ld, bitr::%ld\n", __func__, id, s, e, rev, bitn, bitr);
		// }
		assert(dk == l);
	} else {
		sk = s; s = e; e = sk;
		s = rl - s; e = rl - e;
		dk = l; sk = s; 

		mrf = ((s%bitr)*bitn);
		if(mrf) {
			for (swk = sk/bitr; mrf < 8 && sk < e; mrf += bitn, sk++) da[--dk] = ((src[swk]<<mrf)>>mlf)&mm;
		}
		
		for (swk = sk/bitr; (sk + bitr) <= e; sk += bitr, swk++) {
			for (mrf = 0; mrf < 8; mrf += bitn) da[--dk] = ((src[swk]<<mrf)>>mlf)&mm;
		}

		if(sk < e) {
			for (mrf = 0; sk < e; mrf += bitn, sk++) da[--dk] = ((src[swk]<<mrf)>>mlf)&mm;
		}
		
		assert(dk == 0);
	}
	dv->n = l;

	return l;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x90, %rsp
movb %r9b, %al
movq 0x10(%rbp), %r9
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
movq %r8, -0x30(%rbp)
movb %al, -0x31(%rbp)
leaq 0x3ba3e0(%rip), %rax    # 0x3c52d0
movq 0x18(%rax), %rax
movq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq %rax, -0x40(%rbp)
cmpq $0x0, -0x28(%rbp)
jge 0xaf0f
movq $0x0, -0x28(%rbp)
cmpq $0x0, -0x30(%rbp)
jge 0xaf1e
movq -0x40(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x28(%rbp), %rax
cmpq -0x30(%rbp), %rax
jge 0xaf32
movq -0x30(%rbp), %rax
cmpq -0x40(%rbp), %rax
jle 0xaf3f
movq $-0x1, -0x8(%rbp)
jmp 0xb4ad
movq $0x0, -0x50(%rbp)
leaq 0x3ba382(%rip), %rax    # 0x3c52d0
movq 0x30(%rax), %rax
movq -0x20(%rbp), %rcx
movq (%rax,%rcx,8), %rax
movq %rax, -0x58(%rbp)
movq 0x10(%rbp), %rax
movl %eax, %ecx
movl $0x1, %eax
shll %cl, %eax
subl $0x1, %eax
movb %al, -0x59(%rbp)
movl $0x8, %eax
subq 0x10(%rbp), %rax
movb %al, -0x5a(%rbp)
movl $0x8, %eax
cqto
idivq 0x10(%rbp)
movq %rax, -0x68(%rbp)
movq -0x30(%rbp), %rax
subq -0x28(%rbp), %rax
movq %rax, -0x48(%rbp)
cmpq $0x0, -0x10(%rbp)
je 0xb08e
jmp 0xafa5
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
cmpq -0x48(%rbp), %rax
jae 0xb07e
movq -0x48(%rbp), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
addq $-0x1, %rcx
movq %rcx, 0x8(%rax)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
shrq %rcx
movq -0x10(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
shrq $0x2, %rcx
movq -0x10(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
shrq $0x4, %rcx
movq -0x10(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
shrq $0x8, %rcx
movq -0x10(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
shrq $0x10, %rcx
movq -0x10(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x8(%rax)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rsi
shlq $0x0, %rsi
callq 0x2360
movq %rax, %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x10(%rax)
jmp 0xb080
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x50(%rbp)
jmp 0xb096
movq -0x18(%rbp), %rax
movq %rax, -0x50(%rbp)
cmpb $0x0, -0x31(%rbp)
jne 0xb285
movq $0x0, -0x70(%rbp)
movq -0x28(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x28(%rbp), %rax
cqto
idivq -0x68(%rbp)
imulq 0x10(%rbp), %rdx
movb %dl, %al
movb %al, -0x5b(%rbp)
cmpb $0x0, -0x5b(%rbp)
je 0xb15e
movq -0x78(%rbp), %rax
cqto
idivq -0x68(%rbp)
movq %rax, -0x80(%rbp)
movzbl -0x5b(%rbp), %ecx
xorl %eax, %eax
cmpl $0x8, %ecx
movb %al, -0x81(%rbp)
jge 0xb0fe
movq -0x78(%rbp), %rax
cmpq -0x30(%rbp), %rax
setl %al
movb %al, -0x81(%rbp)
movb -0x81(%rbp), %al
testb $0x1, %al
jne 0xb10a
jmp 0xb15c
movq -0x58(%rbp), %rax
movq -0x80(%rbp), %rcx
movzbl (%rax,%rcx), %eax
movzbl -0x5b(%rbp), %ecx
shll %cl, %eax
movzbl -0x5a(%rbp), %ecx
sarl %cl, %eax
movzbl -0x59(%rbp), %ecx
andl %ecx, %eax
movb %al, %dl
movq -0x50(%rbp), %rax
movq -0x70(%rbp), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, -0x70(%rbp)
movb %dl, (%rax,%rcx)
movq 0x10(%rbp), %rcx
movzbl -0x5b(%rbp), %eax
addq %rcx, %rax
movb %al, -0x5b(%rbp)
movq -0x78(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x78(%rbp)
jmp 0xb0dc
jmp 0xb15e
movq -0x78(%rbp), %rax
cqto
idivq -0x68(%rbp)
movq %rax, -0x80(%rbp)
movq -0x78(%rbp), %rax
addq -0x68(%rbp), %rax
cmpq -0x30(%rbp), %rax
jg 0xb1e9
movb $0x0, -0x5b(%rbp)
movzbl -0x5b(%rbp), %eax
cmpl $0x8, %eax
jge 0xb1cd
movq -0x58(%rbp), %rax
movq -0x80(%rbp), %rcx
movzbl (%rax,%rcx), %eax
movzbl -0x5b(%rbp), %ecx
shll %cl, %eax
movzbl -0x5a(%rbp), %ecx
sarl %cl, %eax
movzbl -0x59(%rbp), %ecx
andl %ecx, %eax
movb %al, %dl
movq -0x50(%rbp), %rax
movq -0x70(%rbp), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, -0x70(%rbp)
movb %dl, (%rax,%rcx)
movq 0x10(%rbp), %rcx
movzbl -0x5b(%rbp), %eax
addq %rcx, %rax
movb %al, -0x5b(%rbp)
jmp 0xb17e
jmp 0xb1cf
movq -0x68(%rbp), %rax
addq -0x78(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x80(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x80(%rbp)
jmp 0xb16c
movq -0x78(%rbp), %rax
cmpq -0x30(%rbp), %rax
jge 0xb255
movb $0x0, -0x5b(%rbp)
movq -0x78(%rbp), %rax
cmpq -0x30(%rbp), %rax
jge 0xb253
movq -0x58(%rbp), %rax
movq -0x80(%rbp), %rcx
movzbl (%rax,%rcx), %eax
movzbl -0x5b(%rbp), %ecx
shll %cl, %eax
movzbl -0x5a(%rbp), %ecx
sarl %cl, %eax
movzbl -0x59(%rbp), %ecx
andl %ecx, %eax
movb %al, %dl
movq -0x50(%rbp), %rax
movq -0x70(%rbp), %rcx
movq %rcx, %rsi
addq $0x1, %rsi
movq %rsi, -0x70(%rbp)
movb %dl, (%rax,%rcx)
movq 0x10(%rbp), %rcx
movzbl -0x5b(%rbp), %eax
addq %rcx, %rax
movb %al, -0x5b(%rbp)
movq -0x78(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x78(%rbp)
jmp 0xb1f7
jmp 0xb255
movq -0x70(%rbp), %rax
cmpq -0x48(%rbp), %rax
jne 0xb261
jmp 0xb280
leaq 0x376252(%rip), %rdi    # 0x3814ba
leaq 0x376253(%rip), %rsi    # 0x3814c2
movl $0x3b7, %edx            # imm = 0x3B7
leaq 0x376258(%rip), %rcx    # 0x3814d3
callq 0x2130
jmp 0xb49a
movq -0x28(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x30(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x78(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x40(%rbp), %rax
subq -0x28(%rbp), %rax
movq %rax, -0x28(%rbp)
movq -0x40(%rbp), %rax
subq -0x30(%rbp), %rax
movq %rax, -0x30(%rbp)
movq -0x48(%rbp), %rax
movq %rax, -0x70(%rbp)
movq -0x28(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x28(%rbp), %rax
cqto
idivq -0x68(%rbp)
imulq 0x10(%rbp), %rdx
movb %dl, %al
movb %al, -0x5b(%rbp)
cmpb $0x0, -0x5b(%rbp)
je 0xb377
movq -0x78(%rbp), %rax
cqto
idivq -0x68(%rbp)
movq %rax, -0x80(%rbp)
movzbl -0x5b(%rbp), %ecx
xorl %eax, %eax
cmpl $0x8, %ecx
movb %al, -0x82(%rbp)
jge 0xb313
movq -0x78(%rbp), %rax
cmpq -0x30(%rbp), %rax
setl %al
movb %al, -0x82(%rbp)
movb -0x82(%rbp), %al
testb $0x1, %al
jne 0xb31f
jmp 0xb375
movq -0x58(%rbp), %rax
movq -0x80(%rbp), %rcx
movzbl (%rax,%rcx), %eax
movzbl -0x5b(%rbp), %ecx
shll %cl, %eax
movzbl -0x5a(%rbp), %ecx
sarl %cl, %eax
movzbl -0x59(%rbp), %ecx
andl %ecx, %eax
movb %al, %dl
movq -0x50(%rbp), %rax
movq -0x70(%rbp), %rcx
movq %rcx, %rsi
addq $-0x1, %rsi
movq %rsi, -0x70(%rbp)
movb %dl, -0x1(%rax,%rcx)
movq 0x10(%rbp), %rcx
movzbl -0x5b(%rbp), %eax
addq %rcx, %rax
movb %al, -0x5b(%rbp)
movq -0x78(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x78(%rbp)
jmp 0xb2f1
jmp 0xb377
movq -0x78(%rbp), %rax
cqto
idivq -0x68(%rbp)
movq %rax, -0x80(%rbp)
movq -0x78(%rbp), %rax
addq -0x68(%rbp), %rax
cmpq -0x30(%rbp), %rax
jg 0xb403
movb $0x0, -0x5b(%rbp)
movzbl -0x5b(%rbp), %eax
cmpl $0x8, %eax
jge 0xb3e7
movq -0x58(%rbp), %rax
movq -0x80(%rbp), %rcx
movzbl (%rax,%rcx), %eax
movzbl -0x5b(%rbp), %ecx
shll %cl, %eax
movzbl -0x5a(%rbp), %ecx
sarl %cl, %eax
movzbl -0x59(%rbp), %ecx
andl %ecx, %eax
movb %al, %dl
movq -0x50(%rbp), %rax
movq -0x70(%rbp), %rcx
movq %rcx, %rsi
addq $-0x1, %rsi
movq %rsi, -0x70(%rbp)
movb %dl, -0x1(%rax,%rcx)
movq 0x10(%rbp), %rcx
movzbl -0x5b(%rbp), %eax
addq %rcx, %rax
movb %al, -0x5b(%rbp)
jmp 0xb397
jmp 0xb3e9
movq -0x68(%rbp), %rax
addq -0x78(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x80(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x80(%rbp)
jmp 0xb385
movq -0x78(%rbp), %rax
cmpq -0x30(%rbp), %rax
jge 0xb470
movb $0x0, -0x5b(%rbp)
movq -0x78(%rbp), %rax
cmpq -0x30(%rbp), %rax
jge 0xb46e
movq -0x58(%rbp), %rax
movq -0x80(%rbp), %rcx
movzbl (%rax,%rcx), %eax
movzbl -0x5b(%rbp), %ecx
shll %cl, %eax
movzbl -0x5a(%rbp), %ecx
sarl %cl, %eax
movzbl -0x59(%rbp), %ecx
andl %ecx, %eax
movb %al, %dl
movq -0x50(%rbp), %rax
movq -0x70(%rbp), %rcx
movq %rcx, %rsi
addq $-0x1, %rsi
movq %rsi, -0x70(%rbp)
movb %dl, -0x1(%rax,%rcx)
movq 0x10(%rbp), %rcx
movzbl -0x5b(%rbp), %eax
addq %rcx, %rax
movb %al, -0x5b(%rbp)
movq -0x78(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x78(%rbp)
jmp 0xb411
jmp 0xb470
cmpq $0x0, -0x70(%rbp)
jne 0xb479
jmp 0xb498
leaq 0x3760ac(%rip), %rdi    # 0x38152c
leaq 0x37603b(%rip), %rsi    # 0x3814c2
movl $0x3ca, %edx            # imm = 0x3CA
leaq 0x376040(%rip), %rcx    # 0x3814d3
callq 0x2130
jmp 0xb49a
movq -0x48(%rbp), %rcx
movq -0x10(%rbp), %rax
movq %rcx, (%rax)
movq -0x48(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x90, %rsp
popq %rbp
retq
nopw (%rax,%rax)