Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 187309
b: refs/heads/master
c: e69eae6
h: refs/heads/master
i:
  187307: ef12ffd
v: v3
  • Loading branch information
Joakim Tjernlund authored and Linus Torvalds committed Mar 12, 2010
1 parent bf035d9 commit e87b011
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 41 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: 5ceaa2f39bfa73c4398cd01e78f1c3ebde3d3383
refs/heads/master: e69eae65523b457a3ac4262a66cfff57f2c924a9
70 changes: 30 additions & 40 deletions trunk/lib/zlib_inflate/inffast.c
Original file line number Diff line number Diff line change
Expand Up @@ -8,21 +8,6 @@
#include "inflate.h"
#include "inffast.h"

/* Only do the unaligned "Faster" variant when
* CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is set
*
* On powerpc, it won't be as we don't include autoconf.h
* automatically for the boot wrapper, which is intended as
* we run in an environment where we may not be able to deal
* with (even rare) alignment faults. In addition, we do not
* define __KERNEL__ for arch/powerpc/boot unlike x86
*/

#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
#include <asm/unaligned.h>
#include <asm/byteorder.h>
#endif

#ifndef ASMINF

/* Allow machine dependent optimization for post-increment or pre-increment.
Expand All @@ -36,14 +21,31 @@
- Pentium III (Anderson)
- M68060 (Nikl)
*/
union uu {
unsigned short us;
unsigned char b[2];
};

/* Endian independed version */
static inline unsigned short
get_unaligned16(const unsigned short *p)
{
union uu mm;
unsigned char *b = (unsigned char *)p;

mm.b[0] = b[0];
mm.b[1] = b[1];
return mm.us;
}

#ifdef POSTINC
# define OFF 0
# define PUP(a) *(a)++
# define UP_UNALIGNED(a) get_unaligned((a)++)
# define UP_UNALIGNED(a) get_unaligned16((a)++)
#else
# define OFF 1
# define PUP(a) *++(a)
# define UP_UNALIGNED(a) get_unaligned(++(a))
# define UP_UNALIGNED(a) get_unaligned16(++(a))
#endif

/*
Expand Down Expand Up @@ -256,7 +258,6 @@ void inflate_fast(z_streamp strm, unsigned start)
}
}
else {
#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
unsigned short *sout;
unsigned long loops;

Expand All @@ -274,22 +275,25 @@ void inflate_fast(z_streamp strm, unsigned start)
sfrom = (unsigned short *)(from - OFF);
loops = len >> 1;
do
#ifdef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
PUP(sout) = PUP(sfrom);
#else
PUP(sout) = UP_UNALIGNED(sfrom);
#endif
while (--loops);
out = (unsigned char *)sout + OFF;
from = (unsigned char *)sfrom + OFF;
} else { /* dist == 1 or dist == 2 */
unsigned short pat16;

pat16 = *(sout-2+2*OFF);
if (dist == 1)
#if defined(__BIG_ENDIAN)
pat16 = (pat16 & 0xff) | ((pat16 & 0xff) << 8);
#elif defined(__LITTLE_ENDIAN)
pat16 = (pat16 & 0xff00) | ((pat16 & 0xff00) >> 8);
#else
#error __BIG_ENDIAN nor __LITTLE_ENDIAN is defined
#endif
if (dist == 1) {
union uu mm;
/* copy one char pattern to both bytes */
mm.us = pat16;
mm.b[0] = mm.b[1];
pat16 = mm.us;
}
loops = len >> 1;
do
PUP(sout) = pat16;
Expand All @@ -298,20 +302,6 @@ void inflate_fast(z_streamp strm, unsigned start)
}
if (len & 1)
PUP(out) = PUP(from);
#else /* CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS */
from = out - dist; /* copy direct from output */
do { /* minimum length is three */
PUP(out) = PUP(from);
PUP(out) = PUP(from);
PUP(out) = PUP(from);
len -= 3;
} while (len > 2);
if (len) {
PUP(out) = PUP(from);
if (len > 1)
PUP(out) = PUP(from);
}
#endif /* !CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS */
}
}
else if ((op & 64) == 0) { /* 2nd level distance code */
Expand Down

0 comments on commit e87b011

Please sign in to comment.