summaryrefslogtreecommitdiff
path: root/gcm.cpp
diff options
context:
space:
mode:
authorJeffrey Walton <noloader@gmail.com>2017-08-16 22:10:53 -0400
committerJeffrey Walton <noloader@gmail.com>2017-08-16 22:10:53 -0400
commitdf280a509a3c86b825475ec9456b56d3fb21cedb (patch)
tree899a3ded9fb6ea1fab60c82723cf99c48974a8f7 /gcm.cpp
parent1450847e405d8f4c969c3ae5e1a30faec6cff746 (diff)
downloadcryptopp-git-df280a509a3c86b825475ec9456b56d3fb21cedb.tar.gz
Disable Carryless Multiplies for Clang
Clang causes too many problems. Early versions of the compiler simply crashes. Later versions of the compiler still have trouble with Intel ASM and still produce incorrect results on occassion. Additionally, we have to special case the integrated assemvler. Its making a mess of the code and causing self test failures
Diffstat (limited to 'gcm.cpp')
-rw-r--r--gcm.cpp27
1 files changed, 13 insertions, 14 deletions
diff --git a/gcm.cpp b/gcm.cpp
index b27dba29..0a4207ad 100644
--- a/gcm.cpp
+++ b/gcm.cpp
@@ -16,16 +16,20 @@
#ifndef CRYPTOPP_IMPORTS
#ifndef CRYPTOPP_GENERATE_X64_MASM
-// Clang 3.3 integrated assembler crash on Linux.
-#if (defined(CRYPTOPP_LLVM_CLANG_VERSION) && (CRYPTOPP_LLVM_CLANG_VERSION < 30400))
+// Clang 3.3 integrated assembler crash on Linux. Other versions produce incorrect results.
+// Clang has never handled Intel ASM very well. I wish LLVM would fix it.
+#if defined(__clang__)
+# undef CRYPTOPP_X86_ASM_AVAILABLE
+# undef CRYPTOPP_X32_ASM_AVAILABLE
+# undef CRYPTOPP_X64_ASM_AVAILABLE
# undef CRYPTOPP_BOOL_SSE2_ASM_AVAILABLE
#endif
// SunCC 5.13 and below crash with AES-NI/CLMUL and C++{03|11}. Disable one or the other.
// Also see http://github.com/weidai11/cryptopp/issues/226
-#if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x513)
-# undef CRYPTOPP_BOOL_AESNI_INTRINSICS_AVAILABLE
-#endif
+// #if defined(__SUNPRO_CC) && (__SUNPRO_CC <= 0x513)
+// # undef CRYPTOPP_BOOL_AESNI_INTRINSICS_AVAILABLE
+// #endif
// Clang casts
#define M128I_CAST(x) ((__m128i *)(void *)(x))
@@ -37,21 +41,16 @@
NAMESPACE_BEGIN(CryptoPP)
#if (CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64)
-// Different assemblers accept different mnemonics: 'movd eax, xmm0' vs 'movd rax, xmm0' vs 'mov eax, xmm0' vs 'mov rax, xmm0'
-#if (CRYPTOPP_LLVM_CLANG_VERSION >= 30600) || (CRYPTOPP_APPLE_CLANG_VERSION >= 70000) || defined(CRYPTOPP_CLANG_INTEGRATED_ASSEMBLER)
-// 'movd eax, xmm0' only. REG_WORD() macro not used.
-# define USE_MOVD_REG32 1
-#elif (defined(CRYPTOPP_LLVM_CLANG_VERSION) || defined(CRYPTOPP_APPLE_CLANG_VERSION)) && defined(CRYPTOPP_X64_ASM_AVAILABLE)
-// 'movd eax, xmm0' or 'movd rax, xmm0'. REG_WORD() macro supplies REG32 or REG64.
-# define USE_MOVD_REG32_OR_REG64 1
-#elif defined(__GNUC__) || defined(_MSC_VER)
+// Different assemblers accept different mnemonics: 'movd eax, xmm0' vs
+// 'movd rax, xmm0' vs 'mov eax, xmm0' vs 'mov rax, xmm0'
+#if defined(__GNUC__) || defined(_MSC_VER)
// 'movd eax, xmm0' or 'movd rax, xmm0'. REG_WORD() macro supplies REG32 or REG64.
# define USE_MOVD_REG32_OR_REG64 1
#else
// 'mov eax, xmm0' or 'mov rax, xmm0'. REG_WORD() macro supplies REG32 or REG64.
# define USE_MOV_REG32_OR_REG64 1
#endif
-#endif
+#endif // CRYPTOPP_BOOL_X86 || CRYPTOPP_BOOL_X32 || CRYPTOPP_BOOL_X64
#if (CRYPTOPP_BOOL_ARM32 || CRYPTOPP_BOOL_ARM64) && CRYPTOPP_BOOL_ARM_PMULL_AVAILABLE
#if defined(__GNUC__)