aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2021-03-23 20:04:58 -0700
committerH.J. Lu <hjl.tools@gmail.com>2021-03-30 06:29:18 -0700
commit5463cee277038df4688b61144db498ae7d24e631 (patch)
treebdd6bfcfe27bb983c196de3fe704124689aa1f03
parent9c68e2abe294a48385224cd7617eca0720144b5c (diff)
downloadgcc-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.h14
-rw-r--r--gcc/testsuite/gcc.target/i386/pr99744-1.c25
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 ();
+}