1;===========================================================================
2; Copyright (c) 1990-2006 Info-ZIP.  All rights reserved.
3;
4; See the accompanying file LICENSE, version 2000-Apr-09 or later
5; (the contents of which are also included in zip.h) for terms of use.
6; If, for some reason, all these files are missing, the Info-ZIP license
7; also may be found at:  ftp://ftp.info-zip.org/pub/infozip/license.html
8;===========================================================================
9; crc_lcc.asm, optimized CRC calculation function for Zip and UnZip,
10; created by Paul Kienitz and Christian Spieler.  Last revised 02 Jan 2006.
11;
12; The code in this file has been copied verbatim from crc_i386.{asm|S};
13; only the assembler syntax and metacommands have been adapted to
14; the habits of the free LCC-Win32 C compiler package.
15; This version of the code uses the "optimized for i686" variant of
16; crc_i386.{asm|S}.
17; IMPORTANT NOTE to the Info-ZIP editors:
18; The TAB characters in this source file are required by the parser of
19; the LCC-Win32 assembler program and MUST NOT be removed!!
20;
21; For more information (and a revision log), look into the original
22; source files.
23;
24	.text
25	.file "crc32.c"
26	.text
27	.type	_crc32,function
28_crc32:
29	pushl	%ebp
30	movl	%esp,%ebp
31	pushl	%ecx
32	pushl	%ebx
33	pushl	%esi
34	pushl	%edi
35	.line	34
36	.line	37
37	movl	12(%ebp),%esi
38	subl	%eax,%eax
39	testl	%esi,%esi
40	jz	_$3
41	.line	39
42	call	_get_crc_table
43	movl	%eax,%edi
44	.line	41
45	movl	8(%ebp),%eax
46	movl	16(%ebp),%ecx
47	notl	%eax
48	testl	%ecx,%ecx
49	jz	_$4
50_$5:
51	testl	$3,%esi
52	jz	_$6
53	xorb    (%esi),%al
54	incl	%esi
55	movzbl	%al,%ebx
56	shrl	$8,%eax
57	xorl	(%edi,%ebx,4),%eax
58	decl	%ecx
59	jnz	_$5
60_$6:
61	movl	%ecx,%edx
62	shrl	$4,%ecx
63	jz	_$8
64_$7:
65	xorl	(%esi),%eax
66	movzbl	%al,%ebx
67	shrl	$8,%eax
68	xorl	(%edi,%ebx,4),%eax
69	movzbl	%al,%ebx
70	shrl	$8,%eax
71	xorl	(%edi,%ebx,4),%eax
72	movzbl	%al,%ebx
73	shrl	$8,%eax
74	xorl	(%edi,%ebx,4),%eax
75	movzbl	%al,%ebx
76	shrl	$8,%eax
77	xorl	(%edi,%ebx,4),%eax
78	xorl	4(%esi),%eax
79	movzbl	%al,%ebx
80	shrl	$8,%eax
81	xorl	(%edi,%ebx,4),%eax
82	movzbl	%al,%ebx
83	shrl	$8,%eax
84	xorl	(%edi,%ebx,4),%eax
85	movzbl	%al,%ebx
86	shrl	$8,%eax
87	xorl	(%edi,%ebx,4),%eax
88	movzbl	%al,%ebx
89	shrl	$8,%eax
90	xorl	(%edi,%ebx,4),%eax
91	xorl	8(%esi),%eax
92	movzbl	%al,%ebx
93	shrl	$8,%eax
94	xorl	(%edi,%ebx,4),%eax
95	movzbl	%al,%ebx
96	shrl	$8,%eax
97	xorl	(%edi,%ebx,4),%eax
98	movzbl	%al,%ebx
99	shrl	$8,%eax
100	xorl	(%edi,%ebx,4),%eax
101	movzbl	%al,%ebx
102	shrl	$8,%eax
103	xorl	(%edi,%ebx,4),%eax
104	xorl	12(%esi),%eax
105	movzbl	%al,%ebx
106	shrl	$8,%eax
107	xorl	(%edi,%ebx,4),%eax
108	movzbl	%al,%ebx
109	shrl	$8,%eax
110	xorl	(%edi,%ebx,4),%eax
111	addl	$16,%esi
112	movzbl	%al,%ebx
113	shrl	$8,%eax
114	xorl	(%edi,%ebx,4),%eax
115	movzbl	%al,%ebx
116	shrl	$8,%eax
117	xorl	(%edi,%ebx,4),%eax
118	decl	%ecx
119	jnz	_$7
120_$8:
121	movl	%edx,%ecx
122	andl	$0x0f,%ecx
123        shrl	$2,%ecx
124	jz	_$10
125_$9:
126	xorl	(%esi),%eax
127	movzbl	%al,%ebx
128	shrl	$8,%eax
129	xorl	(%edi,%ebx,4),%eax
130	movzbl	%al,%ebx
131	shrl	$8,%eax
132	xorl	(%edi,%ebx,4),%eax
133	addl	$4,%esi
134	movzbl	%al,%ebx
135	shrl	$8,%eax
136	xorl	(%edi,%ebx,4),%eax
137	movzbl	%al,%ebx
138	shrl	$8,%eax
139	xorl	(%edi,%ebx,4),%eax
140	decl	%ecx
141	jnz	_$9
142_$10:
143	movl	%edx,%ecx
144	andl	$0x03,%ecx
145	jz	_$4
146_$11:
147	xorb    (%esi),%al
148	incl    %esi
149	movzbl	%al,%ebx
150	shrl	$8,%eax
151	xorl	(%edi,%ebx,4),%eax
152	decl	%ecx
153	jnz	_$11
154_$4:
155	xorl	$0xffffffff,%eax
156_$3:
157	.line	52
158	popl	%edi
159	popl	%esi
160	popl	%ebx
161	leave
162	ret
163_$34:
164	.size	_crc32,_$34-_crc32
165	.globl	_crc32
166	.extern	_get_crc_table
167