Hi all,

One more new ISA has just published this week. Here is the documentation
for USER_DOITM and SUP_DOITM:

https://www.intel.com.br/content/www/br/pt/content-details/932747/user-doitm-and-sup-doitm-extensions-architecture-specification.html

It will include three new instructions. The two CPUIDs share the same
instructions, but under different mode. For supervisor mode, we will
not provide intrins previously. So we will provide intrins under user
mode, i.e., USER_DOITM.

Reg-tested on x86_64-pc-linux-gnu {-m32,}.

Thx,
Haochen

---

For those supervisor mode CPUIDs, we will not provide
intrins previously. Thus, we will only provide intrins
under CPUID USER_DOITM b/c SUP_DOITM is used under
supervisor mode although they shared the same instructions
with USER_DOITM.

gcc/ChangeLog:

        * common/config/i386/cpuinfo.h
        (get_available_features): Add USER_DOITM.
        * common/config/i386/i386-common.cc
        (OPTION_MASK_ISA2_USER_DOITM_SET): New.
        (OPTION_MASK_ISA2_USER_DOITM_UNSET): New.
        (ix86_handle_option): Handle userdoitm.
        * common/config/i386/i386-cpuinfo.h
        (enum processor_features): Add FEATURE_USER_DOITM.
        * common/config/i386/i386-isas.h: Ditto.
        * config.gcc: Include userdoitmintrin.h.
        * config/i386/cpuid.h (bit_USER_DOITM): New.
        * config/i386/i386-builtin.def
        (BDESC): Handle USER_DOITM builtins.
        * config/i386/i386-c.cc
        (ix86_target_macros_internal): Handle USER_DOITM.
        * config/i386/i386-isa.def (USER_DOITM): New.
        * config/i386/i386-options.cc (isa2_opts): Handle muserdoitm.
        (ix86_valid_target_attribute_inner_p): Ditto.
        * config/i386/i386.md (UNSPECV_RDDOITM): New.
        (UNSPECV_WRDOITM): Ditto.
        (UNSPECV_SETDOITM): Ditto.
        (rddoitm<mode>): Ditto.
        (wrdoitm<mode>): Ditto.
        (setdoitm<mode>): Ditto.
        * config/i386/i386.opt: Add USER_DOITM.
        * config/i386/i386.opt.urls: Ditto.
        * config/i386/x86gprintrin.h: Include userdoitmintrin.h.
        * doc/extend.texi: Add userdoitm documentation.
        * doc/invoke.texi: Ditto.
        * doc/sourcebuild.texi: Ditto.
        * config/i386/userdoitmintrin.h: New file.

gcc/testsuite/ChangeLog:

        * gcc.target/i386/funcspec-56.inc: Add userdoitm test.
        * gcc.target/i386/x86gprintrin-1.c: Ditto.
        * gcc.target/i386/x86gprintrin-2.c: Ditto.
        * gcc.target/i386/x86gprintrin-3.c: Ditto.
        * gcc.target/i386/x86gprintrin-4.c: Ditto.
        * gcc.target/i386/x86gprintrin-5.c: Ditto.
        * gcc.target/i386/userdoitm-1.c: New test.
---
 gcc/common/config/i386/cpuinfo.h              |  2 +
 gcc/common/config/i386/i386-common.cc         | 15 ++++
 gcc/common/config/i386/i386-cpuinfo.h         |  1 +
 gcc/common/config/i386/i386-isas.h            |  1 +
 gcc/config.gcc                                |  2 +-
 gcc/config/i386/cpuid.h                       |  1 +
 gcc/config/i386/i386-builtin.def              |  7 ++
 gcc/config/i386/i386-c.cc                     |  2 +
 gcc/config/i386/i386-isa.def                  |  1 +
 gcc/config/i386/i386-options.cc               |  4 +-
 gcc/config/i386/i386.md                       | 31 ++++++++
 gcc/config/i386/i386.opt                      |  4 +
 gcc/config/i386/i386.opt.urls                 |  3 +
 gcc/config/i386/userdoitmintrin.h             | 79 +++++++++++++++++++
 gcc/config/i386/x86gprintrin.h                |  2 +
 gcc/doc/extend.texi                           |  5 ++
 gcc/doc/invoke.texi                           |  6 ++
 gcc/doc/sourcebuild.texi                      |  3 +
 gcc/testsuite/gcc.target/i386/funcspec-56.inc |  2 +
 gcc/testsuite/gcc.target/i386/userdoitm-1.c   | 24 ++++++
 .../gcc.target/i386/x86gprintrin-1.c          |  2 +-
 .../gcc.target/i386/x86gprintrin-2.c          |  2 +-
 .../gcc.target/i386/x86gprintrin-3.c          |  2 +-
 .../gcc.target/i386/x86gprintrin-4.c          |  4 +-
 .../gcc.target/i386/x86gprintrin-5.c          |  4 +-
 25 files changed, 200 insertions(+), 9 deletions(-)
 create mode 100644 gcc/config/i386/userdoitmintrin.h
 create mode 100644 gcc/testsuite/gcc.target/i386/userdoitm-1.c

diff --git a/gcc/common/config/i386/cpuinfo.h b/gcc/common/config/i386/cpuinfo.h
index e0aae0b5aac..74e8734b166 100644
--- a/gcc/common/config/i386/cpuinfo.h
+++ b/gcc/common/config/i386/cpuinfo.h
@@ -1055,6 +1055,8 @@ get_available_features (struct __processor_model 
*cpu_model,
            set_feature (FEATURE_USER_MSR);
          if (eax & bit_MOVRS)
            set_feature (FEATURE_MOVRS);
+         if (ecx & bit_USER_DOITM)
+           set_feature (FEATURE_USER_DOITM);
          if (avx_usable)
            {
              if (eax & bit_AVXVNNI)
diff --git a/gcc/common/config/i386/i386-common.cc 
b/gcc/common/config/i386/i386-common.cc
index 8c93e357a04..edff6da8dc0 100644
--- a/gcc/common/config/i386/i386-common.cc
+++ b/gcc/common/config/i386/i386-common.cc
@@ -162,6 +162,7 @@ along with GCC; see the file COPYING3.  If not see
   (OPTION_MASK_ISA2_ACEV1_SET | OPTION_MASK_ISA2_ACEOPFP64)
 #define OPTION_MASK_ISA2_AVX10VPMLDSABFLYDQ_SET \
   (OPTION_MASK_ISA2_AVX10_1_SET | OPTION_MASK_ISA2_AVX10VPMLDSABFLYDQ)
+#define OPTION_MASK_ISA2_USER_DOITM_SET OPTION_MASK_ISA2_USER_DOITM
 
 /* SSE4 includes both SSE4.1 and SSE4.2. -msse4 should be the same
    as -msse4.2.  */
@@ -379,6 +380,7 @@ along with GCC; see the file COPYING3.  If not see
 #define OPTION_MASK_ISA2_ACEOPFP64_UNSET OPTION_MASK_ISA2_ACEOPFP64
 #define OPTION_MASK_ISA2_AVX10VPMLDSABFLYDQ_UNSET \
   OPTION_MASK_ISA2_AVX10VPMLDSABFLYDQ
+#define OPTION_MASK_ISA2_USER_DOITM_UNSET OPTION_MASK_ISA2_USER_DOITM
 
 /* SSE4 includes both SSE4.1 and SSE4.2.  -mno-sse4 should the same
    as -mno-sse4.1. */
@@ -1674,6 +1676,19 @@ ix86_handle_option (struct gcc_options *opts,
        }
       return true;
 
+    case OPT_muserdoitm:
+      if (value)
+       {
+         opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA2_USER_DOITM_SET;
+         opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_USER_DOITM_SET;
+       }
+      else
+       {
+         opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_USER_DOITM_UNSET;
+         opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_USER_DOITM_UNSET;
+       }
+      return true;
+
     case OPT_mfma:
       if (value)
        {
diff --git a/gcc/common/config/i386/i386-cpuinfo.h 
b/gcc/common/config/i386/i386-cpuinfo.h
index 431ebc060fa..fbc6b092e44 100644
--- a/gcc/common/config/i386/i386-cpuinfo.h
+++ b/gcc/common/config/i386/i386-cpuinfo.h
@@ -296,6 +296,7 @@ enum processor_features
   FEATURE_ACEOPFP32,
   FEATURE_ACEOPFP64,
   FEATURE_AVX10VPMLDSABFLYDQ,
+  FEATURE_USER_DOITM,
   CPU_FEATURE_MAX
 };
 
diff --git a/gcc/common/config/i386/i386-isas.h 
b/gcc/common/config/i386/i386-isas.h
index 127f81d4223..4f1511d64bf 100644
--- a/gcc/common/config/i386/i386-isas.h
+++ b/gcc/common/config/i386/i386-isas.h
@@ -204,4 +204,5 @@ ISA_NAMES_TABLE_START
   ISA_NAMES_TABLE_ENTRY("aceopfp64", FEATURE_ACEOPFP64, P_NONE, "-maceopfp64")
   ISA_NAMES_TABLE_ENTRY("avx10vpmldsabflydq", FEATURE_AVX10VPMLDSABFLYDQ,
                        P_NONE, "-mavx10vpmldsabflydq")
+  ISA_NAMES_TABLE_ENTRY("userdoitm", FEATURE_USER_DOITM, P_NONE, "-muserdoitm")
 ISA_NAMES_TABLE_END
diff --git a/gcc/config.gcc b/gcc/config.gcc
index cf3d99f2e5a..ab0b514098d 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -493,7 +493,7 @@ i[34567]86-*-* | x86_64-*-*)
                       avx10_3int4fp4intrin.h avx10_3cvtbf16intrin.h
                       avx10_3vpinterleaveintrin.h acev2intrin.h
                       aceopfp16intrin.h aceopfp32intrin.h aceopfp64intrin.h
-                      avx10vpmldsabflydqintrin.h"
+                      avx10vpmldsabflydqintrin.h userdoitmintrin.h"
        ;;
 ia64-*-*)
        extra_headers=ia64intrin.h
diff --git a/gcc/config/i386/cpuid.h b/gcc/config/i386/cpuid.h
index 81547b4bc71..74f72812105 100644
--- a/gcc/config/i386/cpuid.h
+++ b/gcc/config/i386/cpuid.h
@@ -147,6 +147,7 @@
 
 /* %ecx */
 #define bit_AVX10VPMLDSABFLYDQ (1 << 7)
+#define bit_USER_DOITM (1 << 10)
 #define bit_ACE                (1 << 11)
 
 /* %edx */
diff --git a/gcc/config/i386/i386-builtin.def b/gcc/config/i386/i386-builtin.def
index 802ebf30a0d..7e291d31737 100644
--- a/gcc/config/i386/i386-builtin.def
+++ b/gcc/config/i386/i386-builtin.def
@@ -528,6 +528,13 @@ BDESC (0, OPTION_MASK_ISA2_AVX10V2AUX, 
CODE_FOR_avx10v2aux_sym_truncatev4siv4qi2
 BDESC (0, OPTION_MASK_ISA2_AVX10V2AUX, 
CODE_FOR_avx10v2aux_sym_truncatev8siv8qi2_mask_store_2, 
"__builtin_ia32_vpmovssdb256mem_mask", IX86_BUILTIN_VPMOVSSDB256_MEM, UNKNOWN, 
(int) VOID_FTYPE_PUDI_V8SI_UQI)
 BDESC (0, OPTION_MASK_ISA2_AVX10V2AUX, 
CODE_FOR_avx10v2aux_sym_truncatev16siv16qi2_mask_store, 
"__builtin_ia32_vpmovssdb512mem_mask", IX86_BUILTIN_VPMOVSSDB512_MEM, UNKNOWN, 
(int) VOID_FTYPE_PV16QI_V16SI_UHI)
 
+/* USER_DOITM */
+BDESC (0, OPTION_MASK_ISA2_USER_DOITM, CODE_FOR_rddoitmsi, 
"__builtin_ia32_rddoitm32", IX86_BUILTIN_RDDOITM32, UNKNOWN, (int) 
UNSIGNED_FTYPE_VOID)
+BDESC (0, OPTION_MASK_ISA2_USER_DOITM, CODE_FOR_wrdoitmsi, 
"__builtin_ia32_wrdoitm32", IX86_BUILTIN_WRDOITM32, UNKNOWN, (int) 
VOID_FTYPE_UNSIGNED)
+BDESC (0, OPTION_MASK_ISA2_USER_DOITM, CODE_FOR_setdoitm, 
"__builtin_ia32_setdoitm", IX86_BUILTIN_SETDOITM, UNKNOWN, (int) 
VOID_FTYPE_VOID)
+BDESC (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_USER_DOITM, CODE_FOR_rddoitmdi, 
"__builtin_ia32_rddoitm64", IX86_BUILTIN_RDDOITM64, UNKNOWN, (int) 
UINT64_FTYPE_VOID)
+BDESC (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_USER_DOITM, CODE_FOR_wrdoitmdi, 
"__builtin_ia32_wrdoitm64", IX86_BUILTIN_WRDOITM64, UNKNOWN, (int) 
VOID_FTYPE_UINT64)
+
 BDESC_END (SPECIAL_ARGS, PURE_ARGS)
 
 /* AVX */
diff --git a/gcc/config/i386/i386-c.cc b/gcc/config/i386/i386-c.cc
index a895965d439..4942bfc2236 100644
--- a/gcc/config/i386/i386-c.cc
+++ b/gcc/config/i386/i386-c.cc
@@ -818,6 +818,8 @@ ix86_target_macros_internal (HOST_WIDE_INT isa_flag,
     def_or_undef (parse_in, "__ACEOPFP64__");
   if (isa_flag2 & OPTION_MASK_ISA2_AVX10VPMLDSABFLYDQ)
     def_or_undef (parse_in, "__AVX10VPMLDSABFLYDQ__");
+  if (isa_flag2 & OPTION_MASK_ISA2_USER_DOITM)
+    def_or_undef (parse_in, "__USER_DOITM__");
   if (TARGET_IAMCU)
     {
       def_or_undef (parse_in, "__iamcu");
diff --git a/gcc/config/i386/i386-isa.def b/gcc/config/i386/i386-isa.def
index 6bb9adca48f..318361fb30e 100644
--- a/gcc/config/i386/i386-isa.def
+++ b/gcc/config/i386/i386-isa.def
@@ -135,3 +135,4 @@ DEF_PTA(ACEOPFP16)
 DEF_PTA(ACEOPFP32)
 DEF_PTA(ACEOPFP64)
 DEF_PTA(AVX10VPMLDSABFLYDQ)
+DEF_PTA(USER_DOITM)
diff --git a/gcc/config/i386/i386-options.cc b/gcc/config/i386/i386-options.cc
index 9bcd7b9fd6b..3dcc99d712c 100644
--- a/gcc/config/i386/i386-options.cc
+++ b/gcc/config/i386/i386-options.cc
@@ -285,7 +285,8 @@ static struct ix86_target_opts isa2_opts[] =
   { "-maceopfp16",     OPTION_MASK_ISA2_ACEOPFP16 },
   { "-maceopfp32",     OPTION_MASK_ISA2_ACEOPFP32 },
   { "-maceopfp64",     OPTION_MASK_ISA2_ACEOPFP64 },
-  { "-mavx10vpmldsabflydq", OPTION_MASK_ISA2_AVX10VPMLDSABFLYDQ }
+  { "-mavx10vpmldsabflydq", OPTION_MASK_ISA2_AVX10VPMLDSABFLYDQ },
+  { "-muserdoitm",     OPTION_MASK_ISA2_USER_DOITM }
 };
 static struct ix86_target_opts isa_opts[] =
 {
@@ -1161,6 +1162,7 @@ ix86_valid_target_attribute_inner_p (tree fndecl, tree 
args, char *p_strings[],
     IX86_ATTR_ISA ("aceopfp32", OPT_maceopfp32),
     IX86_ATTR_ISA ("aceopfp64", OPT_maceopfp64),
     IX86_ATTR_ISA ("avx10vpmldsabflydq", OPT_mavx10vpmldsabflydq),
+    IX86_ATTR_ISA ("userdoitm", OPT_muserdoitm),
 
     /* enum options */
     IX86_ATTR_ENUM ("fpmath=", OPT_mfpmath_),
diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md
index 005938c506f..49dd823b7d7 100644
--- a/gcc/config/i386/i386.md
+++ b/gcc/config/i386/i386.md
@@ -364,6 +364,11 @@
 
   ;; For MOVRS support
   UNSPECV_MOVRS
+
+  ;; For USER_DOITM support
+  UNSPECV_RDDOITM
+  UNSPECV_WRDOITM
+  UNSPECV_SETDOITM
 ])
 
 ;; Constants to represent rounding modes in the ROUND instruction
@@ -31815,6 +31820,32 @@
    (set_attr "type" "other")
    (set_attr "mode" "<MODE>")])
 
+(define_insn "rddoitm<mode>"
+  [(set (match_operand:SWI48 0 "register_operand" "=r")
+       (unspec_volatile:SWI48 [(const_int 0)] UNSPECV_RDDOITM))]
+  "TARGET_USER_DOITM"
+  "rddoitm\t%0"
+  [(set_attr "prefix" "orig")
+   (set_attr "type" "other")
+   (set_attr "mode" "<MODE>")])
+
+(define_insn "wrdoitm<mode>"
+  [(unspec_volatile [(match_operand:SWI48 0 "register_operand" "r")]
+                   UNSPECV_WRDOITM)]
+  "TARGET_USER_DOITM"
+  "wrdoitm\t%0"
+  [(set_attr "prefix" "orig")
+   (set_attr "type" "other")
+   (set_attr "mode" "<MODE>")])
+
+(define_insn "setdoitm"
+  [(unspec_volatile [(const_int 0)] UNSPECV_SETDOITM)]
+  "TARGET_USER_DOITM"
+  "setdoitm"
+  [(set_attr "prefix" "orig")
+   (set_attr "type" "other")
+   (set_attr "length" "4")])
+
 (include "mmx.md")
 (include "sse.md")
 (include "sync.md")
diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt
index 43bdc99686f..a8aa9aeacd8 100644
--- a/gcc/config/i386/i386.opt
+++ b/gcc/config/i386/i386.opt
@@ -1442,3 +1442,7 @@ mavx10vpmldsabflydq
 Target Mask(ISA2_AVX10VPMLDSABFLYDQ) Var(ix86_isa_flags2) Save
 Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2,
 AVX10.1 and AVX10VPMLDSABFLYDQ built-in functions and code generation.
+
+muserdoitm
+Target Mask(ISA2_USER_DOITM) Var(ix86_isa_flags2) Save
+Support USER_DOITM built-in functions and code generation.
diff --git a/gcc/config/i386/i386.opt.urls b/gcc/config/i386/i386.opt.urls
index 57497e4039d..9f635f8e9b2 100644
--- a/gcc/config/i386/i386.opt.urls
+++ b/gcc/config/i386/i386.opt.urls
@@ -665,3 +665,6 @@ UrlSuffix(gcc/x86-Options.html#index-maceopfp64)
 mavx10vpmldsabflydq
 UrlSuffix(gcc/x86-Options.html#index-mavx10vpmldsabflydq)
 
+mdoitmni
+UrlSuffix(gcc/x86-Options.html#index-mdoitmni)
+
diff --git a/gcc/config/i386/userdoitmintrin.h 
b/gcc/config/i386/userdoitmintrin.h
new file mode 100644
index 00000000000..403a1a18ee6
--- /dev/null
+++ b/gcc/config/i386/userdoitmintrin.h
@@ -0,0 +1,79 @@
+/* Copyright (C) 2026 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/>.  */
+
+#if !defined _X86GPRINTRIN_H_INCLUDED
+#error "Never use <userdoitmintrin.h> directly; include <x86gprintrin.h> 
instead."
+#endif
+
+#ifndef _USER_DOITMINTRIN_H_INCLUDED
+#define _USER_DOITMINTRIN_H_INCLUDED
+
+#if !defined(__USER_DOITM__)
+#pragma GCC push_options
+#pragma GCC target("userdoitm")
+#define __DISABLE_USER_DOITM__
+#endif /* __USER_DOITM__ */
+
+extern __inline unsigned int
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_readdoitm_u32 (void)
+{
+  return __builtin_ia32_rddoitm32 ();
+}
+
+extern __inline void
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_writedoitm_u32 (unsigned int __B)
+{
+  __builtin_ia32_wrdoitm32 (__B);
+}
+
+extern __inline void
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_setdoitm (void)
+{
+  __builtin_ia32_setdoitm ();
+}
+
+#ifdef __x86_64__
+extern __inline unsigned long long
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_readdoitm_u64 (void)
+{
+  return __builtin_ia32_rddoitm64 ();
+}
+
+extern __inline void
+__attribute__((__gnu_inline__, __always_inline__, __artificial__))
+_writedoitm_u64 (unsigned long long __B)
+{
+  __builtin_ia32_wrdoitm64 (__B);
+}
+#endif
+
+#ifdef __DISABLE_USER_DOITM__
+#undef __DISABLE_USER_DOITM__
+#pragma GCC pop_options
+#endif /* __DISABLE_USER_DOITM__ */
+
+#endif /* __USER_DOITMINTRIN_H_INCLUDED */
diff --git a/gcc/config/i386/x86gprintrin.h b/gcc/config/i386/x86gprintrin.h
index 4e62487ed0b..f7c2d30bac4 100644
--- a/gcc/config/i386/x86gprintrin.h
+++ b/gcc/config/i386/x86gprintrin.h
@@ -110,6 +110,8 @@
 
 #include <usermsrintrin.h>
 
+#include <userdoitmintrin.h>
+
 extern __inline void
 __attribute__((__gnu_inline__, __always_inline__, __artificial__))
 _wbinvd (void)
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi
index 7f7ec42f51a..7cb4b8ad76e 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -9615,6 +9615,11 @@ Enable/disable the generation of the ACEOPFP64 
instructions.
 @itemx no-avx10vpmldsabflydq
 Enable/disable the generation of the AVX10VPMLDSABFLYDQ instructions.
 
+@cindex @code{target("userdoitm")}, x86
+@item userdoitm
+@itemx no-userdoitm
+Enable/Disable the generation of the DOITMNI instructions.
+
 @atindex @code{target("cld")}, x86
 @item cld
 @itemx no-cld
diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi
index 268038dc5b8..f6f010df632 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -1557,6 +1557,7 @@ See RS/6000 and PowerPC Options.
 -musermsr  -mavx10.1  -mavx10.2  -mamx-avx512  -mmovrs  -mamx-movrs 
 -mavx512bmm  -mavx10v2aux  -macev1  -mavx10v1aux  -mavx10.3  -mavx10bmm
 -macev2  -maceopfp16  -maceopfp32  -maceopfp64  -mavx10vpmldsabflydq
+-muserdoitm
 -mcldemote  -mms-bitfields  -mno-align-stringops  -minline-all-stringops
 -minline-stringops-dynamically  -mstringop-strategy=@var{alg}
 -mkl  -mwidekl
@@ -36489,6 +36490,11 @@ AVX10.1, ACEv1 and ACEOPFP64 built-in functions and 
code generation.
 @item -mavx10vpmldsabflydq
 Support MMX, SSE, SSE2, SSE3, SSSE3, SSE4.1, SSE4.2, AVX, AVX2,
 AVX10.1 and AVX10VPMLDSABFLYDQ built-in functions and code generation.
+
+@opindex muserdoitm
+@opindex mno-userdoitm
+@item -muserdoitm
+Support USER_DOITM built-in functions and code generation.
 @end table
 
 These additional options are available for the x86 processor family.
diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi
index b9e26d0c77d..abbe1bc9529 100644
--- a/gcc/doc/sourcebuild.texi
+++ b/gcc/doc/sourcebuild.texi
@@ -2821,6 +2821,9 @@ Target supporting hardware divmod insn or divmod libcall.
 @item divmod_simode
 Target supporting hardware divmod insn or divmod libcall for SImode.
 
+@item userdoitm
+Target supports compiling @code{userdoitm} instructions.
+
 @item hard_float
 Target supports FPU instructions.
 
diff --git a/gcc/testsuite/gcc.target/i386/funcspec-56.inc 
b/gcc/testsuite/gcc.target/i386/funcspec-56.inc
index 03221fedbd2..43e77d62186 100644
--- a/gcc/testsuite/gcc.target/i386/funcspec-56.inc
+++ b/gcc/testsuite/gcc.target/i386/funcspec-56.inc
@@ -102,6 +102,7 @@ extern void test_aceopfp16 (void)           
__attribute__((__target__("aceopfp16")));
 extern void test_aceopfp32 (void)              
__attribute__((__target__("aceopfp32")));
 extern void test_aceopfp64 (void)              
__attribute__((__target__("aceopfp64")));
 extern void test_avx10vpmldsabflydq (void)     
__attribute__((__target__("avx10vpmldsabflydq")));
+extern void test_userdoitm (void)              
__attribute__((__target__("userdoitm")));
 
 extern void test_no_sgx (void)                 
__attribute__((__target__("no-sgx")));
 extern void test_no_avx512vpopcntdq(void)      
__attribute__((__target__("no-avx512vpopcntdq")));
@@ -205,6 +206,7 @@ extern void test_no_aceopfp16 (void)                
__attribute__((__target__("no-aceopfp16"))
 extern void test_no_aceopfp32 (void)           
__attribute__((__target__("no-aceopfp32")));
 extern void test_no_aceopfp64 (void)           
__attribute__((__target__("no-aceopfp64")));
 extern void test_no_avx10vpmldsabflydq (void)  
__attribute__((__target__("no-avx10vpmldsabflydq")));
+extern void test_no_userdoitm (void)           
__attribute__((__target__("no-userdoitm")));
 
 extern void test_arch_nocona (void)            
__attribute__((__target__("arch=nocona")));
 extern void test_arch_core2 (void)             
__attribute__((__target__("arch=core2")));
diff --git a/gcc/testsuite/gcc.target/i386/userdoitm-1.c 
b/gcc/testsuite/gcc.target/i386/userdoitm-1.c
new file mode 100644
index 00000000000..eed96e7c2bd
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/userdoitm-1.c
@@ -0,0 +1,24 @@
+/* { dg-do compile } */
+/* { dg-options "-muserdoitm -O2"  } */
+/* { dg-final { scan-assembler-times "rddoitm\[ \\t\]" 2  { target { ! ia32 } 
} } } */
+/* { dg-final { scan-assembler-times "rddoitm\[ \\t\]" 1  { target { ia32 } } 
} } */
+/* { dg-final { scan-assembler-times "wrdoitm\[ \\t\]" 2  { target { ! ia32 } 
} } } */
+/* { dg-final { scan-assembler-times "wrdoitm\[ \\t\]" 1  { target { ia32 } } 
} } */
+/* { dg-final { scan-assembler-times "setdoitm" 1  }  } */
+
+#include <x86gprintrin.h>
+
+volatile unsigned long long x1, x2;
+volatile unsigned int y, y2;
+
+void extern
+userdoitm_test (void)
+{
+#ifdef __x86_64__
+  _writedoitm_u64 (x1);
+  x2 = _readdoitm_u64 ();
+#endif
+  _writedoitm_u32 (y);
+  y2 = _readdoitm_u32 ();
+  _setdoitm ();
+}
diff --git a/gcc/testsuite/gcc.target/i386/x86gprintrin-1.c 
b/gcc/testsuite/gcc.target/i386/x86gprintrin-1.c
index b9479beef7c..991732849c6 100644
--- a/gcc/testsuite/gcc.target/i386/x86gprintrin-1.c
+++ b/gcc/testsuite/gcc.target/i386/x86gprintrin-1.c
@@ -1,6 +1,6 @@
 /* Test that <x86gprintrin.h> is usable with -O -std=c89 -pedantic-errors.  */
 /* { dg-do compile } */
-/* { dg-options "-O -std=c89 -pedantic-errors -march=x86-64 -madx -mbmi -mbmi2 
-mcldemote -mclflushopt -mclwb -mclzero -menqcmd -mfsgsbase -mfxsr -mhreset 
-mlzcnt -mlwp -mmovdiri -mmwaitx -mpconfig -mpopcnt -mpku -mptwrite -mrdpid 
-mrdrnd -mrdseed -mrtm -mserialize -msgx -mshstk -mtbm -mtsxldtrk -mwaitpkg 
-mwbnoinvd -mxsave -mxsavec -mxsaveopt -mxsaves -mraoint -mno-sse -mno-mmx" } */
+/* { dg-options "-O -std=c89 -pedantic-errors -march=x86-64 -madx -mbmi -mbmi2 
-mcldemote -mclflushopt -mclwb -mclzero -menqcmd -mfsgsbase -mfxsr -mhreset 
-mlzcnt -mlwp -mmovdiri -mmwaitx -mpconfig -mpopcnt -mpku -mptwrite -mrdpid 
-mrdrnd -mrdseed -mrtm -mserialize -msgx -mshstk -mtbm -mtsxldtrk -mwaitpkg 
-mwbnoinvd -mxsave -mxsavec -mxsaveopt -mxsaves -mraoint -muserdoitm -mno-sse 
-mno-mmx" } */
 /* { dg-additional-options "-musermsr -mcmpccxadd -mprefetchi -muintr" { 
target { ! ia32 } } }  */
 
 #include <x86gprintrin.h>
diff --git a/gcc/testsuite/gcc.target/i386/x86gprintrin-2.c 
b/gcc/testsuite/gcc.target/i386/x86gprintrin-2.c
index ee167ebab90..347b314bac7 100644
--- a/gcc/testsuite/gcc.target/i386/x86gprintrin-2.c
+++ b/gcc/testsuite/gcc.target/i386/x86gprintrin-2.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O2 -Werror-implicit-function-declaration -march=x86-64 -madx 
-mbmi -mbmi2 -mcldemote -mclflushopt -mclwb -mclzero -menqcmd -mfsgsbase -mfxsr 
-mhreset -mlzcnt -mlwp -mmovdiri -mmwaitx -mpconfig -mpopcnt -mpku -mptwrite 
-mrdpid -mrdrnd -mrdseed -mrtm -mserialize -msgx -mshstk -mtbm -mtsxldtrk 
-mwaitpkg -mwbnoinvd -mxsave -mxsavec -mxsaveopt -mxsaves -mraoint -mno-sse 
-mno-mmx" } */
+/* { dg-options "-O2 -Werror-implicit-function-declaration -march=x86-64 -madx 
-mbmi -mbmi2 -mcldemote -mclflushopt -mclwb -mclzero -menqcmd -mfsgsbase -mfxsr 
-mhreset -mlzcnt -mlwp -mmovdiri -mmwaitx -mpconfig -mpopcnt -mpku -mptwrite 
-mrdpid -mrdrnd -mrdseed -mrtm -mserialize -msgx -mshstk -mtbm -mtsxldtrk 
-mwaitpkg -mwbnoinvd -mxsave -mxsavec -mxsaveopt -mxsaves -mraoint -muserdoitm 
-mno-sse -mno-mmx" } */
 /* { dg-add-options bind_pic_locally } */
 /* { dg-additional-options "-musermsr -mcmpccxadd -mprefetchi -muintr" { 
target { ! ia32 } } }  */
 
diff --git a/gcc/testsuite/gcc.target/i386/x86gprintrin-3.c 
b/gcc/testsuite/gcc.target/i386/x86gprintrin-3.c
index a87039149f9..a86a3cc7f77 100644
--- a/gcc/testsuite/gcc.target/i386/x86gprintrin-3.c
+++ b/gcc/testsuite/gcc.target/i386/x86gprintrin-3.c
@@ -1,5 +1,5 @@
 /* { dg-do compile } */
-/* { dg-options "-O0 -Werror-implicit-function-declaration -march=x86-64 -madx 
-mbmi -mbmi2 -mcldemote -mclflushopt -mclwb -mclzero -menqcmd -mfsgsbase -mfxsr 
-mhreset -mlzcnt -mlwp -mmovdiri -mmwaitx -mpconfig -mpopcnt -mpku -mptwrite 
-mrdpid -mrdrnd -mrdseed -mrtm -mserialize -msgx -mshstk -mtbm -mtsxldtrk 
-mwaitpkg -mwbnoinvd -mxsave -mxsavec -mxsaveopt -mxsaves -mraoint -mno-sse 
-mno-mmx" } */
+/* { dg-options "-O0 -Werror-implicit-function-declaration -march=x86-64 -madx 
-mbmi -mbmi2 -mcldemote -mclflushopt -mclwb -mclzero -menqcmd -mfsgsbase -mfxsr 
-mhreset -mlzcnt -mlwp -mmovdiri -mmwaitx -mpconfig -mpopcnt -mpku -mptwrite 
-mrdpid -mrdrnd -mrdseed -mrtm -mserialize -msgx -mshstk -mtbm -mtsxldtrk 
-mwaitpkg -mwbnoinvd -mxsave -mxsavec -mxsaveopt -mxsaves -mraoint -muserdoitm 
-mno-sse -mno-mmx" } */
 /* { dg-add-options bind_pic_locally } */
 /* { dg-additional-options "-musermsr -mcmpccxadd -mprefetchi -muintr" { 
target { ! ia32 } } }  */
 
diff --git a/gcc/testsuite/gcc.target/i386/x86gprintrin-4.c 
b/gcc/testsuite/gcc.target/i386/x86gprintrin-4.c
index c3c79473020..48ff76870c4 100644
--- a/gcc/testsuite/gcc.target/i386/x86gprintrin-4.c
+++ b/gcc/testsuite/gcc.target/i386/x86gprintrin-4.c
@@ -33,9 +33,9 @@
 
 #ifndef DIFFERENT_PRAGMAS
 #ifdef __x86_64__
-#pragma GCC target 
("adx,bmi,bmi2,cmpccxadd,fsgsbase,fxsr,hreset,lwp,lzcnt,popcnt,prefetchi,raoint,rdrnd,rdseed,tbm,rtm,serialize,tsxldtrk,uintr,usermsr,xsaveopt")
+#pragma GCC target 
("adx,bmi,bmi2,cmpccxadd,fsgsbase,fxsr,hreset,lwp,lzcnt,popcnt,prefetchi,raoint,rdrnd,rdseed,tbm,rtm,serialize,tsxldtrk,uintr,usermsr,xsaveopt,userdoitm")
 #else
-#pragma GCC target 
("adx,bmi,bmi2,fsgsbase,fxsr,hreset,lwp,lzcnt,popcnt,raoint,rdrnd,rdseed,tbm,rtm,serialize,tsxldtrk,xsaveopt")
+#pragma GCC target 
("adx,bmi,bmi2,fsgsbase,fxsr,hreset,lwp,lzcnt,popcnt,raoint,rdrnd,rdseed,tbm,rtm,serialize,tsxldtrk,xsaveopt,userdoitm")
 #endif
 #endif
 
diff --git a/gcc/testsuite/gcc.target/i386/x86gprintrin-5.c 
b/gcc/testsuite/gcc.target/i386/x86gprintrin-5.c
index ef126ea76c2..bc929b1f3a8 100644
--- a/gcc/testsuite/gcc.target/i386/x86gprintrin-5.c
+++ b/gcc/testsuite/gcc.target/i386/x86gprintrin-5.c
@@ -36,9 +36,9 @@
 #define __builtin_ia32_uwrmsr(A, B) __builtin_ia32_uwrmsr(1, B)
 
 #ifdef __x86_64__
-#pragma GCC target 
("adx,bmi,bmi2,clflushopt,clwb,clzero,cmpccxadd,enqcmd,fsgsbase,fxsr,hreset,lwp,lzcnt,mwaitx,pconfig,pku,popcnt,prefetchi,raoint,rdpid,rdrnd,rdseed,tbm,rtm,serialize,sgx,tsxldtrk,uintr,usermsr,xsavec,xsaveopt,xsaves,wbnoinvd")
+#pragma GCC target 
("adx,bmi,bmi2,clflushopt,clwb,clzero,cmpccxadd,enqcmd,fsgsbase,fxsr,hreset,lwp,lzcnt,mwaitx,pconfig,pku,popcnt,prefetchi,raoint,rdpid,rdrnd,rdseed,tbm,rtm,serialize,sgx,tsxldtrk,uintr,usermsr,xsavec,xsaveopt,xsaves,wbnoinvd,userdoitm")
 #else
-#pragma GCC target 
("adx,bmi,bmi2,clflushopt,clwb,clzero,enqcmd,fsgsbase,fxsr,hreset,lwp,lzcnt,mwaitx,pconfig,pku,popcnt,raoint,rdpid,rdrnd,rdseed,tbm,rtm,serialize,sgx,tsxldtrk,xsavec,xsaveopt,xsaves,wbnoinvd")
+#pragma GCC target 
("adx,bmi,bmi2,clflushopt,clwb,clzero,enqcmd,fsgsbase,fxsr,hreset,lwp,lzcnt,mwaitx,pconfig,pku,popcnt,raoint,rdpid,rdrnd,rdseed,tbm,rtm,serialize,sgx,tsxldtrk,xsavec,xsaveopt,xsaves,wbnoinvd,userdoitm")
 #endif
 
 #include <x86gprintrin.h>
-- 
2.31.1

Reply via email to