Add clang target pragma for mixed C/assembly x86-64 implementations
authorJussi Kivilinna <jussi.kivilinna@iki.fi>
Tue, 20 Nov 2018 19:16:08 +0000 (21:16 +0200)
committerJussi Kivilinna <jussi.kivilinna@iki.fi>
Tue, 20 Nov 2018 19:16:08 +0000 (21:16 +0200)
* cipher/cipher-gcm-intel-pclmul.c: Add target 'no-sse' attribute
pragma for clang.
* cipher/crc-intel-pclmul.c: Ditto.
* cipher/rijndael-aesni.c: Ditto.
* cipher/rijndael-ssse3-amd64.c: Ditto.
* cipher/sha1-intel-shaext.c: Ditto.
* cipher/sha256-intel-shaext.c: Ditto.
--

Signed-off-by: Jussi Kivilinna <jussi.kivilinna@iki.fi>
cipher/cipher-gcm-intel-pclmul.c
cipher/crc-intel-pclmul.c
cipher/rijndael-aesni.c
cipher/rijndael-ssse3-amd64.c
cipher/sha1-intel-shaext.c
cipher/sha256-intel-shaext.c

index 0f26277..60ae7aa 100644 (file)
@@ -37,6 +37,9 @@
 /* Prevent compiler from issuing SSE instructions between asm blocks. */
 #  pragma GCC target("no-sse")
 #endif
 /* Prevent compiler from issuing SSE instructions between asm blocks. */
 #  pragma GCC target("no-sse")
 #endif
+#if __clang__
+#  pragma clang attribute push (__attribute__((target("no-sse"))), apply_to = function)
+#endif
 
 
 /*
 
 
 /*
@@ -474,4 +477,8 @@ _gcry_ghash_intel_pclmul (gcry_cipher_hd_t c, byte *result, const byte *buf,
   return 0;
 }
 
   return 0;
 }
 
+#if __clang__
+#  pragma clang attribute pop
+#endif
+
 #endif /* GCM_USE_INTEL_PCLMUL */
 #endif /* GCM_USE_INTEL_PCLMUL */
index 8ff08ec..482b260 100644 (file)
@@ -39,6 +39,9 @@
 /* Prevent compiler from issuing SSE instructions between asm blocks. */
 #  pragma GCC target("no-sse")
 #endif
 /* Prevent compiler from issuing SSE instructions between asm blocks. */
 #  pragma GCC target("no-sse")
 #endif
+#if __clang__
+#  pragma clang attribute push (__attribute__((target("no-sse"))), apply_to = function)
+#endif
 
 
 #define ALIGNED_16 __attribute__ ((aligned (16)))
 
 
 #define ALIGNED_16 __attribute__ ((aligned (16)))
@@ -922,4 +925,8 @@ _gcry_crc24rfc2440_intel_pclmul (u32 *pcrc, const byte *inbuf, size_t inlen)
 #endif
 }
 
 #endif
 }
 
+#if __clang__
+#  pragma clang attribute pop
+#endif
+
 #endif /* USE_INTEL_PCLMUL */
 #endif /* USE_INTEL_PCLMUL */
index c1ebab0..483387c 100644 (file)
@@ -39,6 +39,9 @@
 /* Prevent compiler from issuing SSE instructions between asm blocks. */
 #  pragma GCC target("no-sse")
 #endif
 /* Prevent compiler from issuing SSE instructions between asm blocks. */
 #  pragma GCC target("no-sse")
 #endif
+#if __clang__
+#  pragma clang attribute push (__attribute__((target("no-sse"))), apply_to = function)
+#endif
 
 
 #define ALWAYS_INLINE inline __attribute__((always_inline))
 
 
 #define ALWAYS_INLINE inline __attribute__((always_inline))
@@ -3514,4 +3517,8 @@ _gcry_aes_aesni_xts_crypt (RIJNDAEL_context *ctx, unsigned char *tweak,
     _gcry_aes_aesni_xts_dec(ctx, tweak, outbuf, inbuf, nblocks);
 }
 
     _gcry_aes_aesni_xts_dec(ctx, tweak, outbuf, inbuf, nblocks);
 }
 
+#if __clang__
+#  pragma clang attribute pop
+#endif
+
 #endif /* USE_AESNI */
 #endif /* USE_AESNI */
index fa481bb..0c1ae6e 100644 (file)
@@ -55,6 +55,9 @@
 /* Prevent compiler from issuing SSE instructions between asm blocks. */
 #  pragma GCC target("no-sse")
 #endif
 /* Prevent compiler from issuing SSE instructions between asm blocks. */
 #  pragma GCC target("no-sse")
 #endif
+#if __clang__
+#  pragma clang attribute push (__attribute__((target("no-sse"))), apply_to = function)
+#endif
 
 
 /* Copy of ocb_get_l needed here as GCC is unable to inline ocb_get_l
 
 
 /* Copy of ocb_get_l needed here as GCC is unable to inline ocb_get_l
@@ -726,4 +729,8 @@ _gcry_aes_ssse3_ocb_auth (gcry_cipher_hd_t c, const void *abuf_arg,
   return 0;
 }
 
   return 0;
 }
 
+#if __clang__
+#  pragma clang attribute pop
+#endif
+
 #endif /* USE_SSSE3 */
 #endif /* USE_SSSE3 */
index 5a2349e..d7e3d4f 100644 (file)
@@ -29,6 +29,9 @@
 /* Prevent compiler from issuing SSE instructions between asm blocks. */
 #  pragma GCC target("no-sse")
 #endif
 /* Prevent compiler from issuing SSE instructions between asm blocks. */
 #  pragma GCC target("no-sse")
 #endif
+#if __clang__
+#  pragma clang attribute push (__attribute__((target("no-sse"))), apply_to = function)
+#endif
 
 /* Two macros to be called prior and after the use of SHA-EXT
    instructions.  There should be no external function calls between
 
 /* Two macros to be called prior and after the use of SHA-EXT
    instructions.  There should be no external function calls between
@@ -278,4 +281,8 @@ _gcry_sha1_transform_intel_shaext(void *state, const unsigned char *data,
   return 0;
 }
 
   return 0;
 }
 
+#if __clang__
+#  pragma clang attribute pop
+#endif
+
 #endif /* HAVE_GCC_INLINE_ASM_SHA_EXT */
 #endif /* HAVE_GCC_INLINE_ASM_SHA_EXT */
index 0c107bb..2eda42d 100644 (file)
@@ -29,6 +29,9 @@
 /* Prevent compiler from issuing SSE instructions between asm blocks. */
 #  pragma GCC target("no-sse")
 #endif
 /* Prevent compiler from issuing SSE instructions between asm blocks. */
 #  pragma GCC target("no-sse")
 #endif
+#if __clang__
+#  pragma clang attribute push (__attribute__((target("no-sse"))), apply_to = function)
+#endif
 
 /* Two macros to be called prior and after the use of SHA-EXT
    instructions.  There should be no external function calls between
 
 /* Two macros to be called prior and after the use of SHA-EXT
    instructions.  There should be no external function calls between
@@ -349,4 +352,8 @@ _gcry_sha256_transform_intel_shaext(u32 state[8], const unsigned char *data,
   return 0;
 }
 
   return 0;
 }
 
+#if __clang__
+#  pragma clang attribute pop
+#endif
+
 #endif /* HAVE_GCC_INLINE_ASM_SHA_EXT */
 #endif /* HAVE_GCC_INLINE_ASM_SHA_EXT */