diff options
author | Sebastian Pop <sebastian.pop@amd.com> | 2009-12-07 22:22:54 +0000 |
---|---|---|
committer | Sebastian Pop <spop@gcc.gnu.org> | 2009-12-07 22:22:54 +0000 |
commit | 3bccee0302bf9d27d0fc09dc7efd24ea8c57535f (patch) | |
tree | 1c3bfabf43511e55a0a81aadfbb3cc05c1584835 /gcc/config/i386 | |
parent | aedff010f0b3fef486319a887b71bc625a4a2b78 (diff) | |
download | gcc-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.h | 15 | ||||
-rw-r--r-- | gcc/config/i386/i386-c.c | 2 | ||||
-rw-r--r-- | gcc/config/i386/popcntintrin.h | 46 | ||||
-rw-r--r-- | gcc/config/i386/smmintrin.h | 15 | ||||
-rw-r--r-- | gcc/config/i386/x86intrin.h | 4 |
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 */ |