summaryrefslogtreecommitdiff
path: root/cpu.h
diff options
context:
space:
mode:
authorweidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0>2010-07-29 08:51:39 +0000
committerweidai <weidai@57ff6487-cd31-0410-9ec3-f628ee90f5f0>2010-07-29 08:51:39 +0000
commitce8e106147f7697285ef740dde39541f4f7e7187 (patch)
tree19eef65695ec9d0bb9a2152afe6bac0598dc4238 /cpu.h
parentdd6b53792ce52a8e10d85d4420f3946d87419d44 (diff)
downloadcryptopp-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-xcpu.h82
1 files changed, 80 insertions, 2 deletions
diff --git a/cpu.h b/cpu.h
index 9a6ee22..79d612e 100755
--- a/cpu.h
+++ b/cpu.h
@@ -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)