/* lzo1c_d.ash -- assembler implementation of the LZO1C decompression algorithm This file is part of the LZO real-time data compression library. Copyright (C) 1996-2014 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 http://www.oberhumer.com/opensource/lzo/ */ /*********************************************************************** // ************************************************************************/ ALIGN3 .L1: xorl %eax,%eax movb (%esi),%al incl %esi cmpb $32,%al jnb .LMATCH orb %al,%al jz .L12 movl %eax,%ecx .LIT: TEST_OP((%edi,%ecx),%ebx) TEST_IP((%esi,%ecx),%ebx) rep movsb .LM1: movb (%esi),%al incl %esi cmpb $32,%al jb .LM2 .LMATCH: cmpb $64,%al jb .LN3 movl %eax,%ecx andb $31,%al leal -1(%edi),%edx shrl $5,%ecx subl %eax,%edx movb (%esi),%al incl %esi shll $5,%eax subl %eax,%edx incl %ecx xchgl %esi,%edx TEST_LOOKBEHIND(%esi) TEST_OP((%edi,%ecx),%ebx) rep movsb movl %edx,%esi jmp .L1 ALIGN3 .L12: LODSB leal 32(%eax),%ecx cmpb $248,%al jb .LIT movl $280,%ecx subb $248,%al jz .L11 xchgl %eax,%ecx xorb %al,%al shll %cl,%eax xchgl %eax,%ecx .L11: TEST_OP((%edi,%ecx),%ebx) TEST_IP((%esi,%ecx),%ebx) rep movsb jmp .L1 ALIGN3 .LM2: leal -1(%edi),%edx subl %eax,%edx LODSB shll $5,%eax subl %eax,%edx xchgl %esi,%edx TEST_LOOKBEHIND(%esi) TEST_OP(4(%edi),%ebx) movsb movsb movsb movl %edx,%esi movsb xorl %eax,%eax jmp .LM1 .LN3: andb $31,%al movl %eax,%ecx jnz .LN6 movb $31,%cl .LN4: LODSB orb %al,%al jnz .LN5 addl N_255,%ecx jmp .LN4 ALIGN3 .LN5: addl %eax,%ecx .LN6: movb (%esi),%al incl %esi movl %eax,%ebx andb $63,%al movl %edi,%edx subl %eax,%edx movb (%esi),%al incl %esi shll $6,%eax subl %eax,%edx cmpl %edi,%edx jz .LEOF xchgl %edx,%esi leal 3(%ecx),%ecx TEST_LOOKBEHIND(%esi) TEST_OP((%edi,%ecx),%eax) rep movsb movl %edx,%esi xorl %eax,%eax shrl $6,%ebx movl %ebx,%ecx jnz .LIT jmp .L1 .LEOF: /**** xorl %eax,%eax eax=0 from above */ cmpl $1,%ecx /* ecx must be 1 */ setnz %al /* vi:ts=4 */