Skip to content

Commit

Permalink
Allow mmintrin headers to work with function specific target opts.
Browse files Browse the repository at this point in the history
Allow mmintrin headers to work with function specific target opts.  Please
see discussion here:
http://gcc.gnu.org/ml/gcc-patches/2013-04/msg00740.html

	* config/i386/i386.c (ix86_pragma_target_parse):  Restore target
	when current target options does not apply.
	* config/i386/i386-protos.h (ix86_reset_previous_fndecl): New function.
	* config/i386/i386.c (ix86_reset_previous_fndecl): Ditto.
	* config/i386/bmiintrin.h: Pass appropriate target attributes to header.
	* config/i386/mmintrin.h: Ditto.
	* config/i386/nmmintrin.h: Ditto.
	* config/i386/avx2intrin.h: Ditto.
	* config/i386/fxsrintrin.h: Ditto.
	* config/i386/tbmintrin.h: Ditto.
	* config/i386/xsaveintrin.h: Ditto.
	* config/i386/f16cintrin.h: Ditto.
	* config/i386/xtestintrin.h: Ditto.
	* config/i386/xsaveoptintrin.h: Ditto.
	* config/i386/bmi2intrin.h: Ditto.
	* config/i386/lzcntintrin.h: Ditto.
	* config/i386/smmintrin.h: Ditto.
	* config/i386/wmmintrin.h: Ditto.
	* config/i386/x86intrin.h: Remove all header include guards.
	* config/i386/prfchwintrin.h: Ditto.
	* config/i386/pmmintrin.h: Ditto.
	* config/i386/tmmintrin.h: Ditto.
	* config/i386/xmmintrin.h: Ditto.
	* config/i386/popcntintrin.h: Ditto.
	* config/i386/rdseedintrin.h: Ditto.
	* config/i386/ammintrin.h: Ditto.
	* config/i386/emmintrin.h: Ditto.
	* config/i386/immintrin.h: Remove all header include guards.
	* config/i386/fma4intrin.h: Ditto.
	* config/i386/lwpintrin.h: Ditto.
	* config/i386/xopintrin.h: Ditto.
	* config/i386/ia32intrin.h: Ditto.
	* config/i386/avxintrin.h: Ditto.
	* config/i386/rtmintrin.h: Ditto.
	* config/i386/fmaintrin.h: Ditto.
	* config/i386/mm3dnow.h: Ditto.

	* testsuite/gcc.target/i386/intrinsics_1.c: New test.
	* testsuite/gcc.target/i386/intrinsics_2.c: Ditto.
	* testsuite/gcc.target/i386/intrinsics_3.c: Ditto.
	* testsuite/gcc.target/i386/intrinsics_4.c: Ditto.
	* testsuite/gcc.target/i386/intrinsics_5.c: Ditto.
	* testsuite/gcc.target/i386/intrinsics_6.c: Ditto.
	* testsuite/gcc.target/i386/avx-1.c: Provide macros for builtins
	needing immediate arguments in f16cintrin.h and rtmintrin.h.

From-SVN: r200349
  • Loading branch information
tmsri authored and Sriraman Tallam committed Jun 23, 2013
1 parent 604b2bf commit 97db2bf
Show file tree
Hide file tree
Showing 44 changed files with 579 additions and 206 deletions.
39 changes: 39 additions & 0 deletions gcc/ChangeLog
@@ -1,3 +1,42 @@
2013-06-23 Sriraman Tallam <tmsriram@google.com>

* config/i386/i386.c (ix86_pragma_target_parse): Restore target
when current target options does not apply.
* config/i386/i386-protos.h (ix86_reset_previous_fndecl): New function.
* config/i386/i386.c (ix86_reset_previous_fndecl): Ditto.
* config/i386/bmiintrin.h: Pass appropriate target attributes to header.
* config/i386/mmintrin.h: Ditto.
* config/i386/nmmintrin.h: Ditto.
* config/i386/avx2intrin.h: Ditto.
* config/i386/fxsrintrin.h: Ditto.
* config/i386/tbmintrin.h: Ditto.
* config/i386/xsaveintrin.h: Ditto.
* config/i386/f16cintrin.h: Ditto.
* config/i386/xtestintrin.h: Ditto.
* config/i386/xsaveoptintrin.h: Ditto.
* config/i386/bmi2intrin.h: Ditto.
* config/i386/lzcntintrin.h: Ditto.
* config/i386/smmintrin.h: Ditto.
* config/i386/wmmintrin.h: Ditto.
* config/i386/x86intrin.h: Remove all header include guards.
* config/i386/prfchwintrin.h: Ditto.
* config/i386/pmmintrin.h: Ditto.
* config/i386/tmmintrin.h: Ditto.
* config/i386/xmmintrin.h: Ditto.
* config/i386/popcntintrin.h: Ditto.
* config/i386/rdseedintrin.h: Ditto.
* config/i386/ammintrin.h: Ditto.
* config/i386/emmintrin.h: Ditto.
* config/i386/immintrin.h: Remove all header include guards.
* config/i386/fma4intrin.h: Ditto.
* config/i386/lwpintrin.h: Ditto.
* config/i386/xopintrin.h: Ditto.
* config/i386/ia32intrin.h: Ditto.
* config/i386/avxintrin.h: Ditto.
* config/i386/rtmintrin.h: Ditto.
* config/i386/fmaintrin.h: Ditto.
* config/i386/mm3dnow.h: Ditto.

2013-06-22 Sriraman Tallam <tmsriram@google.com>

* common/config/i386/i386-common.c: Handle LZCNT.
Expand Down
15 changes: 10 additions & 5 deletions gcc/config/i386/ammintrin.h
Expand Up @@ -27,13 +27,15 @@
#ifndef _AMMINTRIN_H_INCLUDED
#define _AMMINTRIN_H_INCLUDED

#ifndef __SSE4A__
# error "SSE4A instruction set not enabled"
#else

/* We need definitions from the SSE3, SSE2 and SSE header files*/
#include <pmmintrin.h>

#ifndef __SSE4A__
#pragma GCC push_options
#pragma GCC target("sse4a")
#define __DISABLE_SSE4A__
#endif /* __SSE4A__ */

extern __inline void __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm_stream_sd (double * __P, __m128d __Y)
{
Expand Down Expand Up @@ -83,6 +85,9 @@ _mm_inserti_si64(__m128i __X, __m128i __Y, unsigned const int __I, unsigned cons
(unsigned int)(I), (unsigned int)(L)))
#endif

#endif /* __SSE4A__ */
#ifdef __DISABLE_SSE4A__
#undef __DISABLE_SSE4A__
#pragma GCC pop_options
#endif /* __DISABLE_SSE4A__ */

#endif /* _AMMINTRIN_H_INCLUDED */
16 changes: 16 additions & 0 deletions gcc/config/i386/avx2intrin.h
Expand Up @@ -25,6 +25,15 @@
# error "Never use <avx2intrin.h> directly; include <immintrin.h> instead."
#endif

#ifndef _AVX2INTRIN_H_INCLUDED
#define _AVX2INTRIN_H_INCLUDED

#ifndef __AVX2__
#pragma GCC push_options
#pragma GCC target("avx2")
#define __DISABLE_AVX2__
#endif /* __AVX2__ */

/* Sum absolute 8-bit integer difference of adjacent groups of 4
byte integers in the first 2 operands. Starting offsets within
operands are determined by the 3rd mask operand. */
Expand Down Expand Up @@ -1871,3 +1880,10 @@ _mm256_mask_i64gather_epi32 (__m128i src, int const *base,
(__v4si)(__m128i)MASK, \
(int)SCALE)
#endif /* __OPTIMIZE__ */

#ifdef __DISABLE_AVX2__
#undef __DISABLE_AVX2__
#pragma GCC pop_options
#endif /* __DISABLE_AVX2__ */

#endif /* _AVX2INTRIN_H_INCLUDED */
16 changes: 16 additions & 0 deletions gcc/config/i386/avxintrin.h
Expand Up @@ -28,6 +28,15 @@
# error "Never use <avxintrin.h> directly; include <immintrin.h> instead."
#endif

#ifndef _AVXINTRIN_H_INCLUDED
#define _AVXINTRIN_H_INCLUDED

#ifndef __AVX__
#pragma GCC push_options
#pragma GCC target("avx")
#define __DISABLE_AVX__
#endif /* __AVX__ */

/* Internal data types for implementing the intrinsics. */
typedef double __v4df __attribute__ ((__vector_size__ (32)));
typedef float __v8sf __attribute__ ((__vector_size__ (32)));
Expand Down Expand Up @@ -1424,3 +1433,10 @@ _mm256_castsi128_si256 (__m128i __A)
{
return (__m256i) __builtin_ia32_si256_si ((__v4si)__A);
}

#ifdef __DISABLE_AVX__
#undef __DISABLE_AVX__
#pragma GCC pop_options
#endif /* __DISABLE_AVX__ */

#endif /* _AVXINTRIN_H_INCLUDED */
15 changes: 11 additions & 4 deletions gcc/config/i386/bmi2intrin.h
Expand Up @@ -25,13 +25,15 @@
# error "Never use <bmi2intrin.h> directly; include <x86intrin.h> instead."
#endif

#ifndef __BMI2__
# error "BMI2 instruction set not enabled"
#endif /* __BMI2__ */

#ifndef _BMI2INTRIN_H_INCLUDED
#define _BMI2INTRIN_H_INCLUDED

#ifndef __BMI2__
#pragma GCC push_options
#pragma GCC target("bmi2")
#define __DISABLE_BMI2__
#endif /* __BMI2__ */

extern __inline unsigned int
__attribute__((__gnu_inline__, __always_inline__, __artificial__))
_bzhi_u32 (unsigned int __X, unsigned int __Y)
Expand Down Expand Up @@ -99,4 +101,9 @@ _mulx_u32 (unsigned int __X, unsigned int __Y, unsigned int *__P)

#endif /* !__x86_64__ */

#ifdef __DISABLE_BMI2__
#undef __DISABLE_BMI2__
#pragma GCC pop_options
#endif /* __DISABLE_BMI2__ */

#endif /* _BMI2INTRIN_H_INCLUDED */
15 changes: 11 additions & 4 deletions gcc/config/i386/bmiintrin.h
Expand Up @@ -25,13 +25,15 @@
# error "Never use <bmiintrin.h> directly; include <x86intrin.h> instead."
#endif

#ifndef __BMI__
# error "BMI instruction set not enabled"
#endif /* __BMI__ */

#ifndef _BMIINTRIN_H_INCLUDED
#define _BMIINTRIN_H_INCLUDED

#ifndef __BMI__
#pragma GCC push_options
#pragma GCC target("bmi")
#define __DISABLE_BMI__
#endif /* __BMI__ */

extern __inline unsigned short __attribute__((__gnu_inline__, __always_inline__, __artificial__))
__tzcnt_u16 (unsigned short __X)
{
Expand Down Expand Up @@ -116,4 +118,9 @@ __tzcnt_u64 (unsigned long long __X)

#endif /* __x86_64__ */

#ifdef __DISABLE_BMI__
#undef __DISABLE_BMI__
#pragma GCC pop_options
#endif /* __DISABLE_BMI__ */

#endif /* _BMIINTRIN_H_INCLUDED */
15 changes: 10 additions & 5 deletions gcc/config/i386/emmintrin.h
Expand Up @@ -27,13 +27,15 @@
#ifndef _EMMINTRIN_H_INCLUDED
#define _EMMINTRIN_H_INCLUDED

#ifndef __SSE2__
# error "SSE2 instruction set not enabled"
#else

/* We need definitions from the SSE header files*/
#include <xmmintrin.h>

#ifndef __SSE2__
#pragma GCC push_options
#pragma GCC target("sse2")
#define __DISABLE_SSE2__
#endif /* __SSE2__ */

/* SSE2 */
typedef double __v2df __attribute__ ((__vector_size__ (16)));
typedef long long __v2di __attribute__ ((__vector_size__ (16)));
Expand Down Expand Up @@ -1515,6 +1517,9 @@ _mm_castsi128_pd(__m128i __A)
return (__m128d) __A;
}

#endif /* __SSE2__ */
#ifdef __DISABLE_SSE2__
#undef __DISABLE_SSE2__
#pragma GCC pop_options
#endif /* __DISABLE_SSE2__ */

#endif /* _EMMINTRIN_H_INCLUDED */
16 changes: 11 additions & 5 deletions gcc/config/i386/f16cintrin.h
Expand Up @@ -25,13 +25,15 @@
# error "Never use <f16intrin.h> directly; include <x86intrin.h> or <immintrin.h> instead."
#endif

#ifndef __F16C__
# error "F16C instruction set not enabled"
#else

#ifndef _F16CINTRIN_H_INCLUDED
#define _F16CINTRIN_H_INCLUDED

#ifndef __F16C__
#pragma GCC push_options
#pragma GCC target("f16c")
#define __DISABLE_F16C__
#endif /* __F16C__ */

extern __inline float __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_cvtsh_ss (unsigned short __S)
{
Expand Down Expand Up @@ -88,5 +90,9 @@ _mm256_cvtps_ph (__m256 __A, const int __I)
((__m128i) __builtin_ia32_vcvtps2ph256 ((__v8sf)(__m256) A, (int) (I)))
#endif /* __OPTIMIZE */

#ifdef __DISABLE_F16C__
#undef __DISABLE_F16C__
#pragma GCC pop_options
#endif /* __DISABLE_F16C__ */

#endif /* _F16CINTRIN_H_INCLUDED */
#endif /* __F16C__ */
15 changes: 10 additions & 5 deletions gcc/config/i386/fma4intrin.h
Expand Up @@ -28,13 +28,15 @@
#ifndef _FMA4INTRIN_H_INCLUDED
#define _FMA4INTRIN_H_INCLUDED

#ifndef __FMA4__
# error "FMA4 instruction set not enabled"
#else

/* We need definitions from the SSE4A, SSE3, SSE2 and SSE header files. */
#include <ammintrin.h>

#ifndef __FMA4__
#pragma GCC push_options
#pragma GCC target("fma4")
#define __DISABLE_FMA4__
#endif /* __FMA4__ */

/* 128b Floating point multiply/add type instructions. */
extern __inline __m128 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
_mm_macc_ps (__m128 __A, __m128 __B, __m128 __C)
Expand Down Expand Up @@ -231,6 +233,9 @@ _mm256_msubadd_pd (__m256d __A, __m256d __B, __m256d __C)
return (__m256d) __builtin_ia32_vfmaddsubpd256 ((__v4df)__A, (__v4df)__B, -(__v4df)__C);
}

#endif
#ifdef __DISABLE_FMA4__
#undef __DISABLE_FMA4__
#pragma GCC pop_options
#endif /* __DISABLE_FMA4__ */

#endif
11 changes: 8 additions & 3 deletions gcc/config/i386/fmaintrin.h
Expand Up @@ -29,8 +29,10 @@
#define _FMAINTRIN_H_INCLUDED

#ifndef __FMA__
# error "FMA instruction set not enabled"
#else
#pragma GCC push_options
#pragma GCC target("fma")
#define __DISABLE_FMA__
#endif /* __FMA__ */

extern __inline __m128d
__attribute__((__gnu_inline__, __always_inline__, __artificial__))
Expand Down Expand Up @@ -292,6 +294,9 @@ _mm256_fmsubadd_ps (__m256 __A, __m256 __B, __m256 __C)
-(__v8sf)__C);
}

#endif
#ifdef __DISABLE_FMA__
#undef __DISABLE_FMA__
#pragma GCC pop_options
#endif /* __DISABLE_FMA__ */

#endif
12 changes: 12 additions & 0 deletions gcc/config/i386/fxsrintrin.h
Expand Up @@ -28,6 +28,12 @@
#ifndef _FXSRINTRIN_H_INCLUDED
#define _FXSRINTRIN_H_INCLUDED

#ifndef __FXSR__
#pragma GCC push_options
#pragma GCC target("fxsr")
#define __DISABLE_FXSR__
#endif /* __FXSR__ */

extern __inline void
__attribute__((__gnu_inline__, __always_inline__, __artificial__))
_fxsave (void *__P)
Expand Down Expand Up @@ -58,4 +64,10 @@ _fxrstor64 (void *__P)
}
#endif

#ifdef __DISABLE_FXSR__
#undef __DISABLE_FXSR__
#pragma GCC pop_options
#endif /* __DISABLE_FXSR__ */


#endif /* _FXSRINTRIN_H_INCLUDED */
13 changes: 8 additions & 5 deletions gcc/config/i386/i386-c.c
Expand Up @@ -376,20 +376,23 @@ ix86_pragma_target_parse (tree args, tree pop_target)

if (! args)
{
cur_tree = ((pop_target)
? pop_target
: target_option_default_node);
cur_tree = (pop_target ? pop_target : target_option_default_node);
cl_target_option_restore (&global_options,
TREE_TARGET_OPTION (cur_tree));
}
else
{
cur_tree = ix86_valid_target_attribute_tree (args);
if (!cur_tree)
return false;
if (!cur_tree || cur_tree == error_mark_node)
{
cl_target_option_restore (&global_options,
TREE_TARGET_OPTION (prev_tree));
return false;
}
}

target_option_current_node = cur_tree;
ix86_reset_previous_fndecl ();

/* Figure out the previous/current isa, arch, tune and the differences. */
prev_opt = TREE_TARGET_OPTION (prev_tree);
Expand Down
2 changes: 2 additions & 0 deletions gcc/config/i386/i386-protos.h
Expand Up @@ -40,6 +40,8 @@ extern void ix86_output_addr_diff_elt (FILE *, int, int);
extern enum calling_abi ix86_cfun_abi (void);
extern enum calling_abi ix86_function_type_abi (const_tree);

extern void ix86_reset_previous_fndecl (void);

#ifdef RTX_CODE
extern int standard_80387_constant_p (rtx);
extern const char *standard_80387_constant_opcode (rtx);
Expand Down
7 changes: 7 additions & 0 deletions gcc/config/i386/i386.c
Expand Up @@ -4649,6 +4649,13 @@ ix86_can_inline_p (tree caller, tree callee)
/* Remember the last target of ix86_set_current_function. */
static GTY(()) tree ix86_previous_fndecl;

/* Invalidate ix86_previous_fndecl cache. */
void
ix86_reset_previous_fndecl (void)
{
ix86_previous_fndecl = NULL_TREE;
}

/* Establish appropriate back-end context for processing the function
FNDECL. The argument might be NULL to indicate processing at top
level, outside of any function scope. */
Expand Down

0 comments on commit 97db2bf

Please sign in to comment.