diff options
-rw-r--r-- | cipher/blowfish-amd64.S | 2 | ||||
-rw-r--r-- | cipher/blowfish.c | 3 | ||||
-rw-r--r-- | cipher/camellia-aesni-avx-amd64.S | 3 | ||||
-rw-r--r-- | cipher/camellia-aesni-avx2-amd64.S | 3 | ||||
-rw-r--r-- | cipher/camellia-glue.c | 4 | ||||
-rw-r--r-- | cipher/cast5-amd64.S | 2 | ||||
-rw-r--r-- | cipher/cast5.c | 2 | ||||
-rw-r--r-- | cipher/rijndael-amd64.S | 2 | ||||
-rw-r--r-- | cipher/rijndael.c | 2 | ||||
-rw-r--r-- | cipher/serpent-avx2-amd64.S | 3 | ||||
-rw-r--r-- | cipher/serpent-sse2-amd64.S | 2 | ||||
-rw-r--r-- | cipher/serpent.c | 4 | ||||
-rw-r--r-- | cipher/twofish-amd64.S | 2 | ||||
-rw-r--r-- | cipher/twofish.c | 2 | ||||
-rw-r--r-- | configure.ac | 30 |
15 files changed, 50 insertions, 16 deletions
diff --git a/cipher/blowfish-amd64.S b/cipher/blowfish-amd64.S index 1008387f..6975e559 100644 --- a/cipher/blowfish-amd64.S +++ b/cipher/blowfish-amd64.S @@ -20,7 +20,7 @@ #ifdef __x86_64 #include <config.h> -#if defined(USE_BLOWFISH) +#if defined(USE_BLOWFISH) && defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) .text diff --git a/cipher/blowfish.c b/cipher/blowfish.c index 39d4051c..69baebe0 100644 --- a/cipher/blowfish.c +++ b/cipher/blowfish.c @@ -45,7 +45,8 @@ /* USE_AMD64_ASM indicates whether to use AMD64 assembly code. */ #undef USE_AMD64_ASM -#if defined(__x86_64__) && (BLOWFISH_ROUNDS == 16) +#if defined(__x86_64__) && defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) && \ + (BLOWFISH_ROUNDS == 16) # define USE_AMD64_ASM 1 #endif diff --git a/cipher/camellia-aesni-avx-amd64.S b/cipher/camellia-aesni-avx-amd64.S index 95c96b8b..b0ef5fd0 100644 --- a/cipher/camellia-aesni-avx-amd64.S +++ b/cipher/camellia-aesni-avx-amd64.S @@ -20,7 +20,8 @@ #ifdef __x86_64 #include <config.h> -#if defined(ENABLE_AESNI_SUPPORT) && defined(ENABLE_AVX_SUPPORT) +#if defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) && \ + defined(ENABLE_AESNI_SUPPORT) && defined(ENABLE_AVX_SUPPORT) #ifdef __PIC__ # define RIP (%rip) diff --git a/cipher/camellia-aesni-avx2-amd64.S b/cipher/camellia-aesni-avx2-amd64.S index f0a34fd1..da427b47 100644 --- a/cipher/camellia-aesni-avx2-amd64.S +++ b/cipher/camellia-aesni-avx2-amd64.S @@ -20,7 +20,8 @@ #ifdef __x86_64 #include <config.h> -#if defined(ENABLE_AESNI_SUPPORT) && defined(ENABLE_AVX2_SUPPORT) +#if defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) && \ + defined(ENABLE_AESNI_SUPPORT) && defined(ENABLE_AVX2_SUPPORT) #ifdef __PIC__ # define RIP (%rip) diff --git a/cipher/camellia-glue.c b/cipher/camellia-glue.c index a5468fa9..b44bd7b4 100644 --- a/cipher/camellia-glue.c +++ b/cipher/camellia-glue.c @@ -75,7 +75,7 @@ /* USE_AESNI inidicates whether to compile with Intel AES-NI/AVX code. */ #undef USE_AESNI_AVX #if defined(ENABLE_AESNI_SUPPORT) && defined(ENABLE_AVX_SUPPORT) -# if defined(__x86_64__) +# if defined(__x86_64__) && defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) # define USE_AESNI_AVX 1 # endif #endif @@ -83,7 +83,7 @@ /* USE_AESNI_AVX2 inidicates whether to compile with Intel AES-NI/AVX2 code. */ #undef USE_AESNI_AVX2 #if defined(ENABLE_AESNI_SUPPORT) && defined(ENABLE_AVX2_SUPPORT) -# if defined(__x86_64__) +# if defined(__x86_64__) && defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) # define USE_AESNI_AVX2 1 # endif #endif diff --git a/cipher/cast5-amd64.S b/cipher/cast5-amd64.S index c3007d32..1bca2493 100644 --- a/cipher/cast5-amd64.S +++ b/cipher/cast5-amd64.S @@ -20,7 +20,7 @@ #ifdef __x86_64 #include <config.h> -#if defined(USE_CAST5) +#if defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) && defined(USE_CAST5) #ifdef __PIC__ # define RIP %rip diff --git a/cipher/cast5.c b/cipher/cast5.c index 8c5664dd..41bc9ffa 100644 --- a/cipher/cast5.c +++ b/cipher/cast5.c @@ -47,7 +47,7 @@ /* USE_AMD64_ASM indicates whether to use AMD64 assembly code. */ #undef USE_AMD64_ASM -#if defined(__x86_64__) +#if defined(__x86_64__) && defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) # define USE_AMD64_ASM 1 #endif diff --git a/cipher/rijndael-amd64.S b/cipher/rijndael-amd64.S index 6921f318..2519adac 100644 --- a/cipher/rijndael-amd64.S +++ b/cipher/rijndael-amd64.S @@ -20,7 +20,7 @@ #ifdef __x86_64 #include <config.h> -#if defined(USE_AES) +#if defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) && defined(USE_AES) #ifdef __PIC__ # define RIP %rip diff --git a/cipher/rijndael.c b/cipher/rijndael.c index 4a89e32c..35e599a3 100644 --- a/cipher/rijndael.c +++ b/cipher/rijndael.c @@ -63,7 +63,7 @@ /* USE_AMD64_ASM indicates whether to use AMD64 assembly code. */ #undef USE_AMD64_ASM -#if defined(__x86_64__) +#if defined(__x86_64__) && defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) # define USE_AMD64_ASM 1 #endif diff --git a/cipher/serpent-avx2-amd64.S b/cipher/serpent-avx2-amd64.S index 7f4f8b5e..7586c0c5 100644 --- a/cipher/serpent-avx2-amd64.S +++ b/cipher/serpent-avx2-amd64.S @@ -20,7 +20,8 @@ #ifdef __x86_64 #include <config.h> -#if defined(USE_SERPENT) && defined(ENABLE_AVX2_SUPPORT) +#if defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) && defined(USE_SERPENT) && \ + defined(ENABLE_AVX2_SUPPORT) #ifdef __PIC__ # define RIP (%rip) diff --git a/cipher/serpent-sse2-amd64.S b/cipher/serpent-sse2-amd64.S index 5f9e9d22..fe9feeea 100644 --- a/cipher/serpent-sse2-amd64.S +++ b/cipher/serpent-sse2-amd64.S @@ -20,7 +20,7 @@ #ifdef __x86_64 #include <config.h> -#if defined(USE_SERPENT) +#if defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) && defined(USE_SERPENT) #ifdef __PIC__ # define RIP (%rip) diff --git a/cipher/serpent.c b/cipher/serpent.c index 89e14aef..8aded344 100644 --- a/cipher/serpent.c +++ b/cipher/serpent.c @@ -34,13 +34,13 @@ /* USE_SSE2 indicates whether to compile with AMD64 SSE2 code. */ #undef USE_SSE2 -#if defined(__x86_64__) +#if defined(__x86_64__) && defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) # define USE_SSE2 1 #endif /* USE_AVX2 indicates whether to compile with AMD64 AVX2 code. */ #undef USE_AVX2 -#if defined(__x86_64__) +#if defined(__x86_64__) && defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) # if defined(ENABLE_AVX2_SUPPORT) # define USE_AVX2 1 # endif diff --git a/cipher/twofish-amd64.S b/cipher/twofish-amd64.S index a2a878ae..d4668343 100644 --- a/cipher/twofish-amd64.S +++ b/cipher/twofish-amd64.S @@ -20,7 +20,7 @@ #ifdef __x86_64 #include <config.h> -#if defined(USE_TWOFISH) +#if defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) && defined(USE_TWOFISH) #ifdef __PIC__ # define RIP %rip diff --git a/cipher/twofish.c b/cipher/twofish.c index ee721c6b..07a4ebe7 100644 --- a/cipher/twofish.c +++ b/cipher/twofish.c @@ -53,7 +53,7 @@ /* USE_AMD64_ASM indicates whether to use AMD64 assembly code. */ #undef USE_AMD64_ASM -#if defined(__x86_64__) +#if defined(__x86_64__) && defined(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS) # define USE_AMD64_ASM 1 #endif diff --git a/configure.ac b/configure.ac index 5b9d837e..d9b16392 100644 --- a/configure.ac +++ b/configure.ac @@ -941,6 +941,36 @@ if test "$gcry_cv_gcc_inline_asm_avx2" = "yes" ; then fi +# +# Check whether GCC assembler supports features needed for our amd64 +# implementations +# +AC_CACHE_CHECK([whether GCC assembler is compatible for amd64 assembly implementations], + [gcry_cv_gcc_amd64_platform_as_ok], + [gcry_cv_gcc_amd64_platform_as_ok=no + AC_COMPILE_IFELSE([AC_LANG_SOURCE( + [[__asm__( + /* Test if '.set' is supported by underlying assembler. */ + ".set a0, %rax\n\t" + ".set b0, %rdx\n\t" + "asmfunc:\n\t" + "movq a0, b0;\n\t" /* Fails here if .set ignored by as. */ + + /* Test if '.type' and '.size' are supported. */ + /* These work only on ELF targets. */ + /* TODO: add COFF (mingw64, cygwin64) support to assembly + * implementations. Mingw64/cygwin64 also require additional + * work because they use different calling convention. */ + ".size asmfunc,.-asmfunc;\n\t" + ".type asmfunc,@function;\n\t" + );]])], + [gcry_cv_gcc_amd64_platform_as_ok=yes])]) +if test "$gcry_cv_gcc_amd64_platform_as_ok" = "yes" ; then + AC_DEFINE(HAVE_COMPATIBLE_GCC_AMD64_PLATFORM_AS,1, + [Defined if underlying assembler is compatible with amd64 assembly implementations]) +fi + + ####################################### #### Checks for library functions. #### ####################################### |