1 #ifndef MARISA_GRIMOIRE_INTRIN_H_
2 #define MARISA_GRIMOIRE_INTRIN_H_
3 
4 #include "marisa/base.h"
5 
6 #if defined(__x86_64__) || defined(_M_X64)
7  #define MARISA_X64
8 #elif defined(__i386__) || defined(_M_IX86)
9  #define MARISA_X86
10 #else  // defined(__i386__) || defined(_M_IX86)
11  #ifdef MARISA_USE_BMI2
12   #undef MARISA_USE_BMI2
13  #endif  // MARISA_USE_BMI2
14  #ifdef MARISA_USE_BMI
15   #undef MARISA_USE_BMI
16  #endif  // MARISA_USE_BMI
17  #ifdef MARISA_USE_POPCNT
18   #undef MARISA_USE_POPCNT
19  #endif  // MARISA_USE_POPCNT
20  #ifdef MARISA_USE_SSE4A
21   #undef MARISA_USE_SSE4A
22  #endif  // MARISA_USE_SSE4A
23  #ifdef MARISA_USE_SSE4
24   #undef MARISA_USE_SSE4
25  #endif  // MARISA_USE_SSE4
26  #ifdef MARISA_USE_SSE4_2
27   #undef MARISA_USE_SSE4_2
28  #endif  // MARISA_USE_SSE4_2
29  #ifdef MARISA_USE_SSE4_1
30   #undef MARISA_USE_SSE4_1
31  #endif  // MARISA_USE_SSE4_1
32  #ifdef MARISA_USE_SSSE3
33   #undef MARISA_USE_SSSE3
34  #endif  // MARISA_USE_SSSE3
35  #ifdef MARISA_USE_SSE3
36   #undef MARISA_USE_SSE3
37  #endif  // MARISA_USE_SSE3
38  #ifdef MARISA_USE_SSE2
39   #undef MARISA_USE_SSE2
40  #endif  // MARISA_USE_SSE2
41 #endif  // defined(__i386__) || defined(_M_IX86)
42 
43 #ifdef MARISA_USE_BMI2
44  #ifndef MARISA_USE_BMI
45   #define MARISA_USE_BMI
46  #endif  // MARISA_USE_BMI
47  #ifdef _MSC_VER
48   #include <immintrin.h>
49  #else  // _MSC_VER
50   #include <x86intrin.h>
51  #endif  // _MSC_VER
52 #endif  // MARISA_USE_BMI2
53 
54 #ifdef MARISA_USE_BMI
55  #ifndef MARISA_USE_SSE4
56   #define MARISA_USE_SSE4
57  #endif  // MARISA_USE_SSE4
58 #endif  // MARISA_USE_BMI
59 
60 #ifdef MARISA_USE_SSE4A
61  #ifndef MARISA_USE_SSE3
62   #define MARISA_USE_SSE3
63  #endif  // MARISA_USE_SSE3
64  #ifndef MARISA_USE_POPCNT
65   #define MARISA_USE_POPCNT
66  #endif  // MARISA_USE_POPCNT
67 #endif  // MARISA_USE_SSE4A
68 
69 #ifdef MARISA_USE_SSE4
70  #ifndef MARISA_USE_SSE4_2
71   #define MARISA_USE_SSE4_2
72  #endif  // MARISA_USE_SSE4_2
73 #endif  // MARISA_USE_SSE4
74 
75 #ifdef MARISA_USE_SSE4_2
76  #ifndef MARISA_USE_SSE4_1
77   #define MARISA_USE_SSE4_1
78  #endif  // MARISA_USE_SSE4_1
79  #ifndef MARISA_USE_POPCNT
80   #define MARISA_USE_POPCNT
81  #endif  // MARISA_USE_POPCNT
82 #endif  // MARISA_USE_SSE4_2
83 
84 #ifdef MARISA_USE_SSE4_1
85  #ifndef MARISA_USE_SSSE3
86   #define MARISA_USE_SSSE3
87  #endif  // MARISA_USE_SSSE3
88 #endif  // MARISA_USE_SSE4_1
89 
90 #ifdef MARISA_USE_POPCNT
91  #ifndef MARISA_USE_SSE3
92   #define MARISA_USE_SSE3
93  #endif  // MARISA_USE_SSE3
94  #ifdef _MSC_VER
95   #include <intrin.h>
96  #else  // _MSC_VER
97   #include <popcntintrin.h>
98  #endif  // _MSC_VER
99 #endif  // MARISA_USE_POPCNT
100 
101 #ifdef MARISA_USE_SSSE3
102  #ifndef MARISA_USE_SSE3
103   #define MARISA_USE_SSE3
104  #endif  // MARISA_USE_SSE3
105  #ifdef MARISA_X64
106   #define MARISA_X64_SSSE3
107  #else  // MARISA_X64
108   #define MARISA_X86_SSSE3
109  #endif  // MAIRSA_X64
110  #include <tmmintrin.h>
111 #endif  // MARISA_USE_SSSE3
112 
113 #ifdef MARISA_USE_SSE3
114  #ifndef MARISA_USE_SSE2
115   #define MARISA_USE_SSE2
116  #endif  // MARISA_USE_SSE2
117 #endif  // MARISA_USE_SSE3
118 
119 #ifdef MARISA_USE_SSE2
120  #ifdef MARISA_X64
121   #define MARISA_X64_SSE2
122  #else  // MARISA_X64
123   #define MARISA_X86_SSE2
124  #endif  // MAIRSA_X64
125  #include <emmintrin.h>
126 #endif  // MARISA_USE_SSE2
127 
128 #ifdef _MSC_VER
129  #if MARISA_WORD_SIZE == 64
130   #include <intrin.h>
131   #pragma intrinsic(_BitScanForward64)
132  #else  // MARISA_WORD_SIZE == 64
133   #include <intrin.h>
134   #pragma intrinsic(_BitScanForward)
135  #endif  // MARISA_WORD_SIZE == 64
136 #endif  // _MSC_VER
137 
138 #endif  // MARISA_GRIMOIRE_INTRIN_H_
139