diff options
author | Sebastian Pop <s.pop@samsung.com> | 2019-03-01 09:45:33 -0600 |
---|---|---|
committer | Hans Kristian Rosbach <hk-github@circlestorm.org> | 2019-03-21 11:22:36 +0100 |
commit | 93dbe3caeee3626fe653a92fa5e2440105d57170 (patch) | |
tree | a34df71c07ad583fa322e8515daa39f1a6206708 /inffast.c | |
parent | 9ca9da69d34941a2996b8a8856c9993248afbb58 (diff) |
move INFFAST_CHUCKSIZE code to memcopy.h
Diffstat (limited to 'inffast.c')
-rw-r--r-- | inffast.c | 81 |
1 files changed, 0 insertions, 81 deletions
@@ -21,87 +21,6 @@ bits -= (unsigned)(n); \ } while (0) -#ifdef INFFAST_CHUNKSIZE -/* - Ask the compiler to perform a wide, unaligned load with an machine - instruction appropriate for the inffast_chunk_t type. - */ -static inline inffast_chunk_t loadchunk(unsigned char const* s) { - inffast_chunk_t c; - memcpy(&c, s, sizeof(c)); - return c; -} - -/* - Ask the compiler to perform a wide, unaligned store with an machine - instruction appropriate for the inffast_chunk_t type. - */ -static inline void storechunk(unsigned char* d, inffast_chunk_t c) { - memcpy(d, &c, sizeof(c)); -} - -/* - Behave like memcpy, but assume that it's OK to overwrite at least - INFFAST_CHUNKSIZE bytes of output even if the length is shorter than this, - that the length is non-zero, and that `from` lags `out` by at least - INFFAST_CHUNKSIZE bytes (or that they don't overlap at all or simply that - the distance is less than the length of the copy). - - Aside from better memory bus utilisation, this means that short copies - (INFFAST_CHUNKSIZE bytes or fewer) will fall straight through the loop - without iteration, which will hopefully make the branch prediction more - reliable. - */ -static inline unsigned char* chunkcopy(unsigned char *out, unsigned char const *from, unsigned len) { - --len; - storechunk(out, loadchunk(from)); - out += (len % INFFAST_CHUNKSIZE) + 1; - from += (len % INFFAST_CHUNKSIZE) + 1; - len /= INFFAST_CHUNKSIZE; - while (len-- > 0) { - storechunk(out, loadchunk(from)); - out += INFFAST_CHUNKSIZE; - from += INFFAST_CHUNKSIZE; - } - return out; -} - -/* - Behave like chunkcopy, but avoid writing beyond of legal output. - */ -static inline unsigned char* chunkcopysafe(unsigned char *out, unsigned char const *from, unsigned len, - unsigned char *safe) { - if (out > safe) { - while (len-- > 0) { - *out++ = *from++; - } - return out; - } - return chunkcopy(out, from, len); -} - -/* - Perform short copies until distance can be rewritten as being at least - INFFAST_CHUNKSIZE. - - This assumes that it's OK to overwrite at least the first - 2*INFFAST_CHUNKSIZE bytes of output even if the copy is shorter than this. - This assumption holds because inflate_fast() starts every iteration with at - least 258 bytes of output space available (258 being the maximum length - output from a single token; see inflate_fast()'s assumptions below). - */ -static inline unsigned char* chunkunroll(unsigned char *out, unsigned *dist, unsigned *len) { - unsigned char const *from = out - *dist; - while (*dist < *len && *dist < INFFAST_CHUNKSIZE) { - storechunk(out, loadchunk(from)); - out += *dist; - *len -= *dist; - *dist += *dist; - } - return out; -} -#endif - /* Decode literal, length, and distance codes and write out the resulting literal and match bytes until either not enough input or output is |