summaryrefslogtreecommitdiff
path: root/arch/x86/insert_string_sse.c
blob: d0c316b199621cebd5c5b855b4500b42bada0091 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
/* insert_string_sse -- insert_string variant using SSE4.2's CRC instructions
 *
 * Copyright (C) 1995-2013 Jean-loup Gailly and Mark Adler
 * For conditions of distribution and use, see copyright notice in zlib.h
 *
 */

#include "../../zbuild.h"
#include <immintrin.h>
#ifdef _MSC_VER
#  include <nmmintrin.h>
#endif
#include "../../deflate.h"

#ifdef X86_SSE42_CRC_INTRIN
#  ifdef _MSC_VER
#    define UPDATE_HASH(s, h, val)\
        h = _mm_crc32_u32(h, val)
#  else
#    define UPDATE_HASH(s, h, val)\
        h = __builtin_ia32_crc32si(h, val)
#  endif
#else
#  ifdef _MSC_VER
#    define UPDATE_HASH(s, h, val) {\
        __asm mov edx, h\
        __asm mov eax, val\
        __asm crc32 eax, edx\
        __asm mov val, eax\
    }
#  else
#    define UPDATE_HASH(s, h, val) \
        __asm__ __volatile__ (\
            "crc32 %1,%0\n\t"\
            : "+r" (h)\
            : "r" (val)\
        );
#  endif
#endif

#define INSERT_STRING       insert_string_sse4
#define QUICK_INSERT_STRING quick_insert_string_sse4

#ifdef X86_SSE42_CRC_HASH
#  include "../../insert_string_tpl.h"
#endif