aboutsummaryrefslogtreecommitdiff
path: root/gcc/config/i386
diff options
context:
space:
mode:
authorSebastian Pop <sebastian.pop@amd.com>2009-12-07 22:22:54 +0000
committerSebastian Pop <spop@gcc.gnu.org>2009-12-07 22:22:54 +0000
commit3bccee0302bf9d27d0fc09dc7efd24ea8c57535f (patch)
tree1c3bfabf43511e55a0a81aadfbb3cc05c1584835 /gcc/config/i386
parentaedff010f0b3fef486319a887b71bc625a4a2b78 (diff)
downloadgcc-3bccee0302bf9d27d0fc09dc7efd24ea8c57535f.zip
gcc-3bccee0302bf9d27d0fc09dc7efd24ea8c57535f.tar.gz
gcc-3bccee0302bf9d27d0fc09dc7efd24ea8c57535f.tar.bz2
Fix _mm_popcnt* intrinsics.
* config.gcc (i[34567]86-*-*, x86_64-*-*): Add popcntintrin.h. * config/i386/abmintrin.h (_mm_popcnt_u32, _mm_popcnt_u64): Moved... * config/i386/i386-c.c (__POPCNT__): Defined. * config/i386/popcntintrin.h: ...here. New file. * config/i386/smmintrin.h (_mm_popcnt_u32, _mm_popcnt_u64): Moved... Include popcntintrin.h. * config/i386/x86intrin.h: Include popcntintrin.h when __POPCNT__ is defined. From-SVN: r155058
Diffstat (limited to 'gcc/config/i386')
-rw-r--r--gcc/config/i386/abmintrin.h15
-rw-r--r--gcc/config/i386/i386-c.c2
-rw-r--r--gcc/config/i386/popcntintrin.h46
-rw-r--r--gcc/config/i386/smmintrin.h15
-rw-r--r--gcc/config/i386/x86intrin.h4
5 files changed, 54 insertions, 28 deletions
diff --git a/gcc/config/i386/abmintrin.h b/gcc/config/i386/abmintrin.h
index b85bdb7..9d87f57 100644
--- a/gcc/config/i386/abmintrin.h
+++ b/gcc/config/i386/abmintrin.h
@@ -52,19 +52,4 @@ __lzcnt64 (unsigned long __X)
}
#endif
-/* Calculate a number of bits set to 1. */
-extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
-_mm_popcnt_u32 (unsigned int __X)
-{
- return __builtin_popcount (__X);
-}
-
-#ifdef __x86_64__
-extern __inline long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
-_mm_popcnt_u64 (unsigned long long __X)
-{
- return __builtin_popcountll (__X);
-}
-#endif
-
#endif /* _ABMINTRIN_H_INCLUDED */
diff --git a/gcc/config/i386/i386-c.c b/gcc/config/i386/i386-c.c
index cba9ceb..35eab49 100644
--- a/gcc/config/i386/i386-c.c
+++ b/gcc/config/i386/i386-c.c
@@ -238,6 +238,8 @@ ix86_target_macros_internal (int isa_flag,
def_or_undef (parse_in, "__LWP__");
if (isa_flag & OPTION_MASK_ISA_ABM)
def_or_undef (parse_in, "__ABM__");
+ if (isa_flag & OPTION_MASK_ISA_POPCNT)
+ def_or_undef (parse_in, "__POPCNT__");
if ((fpmath & FPMATH_SSE) && (isa_flag & OPTION_MASK_ISA_SSE))
def_or_undef (parse_in, "__SSE_MATH__");
if ((fpmath & FPMATH_SSE) && (isa_flag & OPTION_MASK_ISA_SSE2))
diff --git a/gcc/config/i386/popcntintrin.h b/gcc/config/i386/popcntintrin.h
new file mode 100644
index 0000000..8d4d657
--- /dev/null
+++ b/gcc/config/i386/popcntintrin.h
@@ -0,0 +1,46 @@
+/* Copyright (C) 2009 Free Software Foundation, Inc.
+
+ This file is part of GCC.
+
+ GCC is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 3, or (at your option)
+ any later version.
+
+ GCC is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ Under Section 7 of GPL version 3, you are granted additional
+ permissions described in the GCC Runtime Library Exception, version
+ 3.1, as published by the Free Software Foundation.
+
+ You should have received a copy of the GNU General Public License and
+ a copy of the GCC Runtime Library Exception along with this program;
+ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
+ <http://www.gnu.org/licenses/>. */
+
+#ifndef __POPCNT__
+# error "POPCNT instruction set not enabled"
+#endif /* __POPCNT__ */
+
+#ifndef _POPCNTINTRIN_H_INCLUDED
+#define _POPCNTINTRIN_H_INCLUDED
+
+/* Calculate a number of bits set to 1. */
+extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_mm_popcnt_u32 (unsigned int __X)
+{
+ return __builtin_popcount (__X);
+}
+
+#ifdef __x86_64__
+extern __inline long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_mm_popcnt_u64 (unsigned long long __X)
+{
+ return __builtin_popcountll (__X);
+}
+#endif
+
+#endif /* _POPCNTINTRIN_H_INCLUDED */
diff --git a/gcc/config/i386/smmintrin.h b/gcc/config/i386/smmintrin.h
index 8fbb35c..170fae5 100644
--- a/gcc/config/i386/smmintrin.h
+++ b/gcc/config/i386/smmintrin.h
@@ -793,19 +793,8 @@ _mm_cmpgt_epi64 (__m128i __X, __m128i __Y)
return (__m128i) __builtin_ia32_pcmpgtq ((__v2di)__X, (__v2di)__Y);
}
-/* Calculate a number of bits set to 1. */
-extern __inline int __attribute__((__gnu_inline__, __always_inline__, __artificial__))
-_mm_popcnt_u32 (unsigned int __X)
-{
- return __builtin_popcount (__X);
-}
-
-#ifdef __x86_64__
-extern __inline long long __attribute__((__gnu_inline__, __always_inline__, __artificial__))
-_mm_popcnt_u64 (unsigned long long __X)
-{
- return __builtin_popcountll (__X);
-}
+#ifdef __POPCNT__
+#include <popcntintrin.h>
#endif
/* Accumulate CRC32 (polynomial 0x11EDC6F41) value. */
diff --git a/gcc/config/i386/x86intrin.h b/gcc/config/i386/x86intrin.h
index 63252bf..29d44dc 100644
--- a/gcc/config/i386/x86intrin.h
+++ b/gcc/config/i386/x86intrin.h
@@ -81,4 +81,8 @@
#include <abmintrin.h>
#endif
+#ifdef __POPCNT__
+#include <popcntintrin.h>
+#endif
+
#endif /* _X86INTRIN_H_INCLUDED */