kusano 7d535a
/* lzo1c_d.ash -- assembler implementation of the LZO1C decompression algorithm
kusano 7d535a
kusano 7d535a
   This file is part of the LZO real-time data compression library.
kusano 7d535a
kusano 7d535a
   Copyright (C) 2008 Markus Franz Xaver Johannes Oberhumer
kusano 7d535a
   Copyright (C) 2007 Markus Franz Xaver Johannes Oberhumer
kusano 7d535a
   Copyright (C) 2006 Markus Franz Xaver Johannes Oberhumer
kusano 7d535a
   Copyright (C) 2005 Markus Franz Xaver Johannes Oberhumer
kusano 7d535a
   Copyright (C) 2004 Markus Franz Xaver Johannes Oberhumer
kusano 7d535a
   Copyright (C) 2003 Markus Franz Xaver Johannes Oberhumer
kusano 7d535a
   Copyright (C) 2002 Markus Franz Xaver Johannes Oberhumer
kusano 7d535a
   Copyright (C) 2001 Markus Franz Xaver Johannes Oberhumer
kusano 7d535a
   Copyright (C) 2000 Markus Franz Xaver Johannes Oberhumer
kusano 7d535a
   Copyright (C) 1999 Markus Franz Xaver Johannes Oberhumer
kusano 7d535a
   Copyright (C) 1998 Markus Franz Xaver Johannes Oberhumer
kusano 7d535a
   Copyright (C) 1997 Markus Franz Xaver Johannes Oberhumer
kusano 7d535a
   Copyright (C) 1996 Markus Franz Xaver Johannes Oberhumer
kusano 7d535a
   All Rights Reserved.
kusano 7d535a
kusano 7d535a
   The LZO library is free software; you can redistribute it and/or
kusano 7d535a
   modify it under the terms of the GNU General Public License as
kusano 7d535a
   published by the Free Software Foundation; either version 2 of
kusano 7d535a
   the License, or (at your option) any later version.
kusano 7d535a
kusano 7d535a
   The LZO library is distributed in the hope that it will be useful,
kusano 7d535a
   but WITHOUT ANY WARRANTY; without even the implied warranty of
kusano 7d535a
   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
kusano 7d535a
   GNU General Public License for more details.
kusano 7d535a
kusano 7d535a
   You should have received a copy of the GNU General Public License
kusano 7d535a
   along with the LZO library; see the file COPYING.
kusano 7d535a
   If not, write to the Free Software Foundation, Inc.,
kusano 7d535a
   51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
kusano 7d535a
kusano 7d535a
   Markus F.X.J. Oberhumer
kusano 7d535a
   <markus@oberhumer.com></markus@oberhumer.com>
kusano 7d535a
   http://www.oberhumer.com/opensource/lzo/
kusano 7d535a
 */
kusano 7d535a
kusano 7d535a
kusano 7d535a
/***********************************************************************
kusano 7d535a
//
kusano 7d535a
************************************************************************/
kusano 7d535a
kusano 7d535a
        ALIGN3
kusano 7d535a
.L1:
kusano 7d535a
        xorl    %eax,%eax
kusano 7d535a
        movb    (%esi),%al
kusano 7d535a
        incl    %esi
kusano 7d535a
        cmpb    $32,%al
kusano 7d535a
        jnb     .LMATCH
kusano 7d535a
kusano 7d535a
        orb     %al,%al
kusano 7d535a
        jz      .L12
kusano 7d535a
        movl    %eax,%ecx
kusano 7d535a
.LIT:
kusano 7d535a
        TEST_OP((%edi,%ecx),%ebx)
kusano 7d535a
        TEST_IP((%esi,%ecx),%ebx)
kusano 7d535a
        rep
kusano 7d535a
        movsb
kusano 7d535a
.LM1:
kusano 7d535a
        movb    (%esi),%al
kusano 7d535a
        incl    %esi
kusano 7d535a
kusano 7d535a
        cmpb    $32,%al
kusano 7d535a
        jb      .LM2
kusano 7d535a
.LMATCH:
kusano 7d535a
        cmpb    $64,%al
kusano 7d535a
        jb      .LN3
kusano 7d535a
kusano 7d535a
        movl    %eax,%ecx
kusano 7d535a
        andb    $31,%al
kusano 7d535a
        leal    -1(%edi),%edx
kusano 7d535a
        shrl    $5,%ecx
kusano 7d535a
        subl    %eax,%edx
kusano 7d535a
        movb    (%esi),%al
kusano 7d535a
        incl    %esi
kusano 7d535a
kusano 7d535a
        shll    $5,%eax
kusano 7d535a
        subl    %eax,%edx
kusano 7d535a
        incl    %ecx
kusano 7d535a
        xchgl   %esi,%edx
kusano 7d535a
        TEST_LOOKBEHIND(%esi)
kusano 7d535a
        TEST_OP((%edi,%ecx),%ebx)
kusano 7d535a
        rep
kusano 7d535a
        movsb
kusano 7d535a
        movl    %edx,%esi
kusano 7d535a
        jmp     .L1
kusano 7d535a
kusano 7d535a
        ALIGN3
kusano 7d535a
.L12:
kusano 7d535a
        LODSB
kusano 7d535a
        leal    32(%eax),%ecx
kusano 7d535a
        cmpb    $248,%al
kusano 7d535a
        jb      .LIT
kusano 7d535a
kusano 7d535a
        movl    $280,%ecx
kusano 7d535a
        subb    $248,%al
kusano 7d535a
        jz      .L11
kusano 7d535a
        xchgl   %eax,%ecx
kusano 7d535a
        xorb    %al,%al
kusano 7d535a
        shll    %cl,%eax
kusano 7d535a
        xchgl   %eax,%ecx
kusano 7d535a
.L11:
kusano 7d535a
        TEST_OP((%edi,%ecx),%ebx)
kusano 7d535a
        TEST_IP((%esi,%ecx),%ebx)
kusano 7d535a
        rep
kusano 7d535a
        movsb
kusano 7d535a
        jmp     .L1
kusano 7d535a
kusano 7d535a
        ALIGN3
kusano 7d535a
.LM2:
kusano 7d535a
        leal    -1(%edi),%edx
kusano 7d535a
        subl    %eax,%edx
kusano 7d535a
        LODSB
kusano 7d535a
        shll    $5,%eax
kusano 7d535a
        subl    %eax,%edx
kusano 7d535a
        xchgl   %esi,%edx
kusano 7d535a
        TEST_LOOKBEHIND(%esi)
kusano 7d535a
        TEST_OP(4(%edi),%ebx)
kusano 7d535a
        movsb
kusano 7d535a
        movsb
kusano 7d535a
        movsb
kusano 7d535a
        movl    %edx,%esi
kusano 7d535a
        movsb
kusano 7d535a
        xorl    %eax,%eax
kusano 7d535a
        jmp     .LM1
kusano 7d535a
.LN3:
kusano 7d535a
        andb    $31,%al
kusano 7d535a
        movl    %eax,%ecx
kusano 7d535a
        jnz     .LN6
kusano 7d535a
        movb    $31,%cl
kusano 7d535a
.LN4:
kusano 7d535a
        LODSB
kusano 7d535a
        orb     %al,%al
kusano 7d535a
        jnz     .LN5
kusano 7d535a
        addl    N_255,%ecx
kusano 7d535a
        jmp     .LN4
kusano 7d535a
kusano 7d535a
        ALIGN3
kusano 7d535a
.LN5:
kusano 7d535a
        addl    %eax,%ecx
kusano 7d535a
.LN6:
kusano 7d535a
        movb    (%esi),%al
kusano 7d535a
        incl    %esi
kusano 7d535a
kusano 7d535a
        movl    %eax,%ebx
kusano 7d535a
        andb    $63,%al
kusano 7d535a
        movl    %edi,%edx
kusano 7d535a
        subl    %eax,%edx
kusano 7d535a
kusano 7d535a
        movb    (%esi),%al
kusano 7d535a
        incl    %esi
kusano 7d535a
kusano 7d535a
        shll    $6,%eax
kusano 7d535a
        subl    %eax,%edx
kusano 7d535a
        cmpl    %edi,%edx
kusano 7d535a
        jz      .LEOF
kusano 7d535a
kusano 7d535a
        xchgl   %edx,%esi
kusano 7d535a
        leal    3(%ecx),%ecx
kusano 7d535a
        TEST_LOOKBEHIND(%esi)
kusano 7d535a
        TEST_OP((%edi,%ecx),%eax)
kusano 7d535a
        rep
kusano 7d535a
        movsb
kusano 7d535a
kusano 7d535a
        movl    %edx,%esi
kusano 7d535a
        xorl    %eax,%eax
kusano 7d535a
        shrl    $6,%ebx
kusano 7d535a
        movl    %ebx,%ecx
kusano 7d535a
        jnz     .LIT
kusano 7d535a
        jmp     .L1
kusano 7d535a
kusano 7d535a
.LEOF:
kusano 7d535a
/****   xorl    %eax,%eax          eax=0 from above */
kusano 7d535a
kusano 7d535a
        cmpl    $1,%ecx         /* ecx must be 1 */
kusano 7d535a
        setnz   %al
kusano 7d535a
kusano 7d535a
kusano 7d535a
/*
kusano 7d535a
vi:ts=4
kusano 7d535a
*/
kusano 7d535a