diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2021-03-23 20:04:58 -0700 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2021-03-30 06:29:18 -0700 |
commit | 5463cee277038df4688b61144db498ae7d24e631 (patch) | |
tree | bdd6bfcfe27bb983c196de3fe704124689aa1f03 | |
parent | 9c68e2abe294a48385224cd7617eca0720144b5c (diff) | |
download | gcc-5463cee277038df4688b61144db498ae7d24e631.zip gcc-5463cee277038df4688b61144db498ae7d24e631.tar.gz gcc-5463cee277038df4688b61144db498ae7d24e631.tar.bz2 |
x86: Define __rdtsc and __rdtscp as macros
Define __rdtsc and __rdtscp as macros for callers with general-regs-only
target attribute to avoid inline failure with always_inline attribute.
gcc/
PR target/99744
* config/i386/ia32intrin.h (__rdtsc): Defined as macro.
(__rdtscp): Likewise.
gcc/testsuite/
PR target/99744
* gcc.target/i386/pr99744-1.c: New test.
-rw-r--r-- | gcc/config/i386/ia32intrin.h | 14 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr99744-1.c | 25 |
2 files changed, 27 insertions, 12 deletions
diff --git a/gcc/config/i386/ia32intrin.h b/gcc/config/i386/ia32intrin.h index d336a51..5913940 100644 --- a/gcc/config/i386/ia32intrin.h +++ b/gcc/config/i386/ia32intrin.h @@ -107,22 +107,12 @@ __rdpmc (int __S) #endif /* __iamcu__ */ /* rdtsc */ -extern __inline unsigned long long -__attribute__((__gnu_inline__, __always_inline__, __artificial__)) -__rdtsc (void) -{ - return __builtin_ia32_rdtsc (); -} +#define __rdtsc() __builtin_ia32_rdtsc () #ifndef __iamcu__ /* rdtscp */ -extern __inline unsigned long long -__attribute__((__gnu_inline__, __always_inline__, __artificial__)) -__rdtscp (unsigned int *__A) -{ - return __builtin_ia32_rdtscp (__A); -} +#define __rdtscp(a) __builtin_ia32_rdtscp (a) #endif /* __iamcu__ */ diff --git a/gcc/testsuite/gcc.target/i386/pr99744-1.c b/gcc/testsuite/gcc.target/i386/pr99744-1.c new file mode 100644 index 0000000..a5a905c --- /dev/null +++ b/gcc/testsuite/gcc.target/i386/pr99744-1.c @@ -0,0 +1,25 @@ +/* { dg-do compile } */ +/* { dg-options "-O0" } */ + +#include <x86intrin.h> + +extern unsigned long long int curr_deadline; +extern void bar (void); + +__attribute__ ((target("general-regs-only"))) +void +foo1 (void) +{ + if (__rdtsc () < curr_deadline) + return; + bar (); +} + +__attribute__ ((target("general-regs-only"))) +void +foo2 (unsigned int *p) +{ + if (__rdtscp (p) < curr_deadline) + return; + bar (); +} |