// File: sisong[P]ApkDiffPatch/HDiffPatch/libHDiffPatch/HDiff/diff.cpp
// Function: (anonymous namespace)::tryLinkExtend((anonymous namespace)::TOldCover&, (anonymous namespace)::TOldCover const&, (anonymous namespace)::TDiffData const&, (anonymous namespace)::TDiffLimit*)
static bool tryLinkExtend(TOldCover& lastCover,const TOldCover& matchCover,const TDiffData& diff,TDiffLimit* diffLimit){
    if (lastCover.length<=0) return false;
    const TInt linkSpaceLength=(matchCover.newPos-(lastCover.newPos+lastCover.length));
    assert(linkSpaceLength>=0);
    if (linkSpaceLength>kMaxLinkSpaceLength)
        return false;
    TInt linkOldPos=lastCover.oldPos+lastCover.length+linkSpaceLength;
    if (linkOldPos+matchCover.length>(diff.oldData_end-diff.oldData))
        return false;
    const bool isCollinear=lastCover.isCollinear(matchCover);
    if (diffLimit){
        size_t cnewPos=lastCover.newPos+lastCover.length;
        hpatch_TCover cover={(size_t)(lastCover.oldPos+lastCover.length),cnewPos,
                             (size_t)(linkSpaceLength+(isCollinear?0:matchCover.length))};
        if (!diffLimit->listener->limitCover(diffLimit->listener,&cover,0))
            return false;
    }
    if (isCollinear){//已经共线;
        lastCover.Link(matchCover);
        return true;
    }

    TInt matchCost=getCoverCtrlCost(matchCover,lastCover);
    TInt lastLinkCost=(TInt)getRegionRleCost(diff.newData+matchCover.newPos,matchCover.length,diff.oldData+linkOldPos);
    if (lastLinkCost>matchCost)
        return false;
    TInt len=lastCover.length+linkSpaceLength+(matchCover.length*2/3);//扩展大部分,剩下的可能扩展留给extend_cover.
    len+=getEqualLength(diff.newData+lastCover.newPos+len,diff.newData_end,
                        diff.oldData+lastCover.oldPos+len,diff.oldData_end);
    if (diffLimit){
        TInt limitLen=diffLimit->newEnd-lastCover.newPos;
        len=len<limitLen?len:limitLen;
        TInt safeLen=lastCover.length+linkSpaceLength+matchCover.length;
        if (len>safeLen){
            hpatch_TCover cover={(size_t)(lastCover.oldPos+safeLen),(size_t)(lastCover.newPos+safeLen),
                                 (size_t)(len-safeLen)};
            hpatch_StreamPos_t hitPos;
            diffLimit->listener->limitCover(diffLimit->listener,&cover,&hitPos);
            len=(TInt)(safeLen+hitPos);
        }
    }
    while ((len>0) && (diff.newData[lastCover.newPos+len-1]
                       !=diff.oldData[lastCover.oldPos+len-1])) {
        --len;
    }
    lastCover.length=len;
    return true;
}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0xe0, %rsp
movq %rdi, -0x10(%rbp)
movq %rsi, -0x18(%rbp)
movq %rdx, -0x20(%rbp)
movq %rcx, -0x28(%rbp)
movq -0x10(%rbp), %rax
cmpq $0x0, 0x10(%rax)
jg 0x2344f
movb $0x0, -0x1(%rbp)
jmp 0x2380a
movq -0x18(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x10(%rbp), %rcx
movq 0x8(%rcx), %rcx
movq -0x10(%rbp), %rdx
addq 0x10(%rdx), %rcx
subq %rcx, %rax
movq %rax, -0x30(%rbp)
cmpq $0x0, -0x30(%rbp)
jl 0x23477
jmp 0x23496
leaq 0x8bd58(%rip), %rdi     # 0xaf1d6
leaq 0x8b8fd(%rip), %rsi     # 0xaed82
movl $0xde, %edx
leaq 0x8bd58(%rip), %rcx     # 0xaf1e9
callq 0x4270
cmpq $0x1ff, -0x30(%rbp)     # imm = 0x1FF
jle 0x234a9
movb $0x0, -0x1(%rbp)
jmp 0x2380a
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq -0x10(%rbp), %rcx
addq 0x10(%rcx), %rax
addq -0x30(%rbp), %rax
movq %rax, -0x38(%rbp)
movq -0x38(%rbp), %rax
movq -0x18(%rbp), %rcx
addq 0x10(%rcx), %rax
movq -0x20(%rbp), %rcx
movq 0x18(%rcx), %rcx
movq -0x20(%rbp), %rdx
movq 0x10(%rdx), %rdx
subq %rdx, %rcx
cmpq %rcx, %rax
jle 0x234ed
movb $0x0, -0x1(%rbp)
jmp 0x2380a
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x23c40
andb $0x1, %al
movb %al, -0x39(%rbp)
cmpq $0x0, -0x28(%rbp)
je 0x235b8
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
movq -0x10(%rbp), %rcx
addq 0x10(%rcx), %rax
movq %rax, -0x48(%rbp)
movq -0x10(%rbp), %rax
movq (%rax), %rax
movq -0x10(%rbp), %rcx
addq 0x10(%rcx), %rax
movq %rax, -0x60(%rbp)
movq -0x48(%rbp), %rax
movq %rax, -0x58(%rbp)
leaq -0x60(%rbp), %rax
addq $0x10, %rax
movq %rax, -0xb8(%rbp)
movq -0x30(%rbp), %rax
movq %rax, -0xb0(%rbp)
testb $0x1, -0x39(%rbp)
je 0x23564
xorl %eax, %eax
movq %rax, -0xc0(%rbp)
jmp 0x23573
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
movq %rax, -0xc0(%rbp)
movq -0xb8(%rbp), %rax
movq -0xb0(%rbp), %rcx
movq -0xc0(%rbp), %rdx
addq %rdx, %rcx
movq %rcx, (%rax)
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rcx
movq (%rcx), %rdi
leaq -0x60(%rbp), %rsi
xorl %ecx, %ecx
movl %ecx, %edx
callq *%rax
testb $0x1, %al
jne 0x235b6
movb $0x0, -0x1(%rbp)
jmp 0x2380a
jmp 0x235b8
testb $0x1, -0x39(%rbp)
je 0x235d4
movq -0x10(%rbp), %rdi
movq -0x18(%rbp), %rsi
callq 0x23c70
movb $0x1, -0x1(%rbp)
jmp 0x2380a
movq -0x18(%rbp), %rdi
movq -0x10(%rbp), %rsi
callq 0x233b0
movq %rax, -0x68(%rbp)
movq -0x20(%rbp), %rax
movq (%rax), %rdi
movq -0x18(%rbp), %rax
addq 0x8(%rax), %rdi
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rsi
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rdx
addq -0x38(%rbp), %rdx
xorl %eax, %eax
movl %eax, %r8d
movq %r8, %rcx
callq 0x3d780
movq %rax, -0x70(%rbp)
movq -0x70(%rbp), %rax
cmpq -0x68(%rbp), %rax
jle 0x2362c
movb $0x0, -0x1(%rbp)
jmp 0x2380a
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
addq -0x30(%rbp), %rax
movq %rax, -0xc8(%rbp)
movq -0x18(%rbp), %rax
movq 0x10(%rax), %rax
shlq %rax
movl $0x3, %ecx
cqto
idivq %rcx
movq %rax, %rcx
movq -0xc8(%rbp), %rax
addq %rcx, %rax
movq %rax, -0x78(%rbp)
movq -0x20(%rbp), %rax
movq (%rax), %rdi
movq -0x10(%rbp), %rax
addq 0x8(%rax), %rdi
addq -0x78(%rbp), %rdi
movq -0x20(%rbp), %rax
movq 0x8(%rax), %rsi
movq -0x20(%rbp), %rax
movq 0x10(%rax), %rdx
movq -0x10(%rbp), %rax
addq (%rax), %rdx
addq -0x78(%rbp), %rdx
movq -0x20(%rbp), %rax
movq 0x18(%rax), %rcx
callq 0x239d0
addq -0x78(%rbp), %rax
movq %rax, -0x78(%rbp)
cmpq $0x0, -0x28(%rbp)
je 0x2378e
movq -0x28(%rbp), %rax
movq 0x10(%rax), %rax
movq -0x10(%rbp), %rcx
subq 0x8(%rcx), %rax
movq %rax, -0x80(%rbp)
movq -0x78(%rbp), %rax
cmpq -0x80(%rbp), %rax
jge 0x236de
movq -0x78(%rbp), %rax
movq %rax, -0xd0(%rbp)
jmp 0x236e9
movq -0x80(%rbp), %rax
movq %rax, -0xd0(%rbp)
movq -0xd0(%rbp), %rax
movq %rax, -0x78(%rbp)
movq -0x10(%rbp), %rax
movq 0x10(%rax), %rax
addq -0x30(%rbp), %rax
movq -0x18(%rbp), %rcx
addq 0x10(%rcx), %rax
movq %rax, -0x88(%rbp)
movq -0x78(%rbp), %rax
cmpq -0x88(%rbp), %rax
jle 0x2378c
movq -0x10(%rbp), %rax
movq (%rax), %rax
addq -0x88(%rbp), %rax
movq %rax, -0xa0(%rbp)
movq -0x10(%rbp), %rax
movq 0x8(%rax), %rax
addq -0x88(%rbp), %rax
movq %rax, -0x98(%rbp)
movq -0x78(%rbp), %rax
subq -0x88(%rbp), %rax
movq %rax, -0x90(%rbp)
movq -0x28(%rbp), %rax
movq (%rax), %rax
movq (%rax), %rax
movq -0x28(%rbp), %rcx
movq (%rcx), %rdi
leaq -0xa0(%rbp), %rsi
leaq -0xa8(%rbp), %rdx
callq *%rax
movq -0x88(%rbp), %rax
addq -0xa8(%rbp), %rax
movq %rax, -0x78(%rbp)
jmp 0x2378e
jmp 0x23790
xorl %eax, %eax
cmpq $0x0, -0x78(%rbp)
movb %al, -0xd1(%rbp)
jle 0x237e0
movq -0x20(%rbp), %rax
movq (%rax), %rax
movq -0x10(%rbp), %rcx
movq 0x8(%rcx), %rcx
addq -0x78(%rbp), %rcx
subq $0x1, %rcx
movzbl (%rax,%rcx), %eax
movq -0x20(%rbp), %rcx
movq 0x10(%rcx), %rcx
movq -0x10(%rbp), %rdx
movq (%rdx), %rdx
addq -0x78(%rbp), %rdx
subq $0x1, %rdx
movzbl (%rcx,%rdx), %ecx
cmpl %ecx, %eax
setne %al
movb %al, -0xd1(%rbp)
movb -0xd1(%rbp), %al
testb $0x1, %al
jne 0x237ec
jmp 0x237fa
movq -0x78(%rbp), %rax
addq $-0x1, %rax
movq %rax, -0x78(%rbp)
jmp 0x23790
movq -0x78(%rbp), %rcx
movq -0x10(%rbp), %rax
movq %rcx, 0x10(%rax)
movb $0x1, -0x1(%rbp)
movb -0x1(%rbp), %al
andb $0x1, %al
addq $0xe0, %rsp
popq %rbp
retq
nopl (%rax,%rax)