Blame asm/i386/src/lzo1x_d.ash

Packit Service 5195f2
/* lzo1x_d.ash -- assembler implementation of the LZO1X decompression algorithm
Packit Service 5195f2
Packit Service 5195f2
   This file is part of the LZO real-time data compression library.
Packit Service 5195f2
Packit Service 5195f2
   Copyright (C) 1996-2014 Markus Franz Xaver Johannes Oberhumer
Packit Service 5195f2
   All Rights Reserved.
Packit Service 5195f2
Packit Service 5195f2
   The LZO library is free software; you can redistribute it and/or
Packit Service 5195f2
   modify it under the terms of the GNU General Public License as
Packit Service 5195f2
   published by the Free Software Foundation; either version 2 of
Packit Service 5195f2
   the License, or (at your option) any later version.
Packit Service 5195f2
Packit Service 5195f2
   The LZO library is distributed in the hope that it will be useful,
Packit Service 5195f2
   but WITHOUT ANY WARRANTY; without even the implied warranty of
Packit Service 5195f2
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
Packit Service 5195f2
   GNU General Public License for more details.
Packit Service 5195f2
Packit Service 5195f2
   You should have received a copy of the GNU General Public License
Packit Service 5195f2
   along with the LZO library; see the file COPYING.
Packit Service 5195f2
   If not, write to the Free Software Foundation, Inc.,
Packit Service 5195f2
   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
Packit Service 5195f2
Packit Service 5195f2
   Markus F.X.J. Oberhumer
Packit Service 5195f2
   <markus@oberhumer.com>
Packit Service 5195f2
   http://www.oberhumer.com/opensource/lzo/
Packit Service 5195f2
 */
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
#if !defined(LZO1X) && !defined(LZO1Y)
Packit Service 5195f2
#  define LZO1X
Packit Service 5195f2
#endif
Packit Service 5195f2
Packit Service 5195f2
#if defined(LZO_FAST)
Packit Service 5195f2
#  define NN    3
Packit Service 5195f2
#else
Packit Service 5195f2
#  define NN    0
Packit Service 5195f2
#endif
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
/***********************************************************************
Packit Service 5195f2
// init
Packit Service 5195f2
************************************************************************/
Packit Service 5195f2
Packit Service 5195f2
        xorl    %eax,%eax
Packit Service 5195f2
        xorl    %ebx,%ebx       /* high bits 9-32 stay 0 */
Packit Service 5195f2
        lodsb
Packit Service 5195f2
        cmpb    $17,%al
Packit Service 5195f2
        jbe     .L01
Packit Service 5195f2
        subb    $17-NN,%al
Packit Service 5195f2
#if defined(LZO_FAST)
Packit Service 5195f2
        jmp     .LFLR
Packit Service 5195f2
#else
Packit Service 5195f2
        cmpb    $4,%al
Packit Service 5195f2
        jae     .LFLR
Packit Service 5195f2
#if 1
Packit Service 5195f2
        TEST_OP((%edi,%eax),%edx)
Packit Service 5195f2
        TEST_IP((%esi,%eax),%edx)
Packit Service 5195f2
        movl    %eax,%ecx
Packit Service 5195f2
        jmp     .LFLR2
Packit Service 5195f2
#else
Packit Service 5195f2
        jmp     .LFLR3
Packit Service 5195f2
#endif
Packit Service 5195f2
#endif
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
/***********************************************************************
Packit Service 5195f2
// literal run
Packit Service 5195f2
************************************************************************/
Packit Service 5195f2
Packit Service 5195f2
0:      addl    N_255,%eax
Packit Service 5195f2
        TEST_IP(18(%esi,%eax),%edx)     /* minimum */
Packit Service 5195f2
1:      movb    (%esi),%bl
Packit Service 5195f2
        incl    %esi
Packit Service 5195f2
        orb     %bl,%bl
Packit Service 5195f2
        jz      0b
Packit Service 5195f2
        leal    18+NN(%eax,%ebx),%eax
Packit Service 5195f2
        jmp     3f
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
        ALIGN3
Packit Service 5195f2
.L00:
Packit Service 5195f2
#ifdef LZO_DEBUG
Packit Service 5195f2
    andl $0xffffff00,%eax ; jnz .L_assert_fail
Packit Service 5195f2
    andl $0xffffff00,%ebx ; jnz .L_assert_fail
Packit Service 5195f2
    xorl %eax,%eax ; xorl %ebx,%ebx
Packit Service 5195f2
    xorl %ecx,%ecx ; xorl %edx,%edx
Packit Service 5195f2
#endif
Packit Service 5195f2
        TEST_IP_R(%esi)
Packit Service 5195f2
        LODSB
Packit Service 5195f2
.L01:
Packit Service 5195f2
        cmpb    $16,%al
Packit Service 5195f2
        jae     .LMATCH
Packit Service 5195f2
Packit Service 5195f2
/* a literal run */
Packit Service 5195f2
        orb     %al,%al
Packit Service 5195f2
        jz      1b
Packit Service 5195f2
        addl    $3+NN,%eax
Packit Service 5195f2
3:
Packit Service 5195f2
.LFLR:
Packit Service 5195f2
        TEST_OP(-NN(%edi,%eax),%edx)
Packit Service 5195f2
        TEST_IP(-NN(%esi,%eax),%edx)
Packit Service 5195f2
#if defined(LZO_FAST)
Packit Service 5195f2
        movl    %eax,%ecx
Packit Service 5195f2
        NOTL_3(%eax)
Packit Service 5195f2
        shrl    $2,%ecx
Packit Service 5195f2
        andl    N_3,%eax
Packit Service 5195f2
        COPYL(%esi,%edi,%edx)
Packit Service 5195f2
        subl    %eax,%esi
Packit Service 5195f2
        subl    %eax,%edi
Packit Service 5195f2
#else
Packit Service 5195f2
        movl    %eax,%ecx
Packit Service 5195f2
        shrl    $2,%eax
Packit Service 5195f2
        andl    N_3,%ecx
Packit Service 5195f2
        COPYL_C(%esi,%edi,%edx,%eax)
Packit Service 5195f2
.LFLR2:
Packit Service 5195f2
        rep
Packit Service 5195f2
        movsb
Packit Service 5195f2
#endif
Packit Service 5195f2
Packit Service 5195f2
#ifdef LZO_DEBUG
Packit Service 5195f2
    andl $0xffffff00,%eax ; jnz .L_assert_fail
Packit Service 5195f2
    andl $0xffffff00,%ebx ; jnz .L_assert_fail
Packit Service 5195f2
    xorl %eax,%eax ; xorl %ebx,%ebx
Packit Service 5195f2
    xorl %ecx,%ecx ; xorl %edx,%edx
Packit Service 5195f2
#endif
Packit Service 5195f2
        LODSB
Packit Service 5195f2
        cmpb    $16,%al
Packit Service 5195f2
        jae     .LMATCH
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
/***********************************************************************
Packit Service 5195f2
// R1
Packit Service 5195f2
************************************************************************/
Packit Service 5195f2
Packit Service 5195f2
        TEST_OP(3(%edi),%edx)
Packit Service 5195f2
        shrl    $2,%eax
Packit Service 5195f2
        movb    (%esi),%bl
Packit Service 5195f2
#if defined(LZO1X)
Packit Service 5195f2
        leal    -0x801(%edi),%edx
Packit Service 5195f2
#elif defined(LZO1Y)
Packit Service 5195f2
        leal    -0x401(%edi),%edx
Packit Service 5195f2
#endif
Packit Service 5195f2
        leal    (%eax,%ebx,4),%eax
Packit Service 5195f2
        incl    %esi
Packit Service 5195f2
        subl    %eax,%edx
Packit Service 5195f2
        TEST_LOOKBEHIND(%edx)
Packit Service 5195f2
#if defined(LZO_FAST)
Packit Service 5195f2
        movl    (%edx),%ecx
Packit Service 5195f2
        movl    %ecx,(%edi)
Packit Service 5195f2
#else
Packit Service 5195f2
        movb    (%edx),%al
Packit Service 5195f2
        movb    %al,(%edi)
Packit Service 5195f2
        movb    1(%edx),%al
Packit Service 5195f2
        movb    %al,1(%edi)
Packit Service 5195f2
        movb    2(%edx),%al
Packit Service 5195f2
        movb    %al,2(%edi)
Packit Service 5195f2
#endif
Packit Service 5195f2
        addl    N_3,%edi
Packit Service 5195f2
        jmp     .LMDONE
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
/***********************************************************************
Packit Service 5195f2
// M2
Packit Service 5195f2
************************************************************************/
Packit Service 5195f2
Packit Service 5195f2
        ALIGN3
Packit Service 5195f2
.LMATCH:
Packit Service 5195f2
        cmpb    $64,%al
Packit Service 5195f2
        jb      .LM3MATCH
Packit Service 5195f2
Packit Service 5195f2
/* a M2 match */
Packit Service 5195f2
        movl    %eax,%ecx
Packit Service 5195f2
        shrl    $2,%eax
Packit Service 5195f2
        leal    -1(%edi),%edx
Packit Service 5195f2
#if defined(LZO1X)
Packit Service 5195f2
        andl    $7,%eax
Packit Service 5195f2
        movb    (%esi),%bl
Packit Service 5195f2
        shrl    $5,%ecx
Packit Service 5195f2
        leal    (%eax,%ebx,8),%eax
Packit Service 5195f2
#elif defined(LZO1Y)
Packit Service 5195f2
        andl    N_3,%eax
Packit Service 5195f2
        movb    (%esi),%bl
Packit Service 5195f2
        shrl    $4,%ecx
Packit Service 5195f2
        leal    (%eax,%ebx,4),%eax
Packit Service 5195f2
#endif
Packit Service 5195f2
        incl    %esi
Packit Service 5195f2
        subl    %eax,%edx
Packit Service 5195f2
Packit Service 5195f2
#if defined(LZO_FAST)
Packit Service 5195f2
#if defined(LZO1X)
Packit Service 5195f2
        addl    $1+3,%ecx
Packit Service 5195f2
#elif defined(LZO1Y)
Packit Service 5195f2
        addl    $2,%ecx
Packit Service 5195f2
#endif
Packit Service 5195f2
#else
Packit Service 5195f2
#if defined(LZO1X)
Packit Service 5195f2
        incl    %ecx
Packit Service 5195f2
#elif defined(LZO1Y)
Packit Service 5195f2
        decl    %ecx
Packit Service 5195f2
#endif
Packit Service 5195f2
#endif
Packit Service 5195f2
Packit Service 5195f2
        cmpl    N_3,%eax
Packit Service 5195f2
        jae     .LCOPYLONG
Packit Service 5195f2
        jmp     .LCOPYBYTE
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
/***********************************************************************
Packit Service 5195f2
// M3
Packit Service 5195f2
************************************************************************/
Packit Service 5195f2
Packit Service 5195f2
0:      addl    N_255,%eax
Packit Service 5195f2
        TEST_IP(3(%esi),%edx)       /* minimum */
Packit Service 5195f2
1:      movb    (%esi),%bl
Packit Service 5195f2
        incl    %esi
Packit Service 5195f2
        orb     %bl,%bl
Packit Service 5195f2
        jz      0b
Packit Service 5195f2
        leal    33+NN(%eax,%ebx),%ecx
Packit Service 5195f2
        xorl    %eax,%eax
Packit Service 5195f2
        jmp     3f
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
        ALIGN3
Packit Service 5195f2
.LM3MATCH:
Packit Service 5195f2
        cmpb    $32,%al
Packit Service 5195f2
        jb      .LM4MATCH
Packit Service 5195f2
Packit Service 5195f2
/* a M3 match */
Packit Service 5195f2
        andl    $31,%eax
Packit Service 5195f2
        jz      1b
Packit Service 5195f2
        lea     2+NN(%eax),%ecx
Packit Service 5195f2
3:
Packit Service 5195f2
#ifdef LZO_DEBUG
Packit Service 5195f2
    andl $0xffff0000,%eax ; jnz .L_assert_fail
Packit Service 5195f2
#endif
Packit Service 5195f2
        movw    (%esi),%ax
Packit Service 5195f2
        leal    -1(%edi),%edx
Packit Service 5195f2
        shrl    $2,%eax
Packit Service 5195f2
        addl    $2,%esi
Packit Service 5195f2
        subl    %eax,%edx
Packit Service 5195f2
Packit Service 5195f2
        cmpl    N_3,%eax
Packit Service 5195f2
        jb      .LCOPYBYTE
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
/***********************************************************************
Packit Service 5195f2
// copy match
Packit Service 5195f2
************************************************************************/
Packit Service 5195f2
Packit Service 5195f2
        ALIGN1
Packit Service 5195f2
.LCOPYLONG:                      /* copy match using longwords */
Packit Service 5195f2
        TEST_LOOKBEHIND(%edx)
Packit Service 5195f2
#if defined(LZO_FAST)
Packit Service 5195f2
        leal    -3(%edi,%ecx),%eax
Packit Service 5195f2
        shrl    $2,%ecx
Packit Service 5195f2
        TEST_OP_R(%eax)
Packit Service 5195f2
        COPYL(%edx,%edi,%ebx)
Packit Service 5195f2
        movl    %eax,%edi
Packit Service 5195f2
        xorl    %ebx,%ebx
Packit Service 5195f2
#else
Packit Service 5195f2
        TEST_OP((%edi,%ecx),%eax)
Packit Service 5195f2
        movl    %ecx,%ebx
Packit Service 5195f2
        shrl    $2,%ebx
Packit Service 5195f2
        jz      2f
Packit Service 5195f2
        COPYL_C(%edx,%edi,%eax,%ebx)
Packit Service 5195f2
        andl    N_3,%ecx
Packit Service 5195f2
        jz      1f
Packit Service 5195f2
2:      COPYB_C(%edx,%edi,%al,%ecx)
Packit Service 5195f2
1:
Packit Service 5195f2
#endif
Packit Service 5195f2
Packit Service 5195f2
.LMDONE:
Packit Service 5195f2
        movb    -2(%esi),%al
Packit Service 5195f2
        andl    N_3,%eax
Packit Service 5195f2
        jz      .L00
Packit Service 5195f2
.LFLR3:
Packit Service 5195f2
        TEST_OP((%edi,%eax),%edx)
Packit Service 5195f2
        TEST_IP((%esi,%eax),%edx)
Packit Service 5195f2
#if defined(LZO_FAST)
Packit Service 5195f2
        movl    (%esi),%edx
Packit Service 5195f2
        addl    %eax,%esi
Packit Service 5195f2
        movl    %edx,(%edi)
Packit Service 5195f2
        addl    %eax,%edi
Packit Service 5195f2
#else
Packit Service 5195f2
        COPYB_C(%esi,%edi,%cl,%eax)
Packit Service 5195f2
#endif
Packit Service 5195f2
Packit Service 5195f2
#ifdef LZO_DEBUG
Packit Service 5195f2
    andl $0xffffff00,%eax ; jnz .L_assert_fail
Packit Service 5195f2
    andl $0xffffff00,%ebx ; jnz .L_assert_fail
Packit Service 5195f2
    xorl %eax,%eax ; xorl %ebx,%ebx
Packit Service 5195f2
    xorl %ecx,%ecx ; xorl %edx,%edx
Packit Service 5195f2
#endif
Packit Service 5195f2
        LODSB
Packit Service 5195f2
        jmp     .LMATCH
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
        ALIGN3
Packit Service 5195f2
.LCOPYBYTE:                      /* copy match using bytes */
Packit Service 5195f2
        TEST_LOOKBEHIND(%edx)
Packit Service 5195f2
        TEST_OP(-NN(%edi,%ecx),%eax)
Packit Service 5195f2
        xchgl   %edx,%esi
Packit Service 5195f2
#if defined(LZO_FAST)
Packit Service 5195f2
        subl    N_3,%ecx
Packit Service 5195f2
#endif
Packit Service 5195f2
        rep
Packit Service 5195f2
        movsb
Packit Service 5195f2
        movl    %edx,%esi
Packit Service 5195f2
        jmp     .LMDONE
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
/***********************************************************************
Packit Service 5195f2
// M4
Packit Service 5195f2
************************************************************************/
Packit Service 5195f2
Packit Service 5195f2
0:      addl    N_255,%ecx
Packit Service 5195f2
        TEST_IP(3(%esi),%edx)       /* minimum */
Packit Service 5195f2
1:      movb    (%esi),%bl
Packit Service 5195f2
        incl    %esi
Packit Service 5195f2
        orb     %bl,%bl
Packit Service 5195f2
        jz      0b
Packit Service 5195f2
        leal    9+NN(%ebx,%ecx),%ecx
Packit Service 5195f2
        jmp     3f
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
        ALIGN3
Packit Service 5195f2
.LM4MATCH:
Packit Service 5195f2
        cmpb    $16,%al
Packit Service 5195f2
        jb      .LM1MATCH
Packit Service 5195f2
Packit Service 5195f2
/* a M4 match */
Packit Service 5195f2
        movl    %eax,%ecx
Packit Service 5195f2
        andl    $8,%eax
Packit Service 5195f2
        shll    $13,%eax        /* save in bit 16 */
Packit Service 5195f2
        andl    $7,%ecx
Packit Service 5195f2
        jz      1b
Packit Service 5195f2
        addl    $2+NN,%ecx
Packit Service 5195f2
3:
Packit Service 5195f2
#ifdef LZO_DEBUG
Packit Service 5195f2
    movl %eax,%edx ; andl $0xfffe0000,%edx ; jnz .L_assert_fail
Packit Service 5195f2
#endif
Packit Service 5195f2
        movw    (%esi),%ax
Packit Service 5195f2
        addl    $2,%esi
Packit Service 5195f2
        leal    -0x4000(%edi),%edx
Packit Service 5195f2
        shrl    $2,%eax
Packit Service 5195f2
        jz      .LEOF
Packit Service 5195f2
        subl    %eax,%edx
Packit Service 5195f2
        jmp     .LCOPYLONG
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
/***********************************************************************
Packit Service 5195f2
// M1
Packit Service 5195f2
************************************************************************/
Packit Service 5195f2
Packit Service 5195f2
        ALIGN3
Packit Service 5195f2
.LM1MATCH:
Packit Service 5195f2
/* a M1 match */
Packit Service 5195f2
        TEST_OP(2(%edi),%edx)
Packit Service 5195f2
        shrl    $2,%eax
Packit Service 5195f2
        movb    (%esi),%bl
Packit Service 5195f2
        leal    -1(%edi),%edx
Packit Service 5195f2
        leal    (%eax,%ebx,4),%eax
Packit Service 5195f2
        incl    %esi
Packit Service 5195f2
        subl    %eax,%edx
Packit Service 5195f2
        TEST_LOOKBEHIND(%edx)
Packit Service 5195f2
Packit Service 5195f2
        movb    (%edx),%al      /* we must use this because edx can be edi-1 */
Packit Service 5195f2
        movb    %al,(%edi)
Packit Service 5195f2
        movb    1(%edx),%bl
Packit Service 5195f2
        movb    %bl,1(%edi)
Packit Service 5195f2
        addl    $2,%edi
Packit Service 5195f2
        jmp     .LMDONE
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
/***********************************************************************
Packit Service 5195f2
//
Packit Service 5195f2
************************************************************************/
Packit Service 5195f2
Packit Service 5195f2
.LEOF:
Packit Service 5195f2
/****   xorl    %eax,%eax          eax=0 from above */
Packit Service 5195f2
Packit Service 5195f2
        cmpl    $3+NN,%ecx      /* ecx must be 3/6 */
Packit Service 5195f2
        setnz   %al
Packit Service 5195f2
Packit Service 5195f2
Packit Service 5195f2
/*
Packit Service 5195f2
vi:ts=4
Packit Service 5195f2
*/
Packit Service 5195f2