aboutsummaryrefslogtreecommitdiffstats
path: root/package/compcache/patches/001-lzo-speed.patch
diff options
context:
space:
mode:
Diffstat (limited to 'package/compcache/patches/001-lzo-speed.patch')
-rw-r--r--package/compcache/patches/001-lzo-speed.patch181
1 files changed, 181 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 000000000..130f79da6
--- /dev/null
+++ b/package/compcache/patches/001-lzo-speed.patch
@@ -0,0 +1,181 @@
+--- a/sub-projects/compression/lzo-kmod/lzo1x_compress.c
++++ b/sub-projects/compression/lzo-kmod/lzo1x_compress.c
+@@ -62,8 +62,12 @@ _lzo1x_1_do_compress(const unsigned char
+ 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 @@ match:
+ }
+ *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 @@ int lzo1x_1_compress(const unsigned char
+
+ *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 @@ EXPORT_SYMBOL_GPL(lzo1x_1_compress);
+
+ MODULE_LICENSE("GPL");
+ MODULE_DESCRIPTION("LZO1X-1 Compressor");
+-
+--- a/sub-projects/compression/lzo-kmod/lzo1x_decompress.c
++++ b/sub-projects/compression/lzo-kmod/lzo1x_decompress.c
+@@ -45,10 +45,7 @@ int lzo1x_decompress_safe(const unsigned
+ 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,30 +68,27 @@ int lzo1x_decompress_safe(const unsigned
+ 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);
+ }
+ }
+
+-first_literal_run:
++//first_literal_run:
+ t = *ip++;
+ if (t >= 16)
+ goto match;
+@@ -139,8 +133,7 @@ match:
+ 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 @@ match:
+ }
+ 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 @@ match:
+ 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++;