add compcache (#4481)
[oweals/openwrt.git] / package / compcache / patches / 001-lzo-speed.patch
1 diff -uNr compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_compress.c compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_compress.c
2 --- compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_compress.c    2008-08-13 06:33:34.000000000 +0200
3 +++ compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_compress.c    2009-01-21 08:00:35.000000000 +0100
4 @@ -62,8 +62,12 @@
5                 goto literal;
6  
7  try_match:
8 +#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
9                 if (get_unaligned((const unsigned short *)m_pos)
10                                 == get_unaligned((const unsigned short *)ip)) {
11 +#else
12 +               if (m_pos[0] == ip[0] && m_pos[1] == ip[1]) {
13 +#endif
14                         if (likely(m_pos[2] == ip[2]))
15                                         goto match;
16                 }
17 @@ -94,9 +98,14 @@
18                                 }
19                                 *op++ = tt;
20                         }
21 -                       do {
22 -                               *op++ = *ii++;
23 -                       } while (--t > 0);
24 +                       if (t >= 2 * 4) {
25 +                               memcpy(op, ii, t);
26 +                               op += t;
27 +                               ii += t;
28 +                       } else
29 +                               do {
30 +                                       *op++ = *ii++;
31 +                               } while (--t > 0);
32                 }
33  
34                 ip += 3;
35 @@ -208,9 +217,14 @@
36  
37                         *op++ = tt;
38                 }
39 -               do {
40 -                       *op++ = *ii++;
41 -               } while (--t > 0);
42 +               if (t >= 2 * 4) {
43 +                       memcpy(op, ii, t);
44 +                       op += t;
45 +                       ii += t;
46 +               } else
47 +                       do {
48 +                               *op++ = *ii++;
49 +                       } while (--t > 0);
50         }
51  
52         *op++ = M4_MARKER | 1;
53 @@ -224,4 +238,3 @@
54  
55  MODULE_LICENSE("GPL");
56  MODULE_DESCRIPTION("LZO1X-1 Compressor");
57 -
58 diff -uNr compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_decompress.c compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_decompress.c
59 --- compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_decompress.c  2008-08-13 06:33:42.000000000 +0200
60 +++ compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_decompress.c  2009-01-21 07:49:41.000000000 +0100
61 @@ -45,10 +45,7 @@
62                         goto output_overrun;
63                 if (HAVE_IP(t + 1, ip_end, ip))
64                         goto input_overrun;
65 -               do {
66 -                       *op++ = *ip++;
67 -               } while (--t > 0);
68 -               goto first_literal_run;
69 +               goto prep_first_literal_run;
70         }
71  
72         while ((ip < ip_end)) {
73 @@ -71,23 +68,20 @@
74                 if (HAVE_IP(t + 4, ip_end, ip))
75                         goto input_overrun;
76  
77 -               COPY4(op, ip);
78 -               op += 4;
79 -               ip += 4;
80 -               if (--t > 0) {
81 -                       if (t >= 4) {
82 -                               do {
83 -                                       COPY4(op, ip);
84 -                                       op += 4;
85 -                                       ip += 4;
86 -                                       t -= 4;
87 -                               } while (t >= 4);
88 -                               if (t > 0) {
89 -                                       do {
90 -                                               *op++ = *ip++;
91 -                                       } while (--t > 0);
92 -                               }
93 -                       } else {
94 +               t += (4 - 1);
95 +               if (t >= 2 * 4) {
96 +                       memcpy(op, ip, t);
97 +                       op += t;
98 +                       ip += t;
99 +               } else {
100 +                       do {
101 +                               COPY4(op, ip);
102 +                               op += 4;
103 +                               ip += 4;
104 +                               t -= 4;
105 +                       } while (t >= 4);
106 +                       if (t > 0) {
107 +prep_first_literal_run:
108                                 do {
109                                         *op++ = *ip++;
110                                 } while (--t > 0);
111 @@ -139,8 +133,7 @@
112                                         t += 31 + *ip++;
113                                 }
114                                 m_pos = op - 1;
115 -                               m_pos -= le16_to_cpu(get_unaligned(
116 -                                       (const unsigned short *)ip)) >> 2;
117 +                               m_pos -= get_unaligned_le16(ip) >> 2;
118                                 ip += 2;
119                         } else if (t >= 16) {
120                                 m_pos = op;
121 @@ -158,8 +151,7 @@
122                                         }
123                                         t += 7 + *ip++;
124                                 }
125 -                               m_pos -= le16_to_cpu(get_unaligned(
126 -                                       (const unsigned short *)ip)) >> 2;
127 +                               m_pos -= get_unaligned_le16(ip) >> 2;
128                                 ip += 2;
129                                 if (m_pos == op)
130                                         goto eof_found;
131 @@ -184,21 +176,33 @@
132                         if (HAVE_OP(t + 3 - 1, op_end, op))
133                                 goto output_overrun;
134  
135 -                       if (t >= 2 * 4 - (3 - 1) && (op - m_pos) >= 4) {
136 -                               COPY4(op, m_pos);
137 -                               op += 4;
138 -                               m_pos += 4;
139 -                               t -= 4 - (3 - 1);
140 -                               do {
141 +                       if (t >= 2 * 4 - (3 - 1)) {
142 +                               /*
143 +                                *  Assume memcpy don't copy
144 +                                *  more than 32 bytes at once
145 +                                */
146 +                               if ((op - m_pos) >= 32) {
147 +                                       t += (3 - 1);
148 +                                       memcpy(op, m_pos, t);
149 +                                       op += t;
150 +                                       m_pos += t;
151 +                               } else if ((op - m_pos) >= 4) {
152                                         COPY4(op, m_pos);
153                                         op += 4;
154                                         m_pos += 4;
155 -                                       t -= 4;
156 -                               } while (t >= 4);
157 -                               if (t > 0)
158 +                                       t -= 4 - (3 - 1);
159                                         do {
160 -                                               *op++ = *m_pos++;
161 -                                       } while (--t > 0);
162 +                                               COPY4(op, m_pos);
163 +                                               op += 4;
164 +                                               m_pos += 4;
165 +                                               t -= 4;
166 +                                       } while (t >= 4);
167 +                                       if (t > 0)
168 +                                               do {
169 +                                                       *op++ = *m_pos++;
170 +                                               } while (--t > 0);
171 +                               } else
172 +                                       goto copy_match;
173                         } else {
174  copy_match:
175                                 *op++ = *m_pos++;
176 @@ -247,9 +251,7 @@
177         *out_len = op - out;
178         return LZO_E_LOOKBEHIND_OVERRUN;
179  }
180 -
181  EXPORT_SYMBOL_GPL(lzo1x_decompress_safe);
182  
183  MODULE_LICENSE("GPL");
184  MODULE_DESCRIPTION("LZO1X Decompressor");
185 -