// File: chhylp123[P]hifiasm/Process_Read.cpp
// Function: ha_encode_base(unsigned char*, char*, unsigned long, N_t*, unsigned long)
void ha_encode_base(uint8_t* dest, char* src, uint64_t src_l, N_t *nn, uint64_t nn_offset)
{
    uint64_t i = 0;
    uint64_t dest_i = 0;
    uint8_t tmp = 0;
    uint8_t c = 0;

    while (i + 4 <= src_l) {
        tmp = 0;
		// fprintf(stderr, "i->%lu, src_l->%ld, src[i]->%c, (uint8_t)src[i]->%u\n", i, src_l, src[i], (uint8_t)src[i]);
        c = seq_nt6_table[(uint8_t)src[i]];
		if (c >= 4) {
			c = 0; kv_push(uint32_t, *nn, i+nn_offset);
		}
		i++;
        tmp = tmp | (c<<6);

        c = seq_nt6_table[(uint8_t)src[i]];
		if (c >= 4) {
			c = 0; kv_push(uint32_t, *nn, i+nn_offset);
		}
		i++;
        tmp = tmp | (c<<4);

        c = seq_nt6_table[(uint8_t)src[i]];
		if (c >= 4) {
			c = 0; kv_push(uint32_t, *nn, i+nn_offset);
		}
		i++;
        tmp = tmp | (c<<2);

        c = seq_nt6_table[(uint8_t)src[i]];
		if (c >= 4) {
			c = 0; kv_push(uint32_t, *nn, i+nn_offset);
		}
		i++;
        tmp = tmp | c;

        dest[dest_i] = tmp;

        dest_i++;
    }

    //at most 3 bases here
    uint64_t shift = 6;
    if (i < src_l) {
        tmp = 0;
        while (i < src_l) {
            c = seq_nt6_table[(uint8_t)src[i]];
			if (c >= 4) {
				c = 0; kv_push(uint32_t, *nn, i+nn_offset);
			}
			i++;
            tmp = tmp | (c << shift);
            shift = shift -2;
        }
        
        dest[dest_i] = tmp;
        dest_i++;
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x70, %rsp
movq %rdi, -0x8(%rbp)
movq %rsi, -0x10(%rbp)
movq %rdx, -0x18(%rbp)
movq %rcx, -0x20(%rbp)
movq %r8, -0x28(%rbp)
movq $0x0, -0x30(%rbp)
movq $0x0, -0x38(%rbp)
movb $0x0, -0x39(%rbp)
movb $0x0, -0x3a(%rbp)
movq -0x30(%rbp), %rax
addq $0x4, %rax
cmpq -0x18(%rbp), %rax
ja 0xc056
movb $0x0, -0x39(%rbp)
movq -0x10(%rbp), %rax
movq -0x30(%rbp), %rcx
movzbl (%rax,%rcx), %eax
movl %eax, %ecx
leaq 0x3b8961(%rip), %rax    # 0x3c4650
movb (%rax,%rcx), %al
movb %al, -0x3a(%rbp)
movzbl -0x3a(%rbp), %eax
cmpl $0x4, %eax
jl 0xbd96
movb $0x0, -0x3a(%rbp)
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x20(%rbp), %rcx
cmpq 0x10(%rcx), %rax
jne 0xbd6d
movq -0x20(%rbp), %rax
cmpq $0x0, 0x10(%rax)
je 0xbd34
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rax
shlq %rax
movq %rax, -0x50(%rbp)
jmp 0xbd3f
movl $0x2, %eax
movq %rax, -0x50(%rbp)
jmp 0xbd3f
movq -0x50(%rbp), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x20(%rbp), %rax
movq (%rax), %rdi
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rsi
shlq $0x2, %rsi
callq 0x2360
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, (%rax)
movq -0x30(%rbp), %rax
addq -0x28(%rbp), %rax
movl %eax, %edx
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq -0x20(%rbp), %rsi
movq 0x8(%rsi), %rcx
movq %rcx, %rdi
addq $0x1, %rdi
movq %rdi, 0x8(%rsi)
movl %edx, (%rax,%rcx,4)
jmp 0xbd96
movq -0x30(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x30(%rbp)
movzbl -0x39(%rbp), %eax
movzbl -0x3a(%rbp), %ecx
shll $0x6, %ecx
orl %ecx, %eax
movb %al, -0x39(%rbp)
movq -0x10(%rbp), %rax
movq -0x30(%rbp), %rcx
movzbl (%rax,%rcx), %eax
movl %eax, %ecx
leaq 0x3b8889(%rip), %rax    # 0x3c4650
movb (%rax,%rcx), %al
movb %al, -0x3a(%rbp)
movzbl -0x3a(%rbp), %eax
cmpl $0x4, %eax
jl 0xbe6e
movb $0x0, -0x3a(%rbp)
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x20(%rbp), %rcx
cmpq 0x10(%rcx), %rax
jne 0xbe45
movq -0x20(%rbp), %rax
cmpq $0x0, 0x10(%rax)
je 0xbe0c
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rax
shlq %rax
movq %rax, -0x58(%rbp)
jmp 0xbe17
movl $0x2, %eax
movq %rax, -0x58(%rbp)
jmp 0xbe17
movq -0x58(%rbp), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x20(%rbp), %rax
movq (%rax), %rdi
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rsi
shlq $0x2, %rsi
callq 0x2360
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, (%rax)
movq -0x30(%rbp), %rax
addq -0x28(%rbp), %rax
movl %eax, %edx
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq -0x20(%rbp), %rsi
movq 0x8(%rsi), %rcx
movq %rcx, %rdi
addq $0x1, %rdi
movq %rdi, 0x8(%rsi)
movl %edx, (%rax,%rcx,4)
jmp 0xbe6e
movq -0x30(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x30(%rbp)
movzbl -0x39(%rbp), %eax
movzbl -0x3a(%rbp), %ecx
shll $0x4, %ecx
orl %ecx, %eax
movb %al, -0x39(%rbp)
movq -0x10(%rbp), %rax
movq -0x30(%rbp), %rcx
movzbl (%rax,%rcx), %eax
movl %eax, %ecx
leaq 0x3b87b1(%rip), %rax    # 0x3c4650
movb (%rax,%rcx), %al
movb %al, -0x3a(%rbp)
movzbl -0x3a(%rbp), %eax
cmpl $0x4, %eax
jl 0xbf46
movb $0x0, -0x3a(%rbp)
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x20(%rbp), %rcx
cmpq 0x10(%rcx), %rax
jne 0xbf1d
movq -0x20(%rbp), %rax
cmpq $0x0, 0x10(%rax)
je 0xbee4
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rax
shlq %rax
movq %rax, -0x60(%rbp)
jmp 0xbeef
movl $0x2, %eax
movq %rax, -0x60(%rbp)
jmp 0xbeef
movq -0x60(%rbp), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x20(%rbp), %rax
movq (%rax), %rdi
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rsi
shlq $0x2, %rsi
callq 0x2360
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, (%rax)
movq -0x30(%rbp), %rax
addq -0x28(%rbp), %rax
movl %eax, %edx
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq -0x20(%rbp), %rsi
movq 0x8(%rsi), %rcx
movq %rcx, %rdi
addq $0x1, %rdi
movq %rdi, 0x8(%rsi)
movl %edx, (%rax,%rcx,4)
jmp 0xbf46
movq -0x30(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x30(%rbp)
movzbl -0x39(%rbp), %eax
movzbl -0x3a(%rbp), %ecx
shll $0x2, %ecx
orl %ecx, %eax
movb %al, -0x39(%rbp)
movq -0x10(%rbp), %rax
movq -0x30(%rbp), %rcx
movzbl (%rax,%rcx), %eax
movl %eax, %ecx
leaq 0x3b86d9(%rip), %rax    # 0x3c4650
movb (%rax,%rcx), %al
movb %al, -0x3a(%rbp)
movzbl -0x3a(%rbp), %eax
cmpl $0x4, %eax
jl 0xc01e
movb $0x0, -0x3a(%rbp)
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x20(%rbp), %rcx
cmpq 0x10(%rcx), %rax
jne 0xbff5
movq -0x20(%rbp), %rax
cmpq $0x0, 0x10(%rax)
je 0xbfbc
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rax
shlq %rax
movq %rax, -0x68(%rbp)
jmp 0xbfc7
movl $0x2, %eax
movq %rax, -0x68(%rbp)
jmp 0xbfc7
movq -0x68(%rbp), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x20(%rbp), %rax
movq (%rax), %rdi
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rsi
shlq $0x2, %rsi
callq 0x2360
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, (%rax)
movq -0x30(%rbp), %rax
addq -0x28(%rbp), %rax
movl %eax, %edx
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq -0x20(%rbp), %rsi
movq 0x8(%rsi), %rcx
movq %rcx, %rdi
addq $0x1, %rdi
movq %rdi, 0x8(%rsi)
movl %edx, (%rax,%rcx,4)
jmp 0xc01e
movq -0x30(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x30(%rbp)
movzbl -0x39(%rbp), %eax
movzbl -0x3a(%rbp), %ecx
orl %ecx, %eax
movb %al, -0x39(%rbp)
movb -0x39(%rbp), %dl
movq -0x8(%rbp), %rax
movq -0x38(%rbp), %rcx
movb %dl, (%rax,%rcx)
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
jmp 0xbcc4
movq $0x6, -0x48(%rbp)
movq -0x30(%rbp), %rax
cmpq -0x18(%rbp), %rax
jae 0xc186
movb $0x0, -0x39(%rbp)
movq -0x30(%rbp), %rax
cmpq -0x18(%rbp), %rax
jae 0xc16c
movq -0x10(%rbp), %rax
movq -0x30(%rbp), %rcx
movzbl (%rax,%rcx), %eax
movl %eax, %ecx
leaq 0x3b85bd(%rip), %rax    # 0x3c4650
movb (%rax,%rcx), %al
movb %al, -0x3a(%rbp)
movzbl -0x3a(%rbp), %eax
cmpl $0x4, %eax
jl 0xc13a
movb $0x0, -0x3a(%rbp)
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x20(%rbp), %rcx
cmpq 0x10(%rcx), %rax
jne 0xc111
movq -0x20(%rbp), %rax
cmpq $0x0, 0x10(%rax)
je 0xc0d8
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rax
shlq %rax
movq %rax, -0x70(%rbp)
jmp 0xc0e3
movl $0x2, %eax
movq %rax, -0x70(%rbp)
jmp 0xc0e3
movq -0x70(%rbp), %rcx
movq -0x20(%rbp), %rax
movq %rcx, 0x10(%rax)
movq -0x20(%rbp), %rax
movq (%rax), %rdi
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rsi
shlq $0x2, %rsi
callq 0x2360
movq %rax, %rcx
movq -0x20(%rbp), %rax
movq %rcx, (%rax)
movq -0x30(%rbp), %rax
addq -0x28(%rbp), %rax
movl %eax, %edx
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq -0x20(%rbp), %rsi
movq 0x8(%rsi), %rcx
movq %rcx, %rdi
addq $0x1, %rdi
movq %rdi, 0x8(%rsi)
movl %edx, (%rax,%rcx,4)
jmp 0xc13a
movq -0x30(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x30(%rbp)
movzbl -0x39(%rbp), %eax
movzbl -0x3a(%rbp), %edx
movq -0x48(%rbp), %rcx
shll %cl, %edx
movl %edx, %ecx
orl %ecx, %eax
movb %al, -0x39(%rbp)
movq -0x48(%rbp), %rax
subq $0x2, %rax
movq %rax, -0x48(%rbp)
jmp 0xc070
movb -0x39(%rbp), %dl
movq -0x8(%rbp), %rax
movq -0x38(%rbp), %rcx
movb %dl, (%rax,%rcx)
movq -0x38(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x38(%rbp)
addq $0x70, %rsp
popq %rbp
retq
nopl (%rax)