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