Commit 3bccee03 by Sebastian Pop Committed by Sebastian Pop

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
parent aedff010
2009-12-07 Sebastian Pop <sebastian.pop@amd.com>
* 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.
2009-12-07 Sebastian Pop <sebastian.pop@amd.com>
* config/i386/i386-protos.h (ix86_expand_fma4_multiple_memory):
Removed.
* config/i386/i386.c (ix86_expand_fma4_multiple_memory): Removed.
......@@ -288,7 +288,7 @@ i[34567]86-*-*)
pmmintrin.h tmmintrin.h ammintrin.h smmintrin.h
nmmintrin.h bmmintrin.h fma4intrin.h wmmintrin.h
immintrin.h x86intrin.h avxintrin.h xopintrin.h
ia32intrin.h cross-stdarg.h lwpintrin.h"
ia32intrin.h cross-stdarg.h lwpintrin.h popcntintrin.h"
;;
x86_64-*-*)
cpu_type=i386
......@@ -298,7 +298,7 @@ x86_64-*-*)
pmmintrin.h tmmintrin.h ammintrin.h smmintrin.h
nmmintrin.h bmmintrin.h fma4intrin.h wmmintrin.h
immintrin.h x86intrin.h avxintrin.h xopintrin.h
ia32intrin.h cross-stdarg.h lwpintrin.h"
ia32intrin.h cross-stdarg.h lwpintrin.h popcntintrin.h"
need_64bit_hwint=yes
;;
ia64-*-*)
......
......@@ -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 */
......@@ -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))
......
/* 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 */
......@@ -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. */
......
......@@ -81,4 +81,8 @@
#include <abmintrin.h>
#endif
#ifdef __POPCNT__
#include <popcntintrin.h>
#endif
#endif /* _X86INTRIN_H_INCLUDED */
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment