lzo: update to 2.09
[tomato.git] / release / src / router / lzo / asm / i386 / src / lzo1f_d.ash
blobedbe0a6aad2ba2c83059b19d4d8bb26616ed2bc8
1 /* lzo1f_d.ash -- assembler implementation of the LZO1F decompression algorithm
3    This file is part of the LZO real-time data compression library.
5    Copyright (C) 1996-2015 Markus Franz Xaver Johannes Oberhumer
6    All Rights Reserved.
8    The LZO library is free software; you can redistribute it and/or
9    modify it under the terms of the GNU General Public License as
10    published by the Free Software Foundation; either version 2 of
11    the License, or (at your option) any later version.
13    The LZO library is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
18    You should have received a copy of the GNU General Public License
19    along with the LZO library; see the file COPYING.
20    If not, write to the Free Software Foundation, Inc.,
21    51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
23    Markus F.X.J. Oberhumer
24    <markus@oberhumer.com>
25    http://www.oberhumer.com/opensource/lzo/
26  */
29 /***********************************************************************
31 ************************************************************************/
33         ALIGN3
34 .L0:
35         xorl    %eax,%eax
36         movb    (%esi),%al
37         incl    %esi
38         cmpb    $31,%al
39         ja      .LM2
41         orb     %al,%al
42         movl    %eax,%ecx
43         jnz     .L2
45         LODSB
46         orb     %al,%al
47         jnz     2f
48         addl    N_255,%ecx
49         jmp     1b
51         lea     31(%eax,%ecx),%ecx
52 .L2:
53         TEST_OP((%edi,%ecx),%ebx)
54         TEST_IP((%esi,%ecx),%ebx)
55         movb    %cl,%al
56         shrl    $2,%ecx
57         rep
58         movsl
59         andb    $3,%al
60         jz      1f
61         movl    (%esi),%ebx
62         addl    %eax,%esi
63         movl    %ebx,(%edi)
64         addl    %eax,%edi
66         movb    (%esi),%al
67         incl    %esi
68 .LM1:
69         cmpb    $31,%al
70         jbe     .LM21
72 .LM2:
73         cmpb    $223,%al
74         ja      .LM3
76         movl    %eax,%ecx
77         shrl    $2,%eax
78         lea     -1(%edi),%edx
79         andb    $7,%al
80         shrl    $5,%ecx
81         movl    %eax,%ebx
83         movb    (%esi),%al
84         leal    (%ebx,%eax,8),%eax
85         incl    %esi
86 .LM5:
87         subl    %eax,%edx
88         addl    $2,%ecx
89         xchgl   %edx,%esi
90         TEST_LOOKBEHIND(%esi)
91         TEST_OP((%edi,%ecx),%ebx)
92         cmpl    $6,%ecx
93         jb      1f
94         cmpl    $4,%eax
95         jb      1f
96         movb    %cl,%al
97         shrl    $2,%ecx
98         rep
99         movsl
100         andb    $3,%al
101         movb    %al,%cl
103         rep
104         movsb
105         movl    %edx,%esi
106 .LN1:
107         movb    -2(%esi),%cl
108         andl    $3,%ecx
109         jz      .L0
110         movl    (%esi),%eax
111         addl    %ecx,%esi
112         movl    %eax,(%edi)
113         addl    %ecx,%edi
114         xorl    %eax,%eax
115         movb    (%esi),%al
116         incl    %esi
117         jmp     .LM1
118 .LM21:
119         TEST_OP(3(%edi),%edx)
120         shrl    $2,%eax
121         leal    -0x801(%edi),%edx
122         movl    %eax,%ecx
123         movb    (%esi),%al
124         incl    %esi
125         leal    (%ecx,%eax,8),%eax
126         subl    %eax,%edx
127         TEST_LOOKBEHIND(%edx)
128         movl    (%edx),%eax
129         movl    %eax,(%edi)
130         addl    $3,%edi
131         jmp     .LN1
133         LODSB
134         orb     %al,%al
135         jnz     2f
136         addl    N_255,%ecx
137         jmp     1b
139         lea     31(%eax,%ecx),%ecx
140         jmp     .LM4
142         ALIGN3
143 .LM3:
144         andb    $31,%al
145         movl    %eax,%ecx
146         jz      1b
147 .LM4:
148         movl    %edi,%edx
149         movw    (%esi),%ax
150         addl    $2,%esi
151         shrl    $2,%eax
152         jnz     .LM5
154 .LEOF:
155 /****   xorl    %eax,%eax          eax=0 from above */
157         cmpl    $1,%ecx         /* ecx must be 1 */
158         setnz   %al
161 /* vim:set ts=4 sw=4 et: */