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