001-lzo-speed.patch 4.1 KB

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