… | |
… | |
70 | |
70 | |
71 | #define MAX_LIT (1 << 5) |
71 | #define MAX_LIT (1 << 5) |
72 | #define MAX_OFF (1 << 13) |
72 | #define MAX_OFF (1 << 13) |
73 | #define MAX_REF ((1 << 8) + (1 << 3)) |
73 | #define MAX_REF ((1 << 8) + (1 << 3)) |
74 | |
74 | |
|
|
75 | #if (__i386 || __amd64) && __GNUC__ >= 3 |
|
|
76 | # define lzf_movsb(dst, src, len) \ |
|
|
77 | asm ("rep movsb" \ |
|
|
78 | : "=D" (dst), "=S" (src), "=c" (len) \ |
|
|
79 | : "0" (dst), "1" (src), "2" (len)); |
|
|
80 | #endif |
|
|
81 | |
75 | /* |
82 | /* |
76 | * compressed format |
83 | * compressed format |
77 | * |
84 | * |
78 | * 000LLLLL <L+1> ; literal |
85 | * 000LLLLL <L+1> ; literal |
79 | * LLLooooo oooooooo ; backref L |
86 | * LLLooooo oooooooo ; backref L |
… | |
… | |
102 | unsigned int hval = FRST (ip); |
109 | unsigned int hval = FRST (ip); |
103 | unsigned long off; |
110 | unsigned long off; |
104 | int lit = 0; |
111 | int lit = 0; |
105 | |
112 | |
106 | #if INIT_HTAB |
113 | #if INIT_HTAB |
107 | # if USE_MEMCPY |
|
|
108 | memset (htab, 0, sizeof (htab)); |
114 | memset (htab, 0, sizeof (htab)); |
109 | # else |
115 | # if 0 |
110 | for (hslot = htab; hslot < htab + HSIZE; hslot++) |
116 | for (hslot = htab; hslot < htab + HSIZE; hslot++) |
111 | *hslot++ = ip; |
117 | *hslot++ = ip; |
112 | # endif |
118 | # endif |
113 | #endif |
119 | #endif |
114 | |
120 | |
115 | for (;;) |
121 | for (;;) |
116 | { |
122 | { |
… | |
… | |
212 | { |
218 | { |
213 | if (op + 1 + MAX_LIT >= out_end) |
219 | if (op + 1 + MAX_LIT >= out_end) |
214 | return 0; |
220 | return 0; |
215 | |
221 | |
216 | *op++ = MAX_LIT - 1; |
222 | *op++ = MAX_LIT - 1; |
217 | #if USE_MEMCPY |
223 | |
218 | memcpy (op, ip - MAX_LIT, MAX_LIT); |
224 | #ifdef lzf_movsb |
219 | op += MAX_LIT; |
225 | ip -= lit; |
220 | lit = 0; |
226 | lzf_movsb (op, ip, lit); |
221 | #else |
227 | #else |
222 | lit = -lit; |
228 | lit = -lit; |
223 | do |
229 | do |
224 | *op++ = ip[lit]; |
230 | *op++ = ip[lit]; |
225 | while (++lit); |
231 | while (++lit); |
… | |
… | |
231 | { |
237 | { |
232 | if (op + lit + 1 >= out_end) |
238 | if (op + lit + 1 >= out_end) |
233 | return 0; |
239 | return 0; |
234 | |
240 | |
235 | *op++ = lit - 1; |
241 | *op++ = lit - 1; |
|
|
242 | #ifdef lzf_movsb |
|
|
243 | ip -= lit; |
|
|
244 | lzf_movsb (op, ip, lit); |
|
|
245 | #else |
236 | lit = -lit; |
246 | lit = -lit; |
237 | do |
247 | do |
238 | *op++ = ip[lit]; |
248 | *op++ = ip[lit]; |
239 | while (++lit); |
249 | while (++lit); |
|
|
250 | #endif |
240 | } |
251 | } |
241 | |
252 | |
242 | return op - (u8 *) out_data; |
253 | return op - (u8 *) out_data; |
243 | } |
254 | } |
|
|
255 | |