// File: chhylp123[P]hifiasm/Process_Read.cpp
// Function: load_compress_base_disk(_IO_FILE*, unsigned long*, char*, unsigned int*, ul_vec_t*)
int64_t load_compress_base_disk(FILE *fp, uint64_t *ul_rid, char *dest, uint32_t *len, ul_vec_t *buf)
{
	fread(ul_rid, sizeof((*ul_rid)), 1, fp);
	if(feof(fp)) return 0;
	fread(len, sizeof((*len)), 1, fp);
	fread(&buf->N_site.n, sizeof(buf->N_site.n), 1, fp);
	kv_resize(uint32_t, buf->N_site, buf->N_site.n);
	fread(buf->N_site.a, sizeof((*buf->N_site.a)), buf->N_site.n, fp);
	buf->r_base.n = B4L((*len)); kv_resize(uint8_t, buf->r_base, buf->r_base.n); 
	fread(buf->r_base.a, sizeof((*buf->r_base.a)), buf->r_base.n, fp);

	int64_t ssp, sep, sl, offset, begLen, tailLen, a_n, src_i, des_i, i;
	ssp = 0; sep = (*len); sl = sep - ssp;
	offset = ssp&3; begLen = 4-offset;
	if(begLen > sl) begLen = sl;
	tailLen = (sl-begLen)&3;
	a_n = (sl - begLen - tailLen)>>2;

	src_i = ssp; i = 0; des_i = 0;
	if(begLen > 0) {
		memcpy(dest+des_i, bit_t_seq_table[buf->r_base.a[src_i>>2]]+offset, begLen);
		des_i += begLen; src_i += begLen;
	}

	for (i = 0; i < a_n; i++) {
		memcpy(dest+des_i, bit_t_seq_table[buf->r_base.a[src_i>>2]], 4);
		des_i += 4; src_i += 4;
	}

	if(tailLen > 0) {
		memcpy(dest+des_i, bit_t_seq_table[buf->r_base.a[src_i>>2]], tailLen);
		des_i += tailLen; src_i += tailLen;
	}
	return 1;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x80, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
movq %r8, -0x30(%rbp)
movq -0x18(%rbp), %rdi
movq -0x10(%rbp), %rcx
movl $0x8, %esi
movl $0x1, %edx
callq 0x22e0
movq -0x10(%rbp), %rdi
callq 0x2310
cmpl $0x0, %eax
je 0x137e1
movq $0x0, -0x8(%rbp)
jmp 0x13bda
movq -0x28(%rbp), %rdi
movq -0x10(%rbp), %rcx
movl $0x4, %esi
movl $0x1, %edx
callq 0x22e0
movq -0x30(%rbp), %rdi
addq $0x38, %rdi
addq $0x8, %rdi
movq -0x10(%rbp), %rcx
movl $0x8, %esi
movl $0x1, %edx
callq 0x22e0
movq -0x30(%rbp), %rax
movq 0x48(%rax), %rax
movq -0x30(%rbp), %rcx
cmpq 0x40(%rcx), %rax
jae 0x138f8
movq -0x30(%rbp), %rax
movq 0x40(%rax), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x48(%rax)
movq -0x30(%rbp), %rax
movq 0x48(%rax), %rcx
addq $-0x1, %rcx
movq %rcx, 0x48(%rax)
movq -0x30(%rbp), %rax
movq 0x48(%rax), %rcx
shrq %rcx
movq -0x30(%rbp), %rax
orq 0x48(%rax), %rcx
movq %rcx, 0x48(%rax)
movq -0x30(%rbp), %rax
movq 0x48(%rax), %rcx
shrq $0x2, %rcx
movq -0x30(%rbp), %rax
orq 0x48(%rax), %rcx
movq %rcx, 0x48(%rax)
movq -0x30(%rbp), %rax
movq 0x48(%rax), %rcx
shrq $0x4, %rcx
movq -0x30(%rbp), %rax
orq 0x48(%rax), %rcx
movq %rcx, 0x48(%rax)
movq -0x30(%rbp), %rax
movq 0x48(%rax), %rcx
shrq $0x8, %rcx
movq -0x30(%rbp), %rax
orq 0x48(%rax), %rcx
movq %rcx, 0x48(%rax)
movq -0x30(%rbp), %rax
movq 0x48(%rax), %rcx
shrq $0x10, %rcx
movq -0x30(%rbp), %rax
orq 0x48(%rax), %rcx
movq %rcx, 0x48(%rax)
movq -0x30(%rbp), %rax
movq 0x48(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x48(%rax)
movq -0x30(%rbp), %rax
movq 0x38(%rax), %rdi
movq -0x30(%rbp), %rax
movq 0x48(%rax), %rsi
shlq $0x2, %rsi
callq 0x2360
movq %rax, %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x38(%rax)
jmp 0x138fa
movq -0x30(%rbp), %rax
movq 0x38(%rax), %rdi
movq -0x30(%rbp), %rax
movq 0x40(%rax), %rdx
movq -0x10(%rbp), %rcx
movl $0x4, %esi
callq 0x22e0
movq -0x28(%rbp), %rax
movl (%rax), %eax
shrl $0x2, %eax
movq -0x28(%rbp), %rcx
movl (%rcx), %esi
andl $0x3, %esi
xorl %ecx, %ecx
movl $0x1, %edx
cmpl $0x0, %esi
cmovnel %edx, %ecx
addl %ecx, %eax
movl %eax, %eax
movl %eax, %ecx
movq -0x30(%rbp), %rax
movq %rcx, (%rax)
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x30(%rbp), %rcx
cmpq (%rcx), %rax
jae 0x13a23
movq -0x30(%rbp), %rax
movq (%rax), %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x8(%rax)
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rcx
addq $-0x1, %rcx
movq %rcx, 0x8(%rax)
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rcx
shrq %rcx
movq -0x30(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rcx
shrq $0x2, %rcx
movq -0x30(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rcx
shrq $0x4, %rcx
movq -0x30(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rcx
shrq $0x8, %rcx
movq -0x30(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rcx
shrq $0x10, %rcx
movq -0x30(%rbp), %rax
orq 0x8(%rax), %rcx
movq %rcx, 0x8(%rax)
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rcx
addq $0x1, %rcx
movq %rcx, 0x8(%rax)
movq -0x30(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x30(%rbp), %rax
movq 0x8(%rax), %rsi
shlq $0x0, %rsi
callq 0x2360
movq %rax, %rcx
movq -0x30(%rbp), %rax
movq %rcx, 0x10(%rax)
jmp 0x13a25
movq -0x30(%rbp), %rax
movq 0x10(%rax), %rdi
movq -0x30(%rbp), %rax
movq (%rax), %rdx
movq -0x10(%rbp), %rcx
movl $0x1, %esi
callq 0x22e0
movq $0x0, -0x38(%rbp)
movq -0x28(%rbp), %rax
movl (%rax), %eax
movq %rax, -0x40(%rbp)
movq -0x40(%rbp), %rax
subq -0x38(%rbp), %rax
movq %rax, -0x48(%rbp)
movq -0x38(%rbp), %rax
andq $0x3, %rax
movq %rax, -0x50(%rbp)
movl $0x4, %eax
subq -0x50(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x58(%rbp), %rax
cmpq -0x48(%rbp), %rax
jle 0x13a8b
movq -0x48(%rbp), %rax
movq %rax, -0x58(%rbp)
movq -0x48(%rbp), %rax
subq -0x58(%rbp), %rax
andq $0x3, %rax
movq %rax, -0x60(%rbp)
movq -0x48(%rbp), %rax
subq -0x58(%rbp), %rax
subq -0x60(%rbp), %rax
sarq $0x2, %rax
movq %rax, -0x68(%rbp)
movq -0x38(%rbp), %rax
movq %rax, -0x70(%rbp)
movq $0x0, -0x80(%rbp)
movq $0x0, -0x78(%rbp)
cmpq $0x0, -0x58(%rbp)
jle 0x13b1d
movq -0x20(%rbp), %rdi
addq -0x78(%rbp), %rdi
movq -0x30(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x70(%rbp), %rcx
sarq $0x2, %rcx
movzbl (%rax,%rcx), %eax
leaq 0x3b0fdf(%rip), %rsi    # 0x3c4ad0
shlq $0x2, %rax
addq %rax, %rsi
addq -0x50(%rbp), %rsi
movq -0x58(%rbp), %rdx
callq 0x2180
movq -0x58(%rbp), %rax
addq -0x78(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x58(%rbp), %rax
addq -0x70(%rbp), %rax
movq %rax, -0x70(%rbp)
movq $0x0, -0x80(%rbp)
movq -0x80(%rbp), %rax
cmpq -0x68(%rbp), %rax
jge 0x13b80
movq -0x20(%rbp), %rax
movq -0x78(%rbp), %rcx
movq -0x30(%rbp), %rdx
movq 0x10(%rdx), %rdx
movq -0x70(%rbp), %rsi
sarq $0x2, %rsi
movzbl (%rdx,%rsi), %edx
movl %edx, %esi
leaq 0x3b0f7c(%rip), %rdx    # 0x3c4ad0
movl (%rdx,%rsi,4), %edx
movl %edx, (%rax,%rcx)
movq -0x78(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x78(%rbp)
movq -0x70(%rbp), %rax
addq $0x4, %rax
movq %rax, -0x70(%rbp)
movq -0x80(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x80(%rbp)
jmp 0x13b25
cmpq $0x0, -0x60(%rbp)
jle 0x13bd2
movq -0x20(%rbp), %rdi
addq -0x78(%rbp), %rdi
movq -0x30(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x70(%rbp), %rcx
sarq $0x2, %rcx
movzbl (%rax,%rcx), %eax
leaq 0x3b0f26(%rip), %rsi    # 0x3c4ad0
shlq $0x2, %rax
addq %rax, %rsi
movq -0x60(%rbp), %rdx
callq 0x2180
movq -0x60(%rbp), %rax
addq -0x78(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x60(%rbp), %rax
addq -0x70(%rbp), %rax
movq %rax, -0x70(%rbp)
movq $0x1, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x80, %rsp
popq %rbp
retq
nopw (%rax,%rax)