diff options
author | weidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0> | 2010-07-29 08:51:39 +0000 |
---|---|---|
committer | weidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0> | 2010-07-29 08:51:39 +0000 |
commit | ce8e106147f7697285ef740dde39541f4f7e7187 (patch) | |
tree | 19eef65695ec9d0bb9a2152afe6bac0598dc4238 /cpu.h | |
parent | dd6b53792ce52a8e10d85d4420f3946d87419d44 (diff) | |
download | cryptopp-ce8e106147f7697285ef740dde39541f4f7e7187.tar.gz |
fix compile on GCC 4.4 and greater
git-svn-id: svn://svn.code.sf.net/p/cryptopp/code/trunk/c5@512 57ff6487-cd31-0410-9ec3-f628ee90f5f0
Diffstat (limited to 'cpu.h')
-rwxr-xr-x | cpu.h | 82 |
1 files changed, 80 insertions, 2 deletions
@@ -12,8 +12,86 @@ #include "config.h" -#ifdef CRYPTOPP_MSVC6PP_OR_LATER - #include <emmintrin.h> +#if CRYPTOPP_BOOL_SSE2_INTRINSICS_AVAILABLE +#include <emmintrin.h> +#endif + +#if CRYPTOPP_BOOL_AESNI_INTRINSICS_AVAILABLE +#if !defined(__GNUC__) || defined(__SSSE3__) +#include <tmmintrin.h> +#else +__inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) +_mm_shuffle_epi8 (__m128i a, __m128i b) +{ + asm ("pshufb %1, %0" : "+x"(a) : "xm"(b)); + return a; +} +#endif +#if !defined(__GNUC__) || defined(__SSE4_1__) +#include <smmintrin.h> +#else +__inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__)) +_mm_extract_epi32 (__m128i a, const int i) +{ + int r; + asm ("pextrd %2, %1, %0" : "=rm"(r) : "x"(a), "i"(i)); + return r; +} +__inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) +_mm_insert_epi32 (__m128i a, int b, const int i) +{ + asm ("pinsrd %2, %1, %0" : "+x"(a) : "rm"(b), "i"(i)); + return a; +} +#endif +#if !defined(__GNUC__) || (defined(__AES__) && defined(__PCLMUL__)) +#include <wmmintrin.h> +#else +__inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) +_mm_clmulepi64_si128 (__m128i a, __m128i b, const int i) +{ + asm ("pclmulqdq %2, %1, %0" : "+x"(a) : "xm"(b), "i"(i)); + return a; +} +__inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) +_mm_aeskeygenassist_si128 (__m128i a, const int i) +{ + __m128i r; + asm ("aeskeygenassist %2, %1, %0" : "=x"(r) : "xm"(a), "i"(i)); + return r; +} +__inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) +_mm_aesimc_si128 (__m128i a) +{ + __m128i r; + asm ("aesimc %1, %0" : "=x"(r) : "xm"(a)); + return r; +} +__inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) +_mm_aesenc_si128 (__m128i a, __m128i b) +{ + asm ("aesenc %1, %0" : "+x"(a) : "xm"(b)); + return a; +} +__inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) +_mm_aesenclast_si128 (__m128i a, __m128i b) +{ + asm ("aesenclast %1, %0" : "+x"(a) : "xm"(b)); + return a; +} +__inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) +_mm_aesdec_si128 (__m128i a, __m128i b) +{ + asm ("aesdec %1, %0" : "+x"(a) : "xm"(b)); + return a; +} +__inline __m128i __attribute__((__gnu_inline__, __always_inline__, __artificial__)) +_mm_aesdeclast_si128 (__m128i a, __m128i b) +{ + asm ("aesdeclast %1, %0" : "+x"(a) : "xm"(b)); + return a; +} +#endif #endif NAMESPACE_BEGIN(CryptoPP) |