Add general_regs_only attribute to MWAIT intrinsics for callers with
general-regs-only target attribute.

gcc/

        PR target/9974
        * config/i386/mwaitintrin.h (_mm_monitor): Add general_regs_only
        attribute.
        (_mm_mwait): Likewise.

gcc/testsuite/

        PR target/9974
        * gcc.target/i386/pr99744-5.c: New test.
---
 gcc/config/i386/mwaitintrin.h             |  6 ++++--
 gcc/testsuite/gcc.target/i386/pr99744-5.c | 25 +++++++++++++++++++++++
 2 files changed, 29 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gcc.target/i386/pr99744-5.c

diff --git a/gcc/config/i386/mwaitintrin.h b/gcc/config/i386/mwaitintrin.h
index 1ecbc4abb69..d5007875914 100644
--- a/gcc/config/i386/mwaitintrin.h
+++ b/gcc/config/i386/mwaitintrin.h
@@ -31,14 +31,16 @@
 #endif /* __MWAIT__ */
 
 extern __inline void
-__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+__attribute__((__gnu_inline__, __always_inline__, __artificial__,
+              __general_regs_only__))
 _mm_monitor (void const * __P, unsigned int __E, unsigned int __H)
 {
   __builtin_ia32_monitor (__P, __E, __H);
 }
 
 extern __inline void
-__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+__attribute__((__gnu_inline__, __always_inline__, __artificial__,
+              __general_regs_only__))
 _mm_mwait (unsigned int __E, unsigned int __H)
 {
   __builtin_ia32_mwait (__E, __H);
diff --git a/gcc/testsuite/gcc.target/i386/pr99744-5.c 
b/gcc/testsuite/gcc.target/i386/pr99744-5.c
new file mode 100644
index 00000000000..9e40e5ef428
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr99744-5.c
@@ -0,0 +1,25 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mmwait" } */
+
+/* Test calling MWAIT intrinsics from functions with general-regs-only
+   target attribute.  */
+
+#include <x86gprintrin.h>
+
+#define _CONCAT(x,y) x ## y
+
+#define test_2(func, type, op1_type, op2_type)                         \
+  __attribute__ ((target("general-regs-only")))                                
\
+  type _CONCAT(do_,func) (op1_type A, op2_type B)                      \
+  { return func (A, B); }
+
+#define test_3(func, type, op1_type, op2_type, op3_type)               \
+  __attribute__ ((target("general-regs-only")))                                
\
+  type _CONCAT(do_,func) (op1_type A, op2_type B, op3_type C)          \
+  { return func (A, B, C); }
+
+#ifndef __iamcu__
+/* mwaitintrin.h */
+test_3 (_mm_monitor, void, void const *, unsigned int, unsigned int)
+test_2 (_mm_mwait, void, unsigned int, unsigned int)
+#endif
-- 
2.30.2

Reply via email to