ZLIB_INTERNAL Pos insert_string_sse(deflate_state *const s, const Pos str, unsigned int count) {
Pos ret = 0;
unsigned int idx;
- unsigned *ip, val, h;
+ unsigned int *ip, val, h;
for (idx = 0; idx < count; idx++) {
ip = (unsigned *)&s->window[str+idx];
- val = *ip;
+ memcpy(&val, ip, sizeof(val));
h = 0;
if (s->level >= TRIGGER_LEVEL)
unsigned int wmask = s->w_mask;
register unsigned char *strend = s->window + s->strstart + MAX_MATCH;
- register uint16_t scan_start = *(uint16_t*)scan;
- register uint16_t scan_end = *(uint16_t*)(scan+best_len-1);
+
+ uint16_t scan_start, scan_end;
+
+ memcpy(&scan_start, scan, sizeof(scan_start));
+ memcpy(&scan_end, scan+best_len-1, sizeof(scan_end));
/* The code is optimized for HASH_BITS >= 8 and MAX_MATCH-2 multiple of 16.
* It is easy to get rid of this optimization if necessary.
int cont = 1;
do {
match = win + cur_match;
- if (likely(*(uint16_t*)(match+best_len-1) != scan_end)) {
+ if (likely(memcmp(match+best_len-1, &scan_end, sizeof(scan_end)) != 0)) {
if ((cur_match = prev[cur_match & wmask]) > limit
&& --chain_length != 0) {
continue;
if (!cont)
break;
- if (*(uint16_t*)match != scan_start)
+ if (memcmp(match, &scan_start, sizeof(scan_start)) != 0)
continue;
/* It is not necessary to compare scan[2] and match[2] since they are
scan += 2, match+=2;
Assert(*scan == *match, "match[2]?");
do {
- unsigned long sv = *(unsigned long*)(void*)scan;
- unsigned long mv = *(unsigned long*)(void*)match;
- unsigned long xor = sv ^ mv;
+ unsigned long sv, mv, xor;
+
+ memcpy(&sv, scan, sizeof(sv));
+ memcpy(&mv, match, sizeof(mv));
+
+ xor = sv ^ mv;
+
if (xor) {
int match_byte = __builtin_ctzl(xor) / 8;
scan += match_byte;
best_len = len;
if (len >= nice_match)
break;
- scan_end = *(uint16_t*)(scan+best_len-1);
+ memcpy(&scan_end, scan+best_len-1, sizeof(scan_end));
} else {
/*
* The probability of finding a match later if we here