Option to use memcpy for unaligned data access
This commit is contained in:
parent
7ecd1b3677
commit
84e8458de0
28
miniz_tdef.c
28
miniz_tdef.c
@ -737,13 +737,29 @@ static int tdefl_flush_block(tdefl_compressor *d, int flush)
|
|||||||
}
|
}
|
||||||
|
|
||||||
#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES
|
#if MINIZ_USE_UNALIGNED_LOADS_AND_STORES
|
||||||
|
#ifdef MINIZ_UNALIGNED_USE_MEMCPY
|
||||||
|
static inline mz_uint16 TDEFL_READ_UNALIGNED_WORD(const mz_uint8* p)
|
||||||
|
{
|
||||||
|
mz_uint16 ret;
|
||||||
|
memcpy(&ret, p, sizeof(mz_uint16));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
static inline mz_uint16 TDEFL_READ_UNALIGNED_WORD2(const mz_uint16* p)
|
||||||
|
{
|
||||||
|
mz_uint16 ret;
|
||||||
|
memcpy(&ret, p, sizeof(mz_uint16));
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
#else
|
||||||
#define TDEFL_READ_UNALIGNED_WORD(p) *(const mz_uint16 *)(p)
|
#define TDEFL_READ_UNALIGNED_WORD(p) *(const mz_uint16 *)(p)
|
||||||
|
#define TDEFL_READ_UNALIGNED_WORD2(p) *(const mz_uint16 *)(p)
|
||||||
|
#endif
|
||||||
static MZ_FORCEINLINE void tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len)
|
static MZ_FORCEINLINE void tdefl_find_match(tdefl_compressor *d, mz_uint lookahead_pos, mz_uint max_dist, mz_uint max_match_len, mz_uint *pMatch_dist, mz_uint *pMatch_len)
|
||||||
{
|
{
|
||||||
mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, match_len = *pMatch_len, probe_pos = pos, next_probe_pos, probe_len;
|
mz_uint dist, pos = lookahead_pos & TDEFL_LZ_DICT_SIZE_MASK, match_len = *pMatch_len, probe_pos = pos, next_probe_pos, probe_len;
|
||||||
mz_uint num_probes_left = d->m_max_probes[match_len >= 32];
|
mz_uint num_probes_left = d->m_max_probes[match_len >= 32];
|
||||||
const mz_uint16 *s = (const mz_uint16 *)(d->m_dict + pos), *p, *q;
|
const mz_uint16 *s = (const mz_uint16 *)(d->m_dict + pos), *p, *q;
|
||||||
mz_uint16 c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]), s01 = TDEFL_READ_UNALIGNED_WORD(s);
|
mz_uint16 c01 = TDEFL_READ_UNALIGNED_WORD(&d->m_dict[pos + match_len - 1]), s01 = TDEFL_READ_UNALIGNED_WORD2(s);
|
||||||
MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN);
|
MZ_ASSERT(max_match_len <= TDEFL_MAX_MATCH_LEN);
|
||||||
if (max_match_len <= match_len)
|
if (max_match_len <= match_len)
|
||||||
return;
|
return;
|
||||||
@ -767,14 +783,14 @@ static MZ_FORCEINLINE void tdefl_find_match(tdefl_compressor *d, mz_uint lookahe
|
|||||||
if (!dist)
|
if (!dist)
|
||||||
break;
|
break;
|
||||||
q = (const mz_uint16 *)(d->m_dict + probe_pos);
|
q = (const mz_uint16 *)(d->m_dict + probe_pos);
|
||||||
if (TDEFL_READ_UNALIGNED_WORD(q) != s01)
|
if (TDEFL_READ_UNALIGNED_WORD2(q) != s01)
|
||||||
continue;
|
continue;
|
||||||
p = s;
|
p = s;
|
||||||
probe_len = 32;
|
probe_len = 32;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
} while ((TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) &&
|
} while ((TDEFL_READ_UNALIGNED_WORD2(++p) == TDEFL_READ_UNALIGNED_WORD2(++q)) && (TDEFL_READ_UNALIGNED_WORD2(++p) == TDEFL_READ_UNALIGNED_WORD2(++q)) &&
|
||||||
(TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (--probe_len > 0));
|
(TDEFL_READ_UNALIGNED_WORD2(++p) == TDEFL_READ_UNALIGNED_WORD2(++q)) && (TDEFL_READ_UNALIGNED_WORD2(++p) == TDEFL_READ_UNALIGNED_WORD2(++q)) && (--probe_len > 0));
|
||||||
if (!probe_len)
|
if (!probe_len)
|
||||||
{
|
{
|
||||||
*pMatch_dist = dist;
|
*pMatch_dist = dist;
|
||||||
@ -883,8 +899,8 @@ static mz_bool tdefl_compress_fast(tdefl_compressor *d)
|
|||||||
mz_uint32 probe_len = 32;
|
mz_uint32 probe_len = 32;
|
||||||
do
|
do
|
||||||
{
|
{
|
||||||
} while ((TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) &&
|
} while ((TDEFL_READ_UNALIGNED_WORD2(++p) == TDEFL_READ_UNALIGNED_WORD2(++q)) && (TDEFL_READ_UNALIGNED_WORD2(++p) == TDEFL_READ_UNALIGNED_WORD2(++q)) &&
|
||||||
(TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (TDEFL_READ_UNALIGNED_WORD(++p) == TDEFL_READ_UNALIGNED_WORD(++q)) && (--probe_len > 0));
|
(TDEFL_READ_UNALIGNED_WORD2(++p) == TDEFL_READ_UNALIGNED_WORD2(++q)) && (TDEFL_READ_UNALIGNED_WORD2(++p) == TDEFL_READ_UNALIGNED_WORD2(++q)) && (--probe_len > 0));
|
||||||
cur_match_len = ((mz_uint)(p - (const mz_uint16 *)pCur_dict) * 2) + (mz_uint)(*(const mz_uint8 *)p == *(const mz_uint8 *)q);
|
cur_match_len = ((mz_uint)(p - (const mz_uint16 *)pCur_dict) * 2) + (mz_uint)(*(const mz_uint8 *)p == *(const mz_uint8 *)q);
|
||||||
if (!probe_len)
|
if (!probe_len)
|
||||||
cur_match_len = cur_match_dist ? TDEFL_MAX_MATCH_LEN : 0;
|
cur_match_len = cur_match_dist ? TDEFL_MAX_MATCH_LEN : 0;
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user