diff options
author | Nathan Moinvaziri <nathan@nathanm.com> | 2020-06-26 11:00:15 -0700 |
---|---|---|
committer | Hans Kristian Rosbach <hk-github@circlestorm.org> | 2020-06-28 11:16:05 +0200 |
commit | 2026830ceab48a364d0bc8d5d36f31fa745f1368 (patch) | |
tree | 69fabc068f7e1ee8148096b4c67ae5f337266b98 /chunkset.c | |
parent | 4e1db4f601ac55c06406e558eff16c35137e2b0e (diff) |
Rename from memchunk to chunkset.
Diffstat (limited to 'chunkset.c')
-rw-r--r-- | chunkset.c | 66 |
1 files changed, 66 insertions, 0 deletions
diff --git a/chunkset.c b/chunkset.c new file mode 100644 index 0000000..2e48dda --- /dev/null +++ b/chunkset.c @@ -0,0 +1,66 @@ +/* chunkset.c -- inline functions to copy small data chunks. + * For conditions of distribution and use, see copyright notice in zlib.h + */ + +#include "zbuild.h" +#include "zutil.h" + +#ifdef UNALIGNED_OK +typedef uint64_t chunk_t; +#else +typedef uint8_t chunk_t[8]; +#endif + +#define HAVE_CHUNKMEMSET_1 +#define HAVE_CHUNKMEMSET_4 +#define HAVE_CHUNKMEMSET_8 + +static inline void chunkmemset_1(uint8_t *from, chunk_t *chunk) { +#ifdef UNALIGNED_OK + *chunk = 0x0101010101010101 * (uint8_t)*from; +#else + memset(chunk, *from, sizeof(chunk_t)); +#endif +} + +static inline void chunkmemset_4(uint8_t *from, chunk_t *chunk) { +#ifdef UNALIGNED_OK + uint32_t half_chunk; + half_chunk = *(uint32_t *)from; + *chunk = 0x0000000100000001 * (uint64_t)half_chunk; +#else + uint8_t *chunkptr = (uint8_t *)chunk; + memcpy(chunkptr, from, 4); + memcpy(chunkptr+4, from, 4); +#endif +} + +static inline void chunkmemset_8(uint8_t *from, chunk_t *chunk) { +#ifdef UNALIGNED_OK + *chunk = *(uint64_t *)from; +#else + memcpy(chunk, from, sizeof(chunk_t)); +#endif +} + +static inline void loadchunk(uint8_t const *s, chunk_t *chunk) { + chunkmemset_8((uint8_t *)s, chunk); +} + +static inline void storechunk(uint8_t *out, chunk_t *chunk) { +#ifdef UNALIGNED_OK + *(uint64_t *)out = *chunk; +#else + /* Cast to chunk_t pointer to avoid compiler error on MSVC ARM */ + memcpy((chunk_t *)out, chunk, sizeof(chunk_t )); +#endif +} + +#define CHUNKSIZE chunksize_c +#define CHUNKCOPY chunkcopy_c +#define CHUNKCOPY_SAFE chunkcopy_safe_c +#define CHUNKUNROLL chunkunroll_c +#define CHUNKMEMSET chunkmemset_c +#define CHUNKMEMSET_SAFE chunkmemset_safe_c + +#include "chunkset_tpl.h" |