// File: sisong[P]ApkDiffPatch/HDiffPatch/libHDiffPatch/HDiff/private_diff/suffix_string.cpp
// Function: hdiff_private::TSuffixString::lower_bound(unsigned char const*, unsigned char const*) const
TInt TSuffixString::lower_bound(const TChar* str,const TChar* str_end)const{
    //not use any cached range table
    //return m_lower_bound(m_cached_SA_begin,m_cached_SA_end,
    //                     str,str_end,m_src_begin,m_src_end,m_cached_SA_begin,0);
#if (_SSTRING_FAST_MATCH>0)
    if (m_isUsedFastMatch&&(!m_fastMatch.isHit(TFastMatchForSString::getHash(str))))
        return -1;
    #define kMinStrLen _SSTRING_FAST_MATCH
#else
    //assert(str_end-str>=2);
    #define kMinStrLen 2
#endif
    if ((kMinStrLen>=2)&(m_cached2char_range!=0)){
        size_t cc=((size_t)str[1]) | (((size_t)str[0])<<8);
        size_t r0,r1;
        if (isUseLargeSA()){
            r0=((TInt*)m_cached2char_range)[cc]*sizeof(TInt);
            r1=((TInt*)m_cached2char_range)[cc+1]*sizeof(TInt);
        }else{
            r0=((TInt32*)m_cached2char_range)[cc]*sizeof(TInt32);
            r1=((TInt32*)m_cached2char_range)[cc+1]*sizeof(TInt32);
        }
        return m_lower_bound((TChar*)m_cached_SA_begin+r0,(TChar*)m_cached_SA_begin+r1,
                             str,str_end,m_src_begin,m_src_end,m_cached_SA_begin,2);
    }else if (kMinStrLen>0){
        size_t c=str[0];
        return m_lower_bound(m_cached1char_range[c],m_cached1char_range[c+1],
                             str,str_end,m_src_begin,m_src_end,m_cached_SA_begin,1);
    }else{
        return -1;
    }
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x60, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq -0x10(%rbp), %rax
movq %rax, -0x48(%rbp)
testb $0x1, 0x40(%rax)
je 0x39d93
movq -0x48(%rbp), %rax
addq $0x48, %rax
movq %rax, -0x50(%rbp)
movq -0x18(%rbp), %rdi
callq 0x3abb0
movq -0x50(%rbp), %rdi
movl %eax, %esi
callq 0x3ab80
testb $0x1, %al
jne 0x39d93
movq $-0x1, -0x8(%rbp)
jmp 0x39ed5
movq -0x48(%rbp), %rax
cmpq $0x0, 0x878(%rax)
setne %al
andb $0x1, %al
movzbl %al, %eax
andl $0x1, %eax
cmpl $0x0, %eax
je 0x39e87
movq -0x48(%rbp), %rdi
movq -0x18(%rbp), %rax
movzbl 0x1(%rax), %eax
movq -0x18(%rbp), %rcx
movzbl (%rcx), %ecx
shlq $0x8, %rcx
orq %rcx, %rax
movq %rax, -0x28(%rbp)
callq 0x2ae80
testb $0x1, %al
jne 0x39ddc
jmp 0x39e11
movq -0x48(%rbp), %rax
movq 0x878(%rax), %rcx
movq -0x28(%rbp), %rdx
movq (%rcx,%rdx,8), %rcx
shlq $0x3, %rcx
movq %rcx, -0x30(%rbp)
movq 0x878(%rax), %rax
movq -0x28(%rbp), %rcx
movq 0x8(%rax,%rcx,8), %rax
shlq $0x3, %rax
movq %rax, -0x38(%rbp)
jmp 0x39e44
movq -0x48(%rbp), %rax
movq 0x878(%rax), %rcx
movq -0x28(%rbp), %rdx
movslq (%rcx,%rdx,4), %rcx
shlq $0x2, %rcx
movq %rcx, -0x30(%rbp)
movq 0x878(%rax), %rax
movq -0x28(%rbp), %rcx
movslq 0x4(%rax,%rcx,4), %rax
shlq $0x2, %rax
movq %rax, -0x38(%rbp)
movq -0x48(%rbp), %r10
movq 0x880(%r10), %rax
movq 0x60(%r10), %rdi
addq -0x30(%rbp), %rdi
movq 0x60(%r10), %rsi
addq -0x38(%rbp), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq (%r10), %r8
movq 0x8(%r10), %r9
movq 0x60(%r10), %r10
movq %r10, (%rsp)
movq $0x2, 0x8(%rsp)
callq *%rax
movq %rax, -0x8(%rbp)
jmp 0x39ed5
movq -0x48(%rbp), %r10
movq -0x18(%rbp), %rax
movzbl (%rax), %eax
movq %rax, -0x40(%rbp)
movq 0x880(%r10), %rax
movq -0x40(%rbp), %rcx
movq 0x70(%r10,%rcx,8), %rdi
movq -0x40(%rbp), %rcx
movq 0x78(%r10,%rcx,8), %rsi
movq -0x18(%rbp), %rdx
movq -0x20(%rbp), %rcx
movq (%r10), %r8
movq 0x8(%r10), %r9
movq 0x60(%r10), %r10
movq %r10, (%rsp)
movq $0x1, 0x8(%rsp)
callq *%rax
movq %rax, -0x8(%rbp)
movq -0x8(%rbp), %rax
addq $0x60, %rsp
popq %rbp
retq
nop