aboutsummaryrefslogtreecommitdiffstats
path: root/package/compcache/patches/001-lzo-speed.patch
diff options
context:
space:
mode:
authorFlorian Fainelli <florian@openwrt.org>2009-07-25 23:05:51 +0000
committerFlorian Fainelli <florian@openwrt.org>2009-07-25 23:05:51 +0000
commit397938cc0f71b7b2919517a186778505310b5cac (patch)
treea93ef39dd5eed95736f684498d352c1a620391f7 /package/compcache/patches/001-lzo-speed.patch
parentf8f734eecef6c9827319ebceca5a1fcbfb800a55 (diff)
downloadupstream-397938cc0f71b7b2919517a186778505310b5cac.tar.gz
upstream-397938cc0f71b7b2919517a186778505310b5cac.tar.bz2
upstream-397938cc0f71b7b2919517a186778505310b5cac.zip
add compcache (#4481)
SVN-Revision: 16988
Diffstat (limited to 'package/compcache/patches/001-lzo-speed.patch')
-rw-r--r--package/compcache/patches/001-lzo-speed.patch185
1 files changed, 185 insertions, 0 deletions
diff --git a/package/compcache/patches/001-lzo-speed.patch b/package/compcache/patches/001-lzo-speed.patch
new file mode 100644
index 0000000000..df27b9bb6a
--- /dev/null
+++ b/package/compcache/patches/001-lzo-speed.patch
@@ -0,0 +1,185 @@
+diff -uNr compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_compress.c compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_compress.c
+--- compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_compress.c 2008-08-13 06:33:34.000000000 +0200
++++ compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_compress.c 2009-01-21 08:00:35.000000000 +0100
+@@ -62,8 +62,12 @@
+ goto literal;
+
+ try_match:
++#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
+ if (get_unaligned((const unsigned short *)m_pos)
+ == get_unaligned((const unsigned short *)ip)) {
++#else
++ if (m_pos[0] == ip[0] && m_pos[1] == ip[1]) {
++#endif
+ if (likely(m_pos[2] == ip[2]))
+ goto match;
+ }
+@@ -94,9 +98,14 @@
+ }
+ *op++ = tt;
+ }
+- do {
+- *op++ = *ii++;
+- } while (--t > 0);
++ if (t >= 2 * 4) {
++ memcpy(op, ii, t);
++ op += t;
++ ii += t;
++ } else
++ do {
++ *op++ = *ii++;
++ } while (--t > 0);
+ }
+
+ ip += 3;
+@@ -208,9 +217,14 @@
+
+ *op++ = tt;
+ }
+- do {
+- *op++ = *ii++;
+- } while (--t > 0);
++ if (t >= 2 * 4) {
++ memcpy(op, ii, t);
++ op += t;
++ ii += t;
++ } else
++ do {
++ *op++ = *ii++;
++ } while (--t > 0);
+ }
+
+ *op++ = M4_MARKER | 1;
+@@ -224,4 +238,3 @@
+
+ MODULE_LICENSE("GPL");
+ MODULE_DESCRIPTION("LZO1X-1 Compressor");
+-
+diff -uNr compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_decompress.c compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_decompress.c
+--- compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_decompress.c 2008-08-13 06:33:42.000000000 +0200
++++ compcache-0.5/sub-projects/compression/lzo-kmod/lzo1x_decompress.c 2009-01-21 07:49:41.000000000 +0100
+@@ -45,10 +45,7 @@
+ goto output_overrun;
+ if (HAVE_IP(t + 1, ip_end, ip))
+ goto input_overrun;
+- do {
+- *op++ = *ip++;
+- } while (--t > 0);
+- goto first_literal_run;
++ goto prep_first_literal_run;
+ }
+
+ while ((ip < ip_end)) {
+@@ -71,23 +68,20 @@
+ if (HAVE_IP(t + 4, ip_end, ip))
+ goto input_overrun;
+
+- COPY4(op, ip);
+- op += 4;
+- ip += 4;
+- if (--t > 0) {
+- if (t >= 4) {
+- do {
+- COPY4(op, ip);
+- op += 4;
+- ip += 4;
+- t -= 4;
+- } while (t >= 4);
+- if (t > 0) {
+- do {
+- *op++ = *ip++;
+- } while (--t > 0);
+- }
+- } else {
++ t += (4 - 1);
++ if (t >= 2 * 4) {
++ memcpy(op, ip, t);
++ op += t;
++ ip += t;
++ } else {
++ do {
++ COPY4(op, ip);
++ op += 4;
++ ip += 4;
++ t -= 4;
++ } while (t >= 4);
++ if (t > 0) {
++prep_first_literal_run:
+ do {
+ *op++ = *ip++;
+ } while (--t > 0);
+@@ -139,8 +133,7 @@
+ t += 31 + *ip++;
+ }
+ m_pos = op - 1;
+- m_pos -= le16_to_cpu(get_unaligned(
+- (const unsigned short *)ip)) >> 2;
++ m_pos -= get_unaligned_le16(ip) >> 2;
+ ip += 2;
+ } else if (t >= 16) {
+ m_pos = op;
+@@ -158,8 +151,7 @@
+ }
+ t += 7 + *ip++;
+ }
+- m_pos -= le16_to_cpu(get_unaligned(
+- (const unsigned short *)ip)) >> 2;
++ m_pos -= get_unaligned_le16(ip) >> 2;
+ ip += 2;
+ if (m_pos == op)
+ goto eof_found;
+@@ -184,21 +176,33 @@
+ if (HAVE_OP(t + 3 - 1, op_end, op))
+ goto output_overrun;
+
+- if (t >= 2 * 4 - (3 - 1) && (op - m_pos) >= 4) {
+- COPY4(op, m_pos);
+- op += 4;
+- m_pos += 4;
+- t -= 4 - (3 - 1);
+- do {
++ if (t >= 2 * 4 - (3 - 1)) {
++ /*
++ * Assume memcpy don't copy
++ * more than 32 bytes at once
++ */
++ if ((op - m_pos) >= 32) {
++ t += (3 - 1);
++ memcpy(op, m_pos, t);
++ op += t;
++ m_pos += t;
++ } else if ((op - m_pos) >= 4) {
+ COPY4(op, m_pos);
+ op += 4;
+ m_pos += 4;
+- t -= 4;
+- } while (t >= 4);
+- if (t > 0)
++ t -= 4 - (3 - 1);
+ do {
+- *op++ = *m_pos++;
+- } while (--t > 0);
++ COPY4(op, m_pos);
++ op += 4;
++ m_pos += 4;
++ t -= 4;
++ } while (t >= 4);
++ if (t > 0)
++ do {
++ *op++ = *m_pos++;
++ } while (--t > 0);
++ } else
++ goto copy_match;
+ } else {
+ copy_match:
+ *op++ = *m_pos++;
+@@ -247,9 +251,7 @@
+ *out_len = op - out;
+ return LZO_E_LOOKBEHIND_OVERRUN;
+ }
+-
+ EXPORT_SYMBOL_GPL(lzo1x_decompress_safe);
+
+ MODULE_LICENSE("GPL");
+ MODULE_DESCRIPTION("LZO1X Decompressor");
+-