summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSiarhei Siamashka <siarhei.siamashka@gmail.com>2014-03-07 06:39:42 +0200
committerSiarhei Siamashka <siarhei.siamashka@gmail.com>2014-04-02 12:46:04 +0300
commit840912b31159aa8ac7be4ea0cee8bdef95a539a4 (patch)
tree2931ca0946192069d06f44db477f9619c3369e57
parentc343846625152bacbba8d35c0354ed8aadb3c6a0 (diff)
configure.ac: Check if the compiler supports GCC vector extensions
The Intel Compiler 14.0.0 claims version GCC 4.7.3 compatibility via __GNUC__/__GNUC__MINOR__ macros, but does not provide the same level of GCC vector extensions support as the original GCC compiler: http://gcc.gnu.org/onlinedocs/gcc/Vector-Extensions.html Which results in the following compilation failure: In file included from ../test/utils.h(7), from ../test/utils.c(3): ../test/utils-prng.h(138): error: expression must have integral type uint32x4 e = x->a - ((x->b << 27) + (x->b >> (32 - 27))); ^ The problem is fixed by doing a special check in configure for this feature.
-rw-r--r--configure.ac18
-rw-r--r--test/utils-prng.c10
-rw-r--r--test/utils-prng.h9
3 files changed, 27 insertions, 10 deletions
diff --git a/configure.ac b/configure.ac
index 63279724..0339494b 100644
--- a/configure.ac
+++ b/configure.ac
@@ -1061,6 +1061,24 @@ fi
AC_MSG_RESULT($support_for_builtin_clz)
+dnl =====================================
+dnl GCC vector extensions
+
+support_for_gcc_vector_extensions=no
+
+AC_MSG_CHECKING(for GCC vector extensions)
+AC_LINK_IFELSE([AC_LANG_SOURCE([[
+unsigned int __attribute__ ((vector_size(16))) e, a, b;
+int main (void) { e = a - ((b << 27) + (b >> (32 - 27))) + 1; return e[0]; }
+]])], support_for_gcc_vector_extensions=yes)
+
+if test x$support_for_gcc_vector_extensions = xyes; then
+ AC_DEFINE([HAVE_GCC_VECTOR_EXTENSIONS], [],
+ [Whether the compiler supports GCC vector extensions])
+fi
+
+AC_MSG_RESULT($support_for_gcc_vector_extensions)
+
dnl ==================
dnl libpng
diff --git a/test/utils-prng.c b/test/utils-prng.c
index 7b32e353..c27b5be8 100644
--- a/test/utils-prng.c
+++ b/test/utils-prng.c
@@ -27,7 +27,7 @@
#include "utils.h"
#include "utils-prng.h"
-#if defined(GCC_VECTOR_EXTENSIONS_SUPPORTED) && defined(__SSE2__)
+#if defined(HAVE_GCC_VECTOR_EXTENSIONS) && defined(__SSE2__)
#include <xmmintrin.h>
#endif
@@ -52,7 +52,7 @@ void smallprng_srand_r (smallprng_t *x, uint32_t seed)
*/
void prng_srand_r (prng_t *x, uint32_t seed)
{
-#ifdef GCC_VECTOR_EXTENSIONS_SUPPORTED
+#ifdef HAVE_GCC_VECTOR_EXTENSIONS
int i;
prng_rand_128_data_t dummy;
smallprng_srand_r (&x->p0, seed);
@@ -75,7 +75,7 @@ void prng_srand_r (prng_t *x, uint32_t seed)
static force_inline void
store_rand_128_data (void *addr, prng_rand_128_data_t *d, int aligned)
{
-#ifdef GCC_VECTOR_EXTENSIONS_SUPPORTED
+#ifdef HAVE_GCC_VECTOR_EXTENSIONS
if (aligned)
{
*(uint8x16 *)addr = d->vb;
@@ -120,7 +120,7 @@ randmemset_internal (prng_t *prng,
{
prng_rand_128_r (&local_prng, &t);
prng_rand_128_r (&local_prng, &randdata);
-#ifdef GCC_VECTOR_EXTENSIONS_SUPPORTED
+#ifdef HAVE_GCC_VECTOR_EXTENSIONS
if (flags & RANDMEMSET_MORE_FF)
{
const uint8x16 const_C0 =
@@ -199,7 +199,7 @@ randmemset_internal (prng_t *prng,
}
else
{
-#ifdef GCC_VECTOR_EXTENSIONS_SUPPORTED
+#ifdef HAVE_GCC_VECTOR_EXTENSIONS
const uint8x16 bswap_shufflemask =
{
3, 2, 1, 0, 7, 6, 5, 4, 11, 10, 9, 8, 15, 14, 13, 12
diff --git a/test/utils-prng.h b/test/utils-prng.h
index 564ffcef..f9ae8ddf 100644
--- a/test/utils-prng.h
+++ b/test/utils-prng.h
@@ -79,8 +79,7 @@
/*****************************************************************************/
-#if defined(__GNUC__) && (__GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 7))
-#define GCC_VECTOR_EXTENSIONS_SUPPORTED
+#ifdef HAVE_GCC_VECTOR_EXTENSIONS
typedef uint32_t uint32x4 __attribute__ ((vector_size(16)));
typedef uint8_t uint8x16 __attribute__ ((vector_size(16)));
#endif
@@ -92,7 +91,7 @@ typedef struct
typedef struct
{
-#ifdef GCC_VECTOR_EXTENSIONS_SUPPORTED
+#ifdef HAVE_GCC_VECTOR_EXTENSIONS
uint32x4 a, b, c, d;
#else
smallprng_t p1, p2, p3, p4;
@@ -104,7 +103,7 @@ typedef union
{
uint8_t b[16];
uint32_t w[4];
-#ifdef GCC_VECTOR_EXTENSIONS_SUPPORTED
+#ifdef HAVE_GCC_VECTOR_EXTENSIONS
uint8x16 vb;
uint32x4 vw;
#endif
@@ -134,7 +133,7 @@ prng_rand_r (prng_t *x)
static force_inline void
prng_rand_128_r (prng_t *x, prng_rand_128_data_t *data)
{
-#ifdef GCC_VECTOR_EXTENSIONS_SUPPORTED
+#ifdef HAVE_GCC_VECTOR_EXTENSIONS
uint32x4 e = x->a - ((x->b << 27) + (x->b >> (32 - 27)));
x->a = x->b ^ ((x->c << 17) ^ (x->c >> (32 - 17)));
x->b = x->c + x->d;