summaryrefslogtreecommitdiff
path: root/wsutil/ws_mempbrk_sse42.c
diff options
context:
space:
mode:
authorPascal Quantin <pascal.quantin@gmail.com>2015-02-12 09:07:02 +0100
committerPascal Quantin <pascal.quantin@gmail.com>2015-02-12 16:37:55 +0000
commitbdcac172eaa2ec4998c9f2775e691460b9b7a2d0 (patch)
treefce8f3fc4cee653f0edfe8ed93f1133474e66ea8 /wsutil/ws_mempbrk_sse42.c
parent678a9b6463b3661660da2e8a99781332c23cf78c (diff)
downloadwireshark-bdcac172eaa2ec4998c9f2775e691460b9b7a2d0.tar.gz
Fix crash at startup in SSE4.2 code when running a 32 bits Windows build
There is no guarantee that a g_malloc'ed memory block will be aligned on a 128 bits boundary Instead use a static variable definition (at the cost of exposing the HAVE_SSE4_2 compilation flag in ws_mempbrk.h) Change-Id: I661bf479a9d458d64c96bafc940c519d29a4780b Reviewed-on: https://code.wireshark.org/review/7070 Petri-Dish: Pascal Quantin <pascal.quantin@gmail.com> Tested-by: Petri Dish Buildbot <buildbot-no-reply@wireshark.org> Reviewed-by: Anders Broman <a.broman58@gmail.com> Reviewed-by: Pascal Quantin <pascal.quantin@gmail.com>
Diffstat (limited to 'wsutil/ws_mempbrk_sse42.c')
-rw-r--r--wsutil/ws_mempbrk_sse42.c18
1 files changed, 7 insertions, 11 deletions
diff --git a/wsutil/ws_mempbrk_sse42.c b/wsutil/ws_mempbrk_sse42.c
index da37a665aa..4fd3ef0701 100644
--- a/wsutil/ws_mempbrk_sse42.c
+++ b/wsutil/ws_mempbrk_sse42.c
@@ -68,11 +68,8 @@ ws_mempbrk_sse42_compile(tvb_pbrk_pattern* pattern, const gchar *needles)
pattern->use_sse42 = ws_cpuid_sse42() && (length <= 16);
if (pattern->use_sse42) {
- __m128i *pmask = NULL;
- pattern->mask = g_malloc(sizeof(__m128i));
- pmask = (__m128i *) pattern->mask;
- *pmask = _mm_setzero_si128();
- memcpy(pmask, needles, length);
+ pattern->mask = _mm_setzero_si128();
+ memcpy(&(pattern->mask), needles, length);
}
}
@@ -112,7 +109,6 @@ const char *
ws_mempbrk_sse42_exec(const char *s, size_t slen, const tvb_pbrk_pattern* pattern, guchar *found_needle)
{
const char *aligned;
- __m128i *pmask = (__m128i *) pattern->mask;
int offset;
offset = (int) ((size_t) s & 15);
@@ -122,9 +118,9 @@ ws_mempbrk_sse42_exec(const char *s, size_t slen, const tvb_pbrk_pattern* patter
/* Check partial string. cast safe it's 16B aligned */
__m128i value = __m128i_shift_right (_mm_load_si128 (cast_128aligned__m128i(aligned)), offset);
- int length = _mm_cmpistri (*pmask, value, 0x2);
+ int length = _mm_cmpistri (pattern->mask, value, 0x2);
/* No need to check ZFlag since ZFlag is always 1. */
- int cflag = _mm_cmpistrc (*pmask, value, 0x2);
+ int cflag = _mm_cmpistrc (pattern->mask, value, 0x2);
/* XXX: why does this compare value with value? */
int idx = _mm_cmpistri (value, value, 0x3a);
@@ -149,9 +145,9 @@ ws_mempbrk_sse42_exec(const char *s, size_t slen, const tvb_pbrk_pattern* patter
while (slen >= 16)
{
__m128i value = _mm_load_si128 (cast_128aligned__m128i(aligned));
- int idx = _mm_cmpistri (*pmask, value, 0x2);
- int cflag = _mm_cmpistrc (*pmask, value, 0x2);
- int zflag = _mm_cmpistrz (*pmask, value, 0x2);
+ int idx = _mm_cmpistri (pattern->mask, value, 0x2);
+ int cflag = _mm_cmpistrc (pattern->mask, value, 0x2);
+ int zflag = _mm_cmpistrz (pattern->mask, value, 0x2);
if (cflag) {
if (found_needle)