// File: chhylp123[P]hifiasm/hic.cpp
// Function: check_exact_match(char*, long long, long long, char*, long long, long long, long long, unsigned long, unsigned long)
inline uint64_t check_exact_match(char* a, long long a_beg, long long a_total, char* b, long long b_beg, 
long long b_total, long long Len, uint64_t rev, uint64_t dir)
{
    long long i = 0;
    if(rev == 0)
    {
        if(dir == 0)
        {
            for (i = 0; i < Len && a_beg < a_total && b_beg < b_total; i++)
            {
                if(a[a_beg++] != b[b_beg++]) return i;
            }
        }
        else
        {
            for (i = 0; i < Len && a_beg >= 0 && b_beg >= 0; i++)
            {
                if(a[a_beg--] != b[b_beg--]) return i;
            }
        }
    }
    else
    {

        if(dir == 0)
        {
            for (i = 0; i < Len && a_beg < a_total && b_beg < b_total; i++)
            {
                if(a[a_beg] != b2rc[seq_nt4_table[(uint8_t)b[b_total - b_beg - 1]]]) return i;
                a_beg++; b_beg++;
            }
        }
        else
        {
            for (i = 0; i < Len && a_beg >= 0 && b_beg >= 0; i++)
            {
                if(a[a_beg] != b2rc[seq_nt4_table[(uint8_t)b[b_total - b_beg - 1]]]) return i;
                a_beg--; b_beg--;
            }
        }
    }

    return i;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
movq 0x20(%rbp), %rax
movq 0x18(%rbp), %rax
movq 0x10(%rbp), %rax
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
movq %r8, -0x30(%rbp)
movq %r9, -0x38(%rbp)
movq $0x0, -0x40(%rbp)
cmpq $0x0, 0x18(%rbp)
jne 0x2133d7
cmpq $0x0, 0x20(%rbp)
jne 0x21334a
movq $0x0, -0x40(%rbp)
movq -0x40(%rbp), %rcx
xorl %eax, %eax
cmpq 0x10(%rbp), %rcx
movb %al, -0x41(%rbp)
jge 0x2132ea
movq -0x18(%rbp), %rcx
xorl %eax, %eax
cmpq -0x20(%rbp), %rcx
movb %al, -0x41(%rbp)
jge 0x2132ea
movq -0x30(%rbp), %rax
cmpq -0x38(%rbp), %rax
setl %al
movb %al, -0x41(%rbp)
movb -0x41(%rbp), %al
testb $0x1, %al
jne 0x2132f3
jmp 0x213345
movq -0x10(%rbp), %rax
movq -0x18(%rbp), %rcx
movq %rcx, %rdx
addq $0x1, %rdx
movq %rdx, -0x18(%rbp)
movsbl (%rax,%rcx), %eax
movq -0x28(%rbp), %rcx
movq -0x30(%rbp), %rdx
movq %rdx, %rsi
addq $0x1, %rsi
movq %rsi, -0x30(%rbp)
movsbl (%rcx,%rdx), %ecx
cmpl %ecx, %eax
je 0x213332
movq -0x40(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x21354c
jmp 0x213334
movq -0x40(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x40(%rbp)
jmp 0x2132be
jmp 0x2133d2
movq $0x0, -0x40(%rbp)
movq -0x40(%rbp), %rcx
xorl %eax, %eax
cmpq 0x10(%rbp), %rcx
movb %al, -0x42(%rbp)
jge 0x213378
xorl %eax, %eax
cmpq $0x0, -0x18(%rbp)
movb %al, -0x42(%rbp)
jl 0x213378
cmpq $0x0, -0x30(%rbp)
setge %al
movb %al, -0x42(%rbp)
movb -0x42(%rbp), %al
testb $0x1, %al
jne 0x213381
jmp 0x2133d0
movq -0x10(%rbp), %rax
movq -0x18(%rbp), %rcx
movq %rcx, %rdx
addq $-0x1, %rdx
movq %rdx, -0x18(%rbp)
movsbl (%rax,%rcx), %eax
movq -0x28(%rbp), %rcx
movq -0x30(%rbp), %rdx
movq %rdx, %rsi
addq $-0x1, %rsi
movq %rsi, -0x30(%rbp)
movsbl (%rcx,%rdx), %ecx
cmpl %ecx, %eax
je 0x2133c0
movq -0x40(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x21354c
jmp 0x2133c2
movq -0x40(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x40(%rbp)
jmp 0x213352
jmp 0x2133d2
jmp 0x213544
cmpq $0x0, 0x20(%rbp)
jne 0x213498
movq $0x0, -0x40(%rbp)
movq -0x40(%rbp), %rcx
xorl %eax, %eax
cmpq 0x10(%rbp), %rcx
movb %al, -0x43(%rbp)
jge 0x213416
movq -0x18(%rbp), %rcx
xorl %eax, %eax
cmpq -0x20(%rbp), %rcx
movb %al, -0x43(%rbp)
jge 0x213416
movq -0x30(%rbp), %rax
cmpq -0x38(%rbp), %rax
setl %al
movb %al, -0x43(%rbp)
movb -0x43(%rbp), %al
testb $0x1, %al
jne 0x21341f
jmp 0x213493
movq -0x10(%rbp), %rax
movq -0x18(%rbp), %rcx
movsbl (%rax,%rcx), %eax
movq -0x28(%rbp), %rcx
movq -0x38(%rbp), %rdx
subq -0x30(%rbp), %rdx
subq $0x1, %rdx
movzbl (%rcx,%rdx), %ecx
movl %ecx, %edx
leaq 0x177398(%rip), %rcx    # 0x38a7e0
movzbl (%rcx,%rdx), %ecx
movl %ecx, %edx
leaq 0x17a463(%rip), %rcx    # 0x38d8b8
movzbl (%rcx,%rdx), %ecx
cmpl %ecx, %eax
je 0x21346a
movq -0x40(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x21354c
movq -0x18(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x18(%rbp)
movq -0x30(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x30(%rbp)
movq -0x40(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x40(%rbp)
jmp 0x2133ea
jmp 0x213542
movq $0x0, -0x40(%rbp)
movq -0x40(%rbp), %rcx
xorl %eax, %eax
cmpq 0x10(%rbp), %rcx
movb %al, -0x44(%rbp)
jge 0x2134c6
xorl %eax, %eax
cmpq $0x0, -0x18(%rbp)
movb %al, -0x44(%rbp)
jl 0x2134c6
cmpq $0x0, -0x30(%rbp)
setge %al
movb %al, -0x44(%rbp)
movb -0x44(%rbp), %al
testb $0x1, %al
jne 0x2134cf
jmp 0x213540
movq -0x10(%rbp), %rax
movq -0x18(%rbp), %rcx
movsbl (%rax,%rcx), %eax
movq -0x28(%rbp), %rcx
movq -0x38(%rbp), %rdx
subq -0x30(%rbp), %rdx
subq $0x1, %rdx
movzbl (%rcx,%rdx), %ecx
movl %ecx, %edx
leaq 0x1772e8(%rip), %rcx    # 0x38a7e0
movzbl (%rcx,%rdx), %ecx
movl %ecx, %edx
leaq 0x17a3b3(%rip), %rcx    # 0x38d8b8
movzbl (%rcx,%rdx), %ecx
cmpl %ecx, %eax
je 0x213517
movq -0x40(%rbp), %rax
movq %rax, -0x8(%rbp)
jmp 0x21354c
movq -0x18(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x18(%rbp)
movq -0x30(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x30(%rbp)
movq -0x40(%rbp), %rax
addq $0x1, %rax
movq %rax, -0x40(%rbp)
jmp 0x2134a0
jmp 0x213542
jmp 0x213544
movq -0x40(%rbp), %rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
popq %rbp
retq
nopw %cs:(%rax,%rax)
nopl (%rax)