Support Intel RAO-INT

Message ID DM4PR11MB54870D12EAC564A973CA9788EC3D9@DM4PR11MB5487.namprd11.prod.outlook.com
State New
Headers
Series Support Intel RAO-INT |

Commit Message

Li, Pan2 via Gcc-patches Nov. 6, 2022, 12:55 p.m. UTC
  Hi,
The patches aimed to add Intel RAO-INT.

The information is based on newly released
Intel Architecture Instruction Set Extensions and Future Features.

The document comes following:
https://www.intel.com/content/www/us/en/develop/download/intel-architecture-instruction-set-extensions-programming-reference.html.

OK for trunk?

gcc/ChangeLog:

	* common/config/i386/cpuinfo.h (get_available_features):
	Detect raoint.
	* common/config/i386/i386-common.cc (OPTION_MASK_ISA2_RAOINT_SET,
	OPTION_MASK_ISA2_RAOINT_UNSET): New.
	(ix86_handle_option): Handle -mraoint.
	* common/config/i386/i386-cpuinfo.h (enum processor_features):
	Add FEATURE_RAOINT.
	* common/config/i386/i386-isas.h: Add ISA_NAME_TABLE_ENTRY for
	raoint.
	* config.gcc: Add raointintrin.h
	* config/i386/cpuid.h (bit_RAOINT): New.
	* config/i386/i386-builtin.def (BDESC): Add new builtins.
	* config/i386/i386-c.cc (ix86_target_macros_internal): Define
	__RAOINT__.
	* config/i386/i386-isa.def (RAOINT): Add DEF_PTA(RAOINT).
	* config/i386/i386-options.cc (ix86_valid_target_attribute_inner_p):
	Add -mraoint.
	* config/i386/sync.md (rao_a<raointop><mode>): New define insn.
	* config/i386/i386.opt: Add option -mraoint.
	* config/i386/x86gprintrin.h: Include raointintrin.h.
	* doc/extend.texi: Document raoint.
	* doc/invoke.texi: Document -mraoint.
	* doc/sourcebuild.texi: Document target raoint.
	* config/i386/raointintrin.h: New file.

gcc/testsuite/ChangeLog:

	* g++.dg/other/i386-2.C: Add -mraoint.
	* g++.dg/other/i386-3.C: Ditto.
	* gcc.target/i386/funcspec-56.inc: Add new target attribute.
	* gcc.target/i386/sse-12.c: Add -mraoint.
	* gcc.target/i386/sse-13.c: Ditto.
	* gcc.target/i386/sse-14.c: Ditto.
	* gcc.target/i386/sse-22.c: Add raoint target.
	* gcc.target/i386/sse-23.c: Ditto.
	* lib/target-supports.exp: Add check_effective_target_raoint.
	* gcc.target/i386/rao-helper.h: New test.
	* gcc.target/i386/raoint-1.c: Ditto.
	* gcc.target/i386/raoint-aadd-2.c: Ditto.
	* gcc.target/i386/raoint-aand-2.c: Ditto.
	* gcc.target/i386/raoint-aor-2.c: Ditto.
	* gcc.target/i386/raoint-axor-2.c: Ditto.
	* 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/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                                |   3 +-
 gcc/config/i386/cpuid.h                       |   1 +
 gcc/config/i386/i386-builtin.def              |  10 ++
 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.opt                      |   4 +
 gcc/config/i386/raointintrin.h                | 101 ++++++++++++++++++
 gcc/config/i386/sync.md                       |  16 +++
 gcc/config/i386/x86gprintrin.h                |   2 +
 gcc/doc/extend.texi                           |   5 +
 gcc/doc/invoke.texi                           |  11 +-
 gcc/doc/sourcebuild.texi                      |   3 +
 gcc/testsuite/g++.dg/other/i386-2.C           |   2 +-
 gcc/testsuite/g++.dg/other/i386-3.C           |   2 +-
 gcc/testsuite/gcc.target/i386/funcspec-56.inc |   2 +
 gcc/testsuite/gcc.target/i386/rao-helper.h    |  79 ++++++++++++++
 gcc/testsuite/gcc.target/i386/raoint-1.c      |  31 ++++++
 gcc/testsuite/gcc.target/i386/raoint-aadd-2.c |  24 +++++  gcc/testsuite/gcc.target/i386/raoint-aand-2.c |  25 +++++  gcc/testsuite/gcc.target/i386/raoint-aor-2.c  |  25 +++++  gcc/testsuite/gcc.target/i386/raoint-axor-2.c |  25 +++++
 gcc/testsuite/gcc.target/i386/sse-12.c        |   2 +-
 gcc/testsuite/gcc.target/i386/sse-13.c        |   2 +-
 gcc/testsuite/gcc.target/i386/sse-14.c        |   2 +-
 gcc/testsuite/gcc.target/i386/sse-22.c        |   4 +-
 gcc/testsuite/gcc.target/i386/sse-23.c        |   2 +-
 .../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 +-
 gcc/testsuite/lib/target-supports.exp         |  11 ++
 37 files changed, 413 insertions(+), 21 deletions(-)  create mode 100644 gcc/config/i386/raointintrin.h  create mode 100644 gcc/testsuite/gcc.target/i386/rao-helper.h
 create mode 100644 gcc/testsuite/gcc.target/i386/raoint-1.c
 create mode 100644 gcc/testsuite/gcc.target/i386/raoint-aadd-2.c
 create mode 100644 gcc/testsuite/gcc.target/i386/raoint-aand-2.c
 create mode 100644 gcc/testsuite/gcc.target/i386/raoint-aor-2.c
 create mode 100644 gcc/testsuite/gcc.target/i386/raoint-axor-2.c

--
2.27.0
  

Comments

Hongtao Liu Nov. 7, 2022, 1:36 a.m. UTC | #1
On Sun, Nov 6, 2022 at 8:56 PM Kong, Lingling via Gcc-patches
<gcc-patches@gcc.gnu.org> wrote:
>
> Hi,
> The patches aimed to add Intel RAO-INT.
>
> The information is based on newly released
> Intel Architecture Instruction Set Extensions and Future Features.
>
> The document comes following:
> https://www.intel.com/content/www/us/en/develop/download/intel-architecture-instruction-set-extensions-programming-reference.html.
>
> OK for trunk?
Ok.
>
> gcc/ChangeLog:
>
>         * common/config/i386/cpuinfo.h (get_available_features):
>         Detect raoint.
>         * common/config/i386/i386-common.cc (OPTION_MASK_ISA2_RAOINT_SET,
>         OPTION_MASK_ISA2_RAOINT_UNSET): New.
>         (ix86_handle_option): Handle -mraoint.
>         * common/config/i386/i386-cpuinfo.h (enum processor_features):
>         Add FEATURE_RAOINT.
>         * common/config/i386/i386-isas.h: Add ISA_NAME_TABLE_ENTRY for
>         raoint.
>         * config.gcc: Add raointintrin.h
>         * config/i386/cpuid.h (bit_RAOINT): New.
>         * config/i386/i386-builtin.def (BDESC): Add new builtins.
>         * config/i386/i386-c.cc (ix86_target_macros_internal): Define
>         __RAOINT__.
>         * config/i386/i386-isa.def (RAOINT): Add DEF_PTA(RAOINT).
>         * config/i386/i386-options.cc (ix86_valid_target_attribute_inner_p):
>         Add -mraoint.
>         * config/i386/sync.md (rao_a<raointop><mode>): New define insn.
>         * config/i386/i386.opt: Add option -mraoint.
>         * config/i386/x86gprintrin.h: Include raointintrin.h.
>         * doc/extend.texi: Document raoint.
>         * doc/invoke.texi: Document -mraoint.
>         * doc/sourcebuild.texi: Document target raoint.
>         * config/i386/raointintrin.h: New file.
>
> gcc/testsuite/ChangeLog:
>
>         * g++.dg/other/i386-2.C: Add -mraoint.
>         * g++.dg/other/i386-3.C: Ditto.
>         * gcc.target/i386/funcspec-56.inc: Add new target attribute.
>         * gcc.target/i386/sse-12.c: Add -mraoint.
>         * gcc.target/i386/sse-13.c: Ditto.
>         * gcc.target/i386/sse-14.c: Ditto.
>         * gcc.target/i386/sse-22.c: Add raoint target.
>         * gcc.target/i386/sse-23.c: Ditto.
>         * lib/target-supports.exp: Add check_effective_target_raoint.
>         * gcc.target/i386/rao-helper.h: New test.
>         * gcc.target/i386/raoint-1.c: Ditto.
>         * gcc.target/i386/raoint-aadd-2.c: Ditto.
>         * gcc.target/i386/raoint-aand-2.c: Ditto.
>         * gcc.target/i386/raoint-aor-2.c: Ditto.
>         * gcc.target/i386/raoint-axor-2.c: Ditto.
>         * 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/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                                |   3 +-
>  gcc/config/i386/cpuid.h                       |   1 +
>  gcc/config/i386/i386-builtin.def              |  10 ++
>  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.opt                      |   4 +
>  gcc/config/i386/raointintrin.h                | 101 ++++++++++++++++++
>  gcc/config/i386/sync.md                       |  16 +++
>  gcc/config/i386/x86gprintrin.h                |   2 +
>  gcc/doc/extend.texi                           |   5 +
>  gcc/doc/invoke.texi                           |  11 +-
>  gcc/doc/sourcebuild.texi                      |   3 +
>  gcc/testsuite/g++.dg/other/i386-2.C           |   2 +-
>  gcc/testsuite/g++.dg/other/i386-3.C           |   2 +-
>  gcc/testsuite/gcc.target/i386/funcspec-56.inc |   2 +
>  gcc/testsuite/gcc.target/i386/rao-helper.h    |  79 ++++++++++++++
>  gcc/testsuite/gcc.target/i386/raoint-1.c      |  31 ++++++
>  gcc/testsuite/gcc.target/i386/raoint-aadd-2.c |  24 +++++  gcc/testsuite/gcc.target/i386/raoint-aand-2.c |  25 +++++  gcc/testsuite/gcc.target/i386/raoint-aor-2.c  |  25 +++++  gcc/testsuite/gcc.target/i386/raoint-axor-2.c |  25 +++++
>  gcc/testsuite/gcc.target/i386/sse-12.c        |   2 +-
>  gcc/testsuite/gcc.target/i386/sse-13.c        |   2 +-
>  gcc/testsuite/gcc.target/i386/sse-14.c        |   2 +-
>  gcc/testsuite/gcc.target/i386/sse-22.c        |   4 +-
>  gcc/testsuite/gcc.target/i386/sse-23.c        |   2 +-
>  .../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 +-
>  gcc/testsuite/lib/target-supports.exp         |  11 ++
>  37 files changed, 413 insertions(+), 21 deletions(-)  create mode 100644 gcc/config/i386/raointintrin.h  create mode 100644 gcc/testsuite/gcc.target/i386/rao-helper.h
>  create mode 100644 gcc/testsuite/gcc.target/i386/raoint-1.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/raoint-aadd-2.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/raoint-aand-2.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/raoint-aor-2.c
>  create mode 100644 gcc/testsuite/gcc.target/i386/raoint-axor-2.c
>
> diff --git a/gcc/common/config/i386/cpuinfo.h b/gcc/common/config/i386/cpuinfo.h
> index 42c25b8a636..df3500adc83 100644
> --- a/gcc/common/config/i386/cpuinfo.h
> +++ b/gcc/common/config/i386/cpuinfo.h
> @@ -850,6 +850,8 @@ get_available_features (struct __processor_model *cpu_model,
>         set_feature(FEATURE_CMPCCXADD);
>        if (edx & bit_PREFETCHI)
>         set_feature (FEATURE_PREFETCHI);
> +      if (eax & bit_RAOINT)
> +       set_feature (FEATURE_RAOINT);
>        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 c828ae5b7d7..60a193a651c 100644
> --- a/gcc/common/config/i386/i386-common.cc
> +++ b/gcc/common/config/i386/i386-common.cc
> @@ -113,6 +113,7 @@ along with GCC; see the file COPYING3.  If not see  #define OPTION_MASK_ISA2_CMPCCXADD_SET OPTION_MASK_ISA2_CMPCCXADD  #define OPTION_MASK_ISA2_AMX_FP16_SET OPTION_MASK_ISA2_AMX_FP16  #define OPTION_MASK_ISA2_PREFETCHI_SET OPTION_MASK_ISA2_PREFETCHI
> +#define OPTION_MASK_ISA2_RAOINT_SET OPTION_MASK_ISA2_RAOINT
>
>  /* SSE4 includes both SSE4.1 and SSE4.2. -msse4 should be the same
>     as -msse4.2.  */
> @@ -289,6 +290,7 @@ along with GCC; see the file COPYING3.  If not see  #define OPTION_MASK_ISA2_CMPCCXADD_UNSET OPTION_MASK_ISA2_CMPCCXADD  #define OPTION_MASK_ISA2_AMX_FP16_UNSET OPTION_MASK_ISA2_AMX_FP16  #define OPTION_MASK_ISA2_PREFETCHI_UNSET OPTION_MASK_ISA2_PREFETCHI
> +#define OPTION_MASK_ISA2_RAOINT_UNSET OPTION_MASK_ISA2_RAOINT
>
>  /* SSE4 includes both SSE4.1 and SSE4.2.  -mno-sse4 should the same
>     as -mno-sse4.1. */
> @@ -1226,6 +1228,19 @@ ix86_handle_option (struct gcc_options *opts,
>         }
>        return true;
>
> +    case OPT_mraoint:
> +      if (value)
> +       {
> +         opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA2_RAOINT_SET;
> +         opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_RAOINT_SET;
> +       }
> +      else
> +       {
> +         opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_RAOINT_UNSET;
> +         opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_RAOINT_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 c06f089b0c5..345fda648ff 100644
> --- a/gcc/common/config/i386/i386-cpuinfo.h
> +++ b/gcc/common/config/i386/i386-cpuinfo.h
> @@ -251,6 +251,7 @@ enum processor_features
>    FEATURE_CMPCCXADD,
>    FEATURE_AMX_FP16,
>    FEATURE_PREFETCHI,
> +  FEATURE_RAOINT,
>    CPU_FEATURE_MAX
>  };
>
> diff --git a/gcc/common/config/i386/i386-isas.h b/gcc/common/config/i386/i386-isas.h
> index 8648ea6903c..ba2c2d94534 100644
> --- a/gcc/common/config/i386/i386-isas.h
> +++ b/gcc/common/config/i386/i386-isas.h
> @@ -183,4 +183,5 @@ ISA_NAMES_TABLE_START
>    ISA_NAMES_TABLE_ENTRY("cmpccxadd", FEATURE_CMPCCXADD, P_NONE, "-mcmpccxadd")
>    ISA_NAMES_TABLE_ENTRY("amx-fp16", FEATURE_AMX_FP16, P_NONE, "-mamx-fp16")
>    ISA_NAMES_TABLE_ENTRY("prefetchi", FEATURE_PREFETCHI, P_NONE, "-mprefetchi")
> +  ISA_NAMES_TABLE_ENTRY("raoint", FEATURE_RAOINT, P_NONE, "-mraoint")
>  ISA_NAMES_TABLE_END
> diff --git a/gcc/config.gcc b/gcc/config.gcc index 03c1523f7af..ceaeaebf059 100644
> --- a/gcc/config.gcc
> +++ b/gcc/config.gcc
> @@ -423,7 +423,8 @@ i[34567]86-*-* | x86_64-*-*)
>                        hresetintrin.h keylockerintrin.h avxvnniintrin.h
>                        mwaitintrin.h avx512fp16intrin.h avx512fp16vlintrin.h
>                        avxifmaintrin.h avxvnniint8intrin.h avxneconvertintrin.h
> -                      cmpccxaddintrin.h amxfp16intrin.h prfchiintrin.h"
> +                      cmpccxaddintrin.h amxfp16intrin.h prfchiintrin.h
> +                      raointintrin.h"
>         ;;
>  ia64-*-*)
>         extra_headers=ia64intrin.h
> diff --git a/gcc/config/i386/cpuid.h b/gcc/config/i386/cpuid.h index 92583261883..a33abf35cc0 100644
> --- a/gcc/config/i386/cpuid.h
> +++ b/gcc/config/i386/cpuid.h
> @@ -25,6 +25,7 @@
>  #define _CPUID_H_INCLUDED
>
>  /* %eax */
> +#define bit_RAOINT     (1 << 3)
>  #define bit_AVXVNNI    (1 << 4)
>  #define bit_AVX512BF16 (1 << 5)
>  #define bit_CMPCCXADD  (1 << 7)
> diff --git a/gcc/config/i386/i386-builtin.def b/gcc/config/i386/i386-builtin.def
> index c272c392d03..2d683514f87 100644
> --- a/gcc/config/i386/i386-builtin.def
> +++ b/gcc/config/i386/i386-builtin.def
> @@ -415,6 +415,16 @@ BDESC (OPTION_MASK_ISA_AVX512BW, 0, CODE_FOR_avx512bw_truncatev32hiv32qi2_mask_s
>  BDESC (0, OPTION_MASK_ISA2_AVX512FP16, CODE_FOR_avx512f_loadhf_mask, "__builtin_ia32_loadsh_mask", IX86_BUILTIN_LOADSH_MASK, UNKNOWN, (int) V8HF_FTYPE_PCFLOAT16_V8HF_UQI)  BDESC (0, OPTION_MASK_ISA2_AVX512FP16, CODE_FOR_avx512f_storehf_mask, "__builtin_ia32_storesh_mask", IX86_BUILTIN_STORESH_MASK, UNKNOWN, (int) VOID_FTYPE_PCFLOAT16_V8HF_UQI)
>
> +/* RAOINT */
> +BDESC (0, OPTION_MASK_ISA2_RAOINT, CODE_FOR_rao_aaddsi,
> +"__builtin_ia32_aadd32", IX86_BUILTIN_AADD32, UNKNOWN, (int)
> +VOID_FTYPE_PINT_INT) BDESC (0, OPTION_MASK_ISA2_RAOINT,
> +CODE_FOR_rao_aandsi, "__builtin_ia32_aand32", IX86_BUILTIN_AAND32,
> +UNKNOWN, (int) VOID_FTYPE_PINT_INT) BDESC (0, OPTION_MASK_ISA2_RAOINT,
> +CODE_FOR_rao_aorsi, "__builtin_ia32_aor32", IX86_BUILTIN_AOR32,
> +UNKNOWN, (int) VOID_FTYPE_PINT_INT) BDESC (0, OPTION_MASK_ISA2_RAOINT,
> +CODE_FOR_rao_axorsi, "__builtin_ia32_axor32", IX86_BUILTIN_AXOR32,
> +UNKNOWN, (int) VOID_FTYPE_PINT_INT) BDESC (OPTION_MASK_ISA_64BIT,
> +OPTION_MASK_ISA2_RAOINT, CODE_FOR_rao_aadddi, "__builtin_ia32_aadd64",
> +IX86_BUILTIN_AADD64, UNKNOWN, (int) VOID_FTYPE_PLONGLONG_LONGLONG)
> +BDESC (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_RAOINT,
> +CODE_FOR_rao_aanddi, "__builtin_ia32_aand64", IX86_BUILTIN_AAND64,
> +UNKNOWN, (int) VOID_FTYPE_PLONGLONG_LONGLONG) BDESC
> +(OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_RAOINT, CODE_FOR_rao_aordi,
> +"__builtin_ia32_aor64", IX86_BUILTIN_AOR64, UNKNOWN, (int)
> +VOID_FTYPE_PLONGLONG_LONGLONG) BDESC (OPTION_MASK_ISA_64BIT,
> +OPTION_MASK_ISA2_RAOINT, CODE_FOR_rao_axordi, "__builtin_ia32_axor64",
> +IX86_BUILTIN_AXOR64, UNKNOWN, (int) VOID_FTYPE_PLONGLONG_LONGLONG)
> +
>  /* RDPKRU and WRPKRU.  */
>  BDESC (OPTION_MASK_ISA_PKU, 0, CODE_FOR_rdpkru,  "__builtin_ia32_rdpkru", IX86_BUILTIN_RDPKRU, UNKNOWN, (int) UNSIGNED_FTYPE_VOID)  BDESC (OPTION_MASK_ISA_PKU, 0, CODE_FOR_wrpkru,  "__builtin_ia32_wrpkru", IX86_BUILTIN_WRPKRU, UNKNOWN, (int) VOID_FTYPE_UNSIGNED) diff --git a/gcc/config/i386/i386-c.cc b/gcc/config/i386/i386-c.cc index c92796281e0..a877d24148d 100644
> --- a/gcc/config/i386/i386-c.cc
> +++ b/gcc/config/i386/i386-c.cc
> @@ -666,6 +666,8 @@ ix86_target_macros_internal (HOST_WIDE_INT isa_flag,
>      def_or_undef (parse_in, "__AMX_FP16__");
>    if (isa_flag2 & OPTION_MASK_ISA2_PREFETCHI)
>      def_or_undef (parse_in, "__PREFETCHI__");
> +  if (isa_flag2 & OPTION_MASK_ISA2_RAOINT)
> +    def_or_undef (parse_in, "__RAOINT__");
>    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 f234dcc37d7..63a2490316a 100644
> --- a/gcc/config/i386/i386-isa.def
> +++ b/gcc/config/i386/i386-isa.def
> @@ -115,3 +115,4 @@ DEF_PTA(AVXNECONVERT)
>  DEF_PTA(CMPCCXADD)
>  DEF_PTA(AMX_FP16)
>  DEF_PTA(PREFETCHI)
> +DEF_PTA(RAOINT)
> diff --git a/gcc/config/i386/i386-options.cc b/gcc/config/i386/i386-options.cc index 633d5dd7eea..10c7a3bb13e 100644
> --- a/gcc/config/i386/i386-options.cc
> +++ b/gcc/config/i386/i386-options.cc
> @@ -235,7 +235,8 @@ static struct ix86_target_opts isa2_opts[] =
>    { "-mavxneconvert",   OPTION_MASK_ISA2_AVXNECONVERT },
>    { "-mcmpccxadd",      OPTION_MASK_ISA2_CMPCCXADD },
>    { "-mamx-fp16",       OPTION_MASK_ISA2_AMX_FP16 },
> -  { "-mprefetchi",      OPTION_MASK_ISA2_PREFETCHI }
> +  { "-mprefetchi",      OPTION_MASK_ISA2_PREFETCHI },
> +  { "-mraoint",        OPTION_MASK_ISA2_RAOINT }
>  };
>  static struct ix86_target_opts isa_opts[] =  { @@ -1090,6 +1091,7 @@ ix86_valid_target_attribute_inner_p (tree fndecl, tree args, char *p_strings[],
>      IX86_ATTR_ISA ("cmpccxadd",   OPT_mcmpccxadd),
>      IX86_ATTR_ISA ("amx-fp16", OPT_mamx_fp16),
>      IX86_ATTR_ISA ("prefetchi",   OPT_mprefetchi),
> +    IX86_ATTR_ISA ("raoint", OPT_mraoint),
>
>      /* enum options */
>      IX86_ATTR_ENUM ("fpmath=", OPT_mfpmath_),
> diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt index 1d91103cd54..415c52e1bb4 100644
> --- a/gcc/config/i386/i386.opt
> +++ b/gcc/config/i386/i386.opt
> @@ -1242,3 +1242,7 @@ Support AMX-FP16 built-in functions and code generation.
>  mprefetchi
>  Target Mask(ISA2_PREFETCHI) Var(ix86_isa_flags2) Save  Support PREFETCHI built-in functions and code generation.
> +
> +mraoint
> +Target Mask(ISA2_RAOINT) Var(ix86_isa_flags2) Save Support RAOINT
> +built-in functions and code generation.
> diff --git a/gcc/config/i386/raointintrin.h b/gcc/config/i386/raointintrin.h new file mode 100644 index 00000000000..3d966573f23
> --- /dev/null
> +++ b/gcc/config/i386/raointintrin.h
> @@ -0,0 +1,101 @@
> +/* Copyright (C) 2019-2022 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/>.  */
> +
> +#ifndef _X86GPRINTRIN_H_INCLUDED
> +#error "Never use <raointintrin.h> directly; include <x86gprintrin.h> instead."
> +#endif // _X86GPRINTRIN_H_INCLUDED
> +
> +#ifndef __RAOINTINTRIN_H_INCLUDED
> +#define __RAOINTINTRIN_H_INCLUDED
> +
> +#ifndef __RAOINT__
> +#pragma GCC push_options
> +#pragma GCC target("raoint")
> +#define __DISABLE_RAOINT__
> +#endif /* __RAOINT__ */
> +
> +extern __inline void
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_aadd_i32 (int *__A, int __B)
> +{
> +  __builtin_ia32_aadd32 ((int *)__A, __B); }
> +
> +extern __inline void
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_aand_i32 (int *__A, int __B)
> +{
> +  __builtin_ia32_aand32 ((int *)__A, __B); }
> +
> +extern __inline void
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_aor_i32 (int *__A, int __B)
> +{
> +  __builtin_ia32_aor32 ((int *)__A, __B); }
> +
> +extern __inline void
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_axor_i32 (int *__A, int __B)
> +{
> +  __builtin_ia32_axor32 ((int *)__A, __B); }
> +
> +#ifdef __x86_64__
> +extern __inline void
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_aadd_i64 (long long *__A, long long __B) {
> +  __builtin_ia32_aadd64 ((long long *)__A, __B); }
> +
> +extern __inline void
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_aand_i64 (long long *__A, long long __B) {
> +  __builtin_ia32_aand64 ((long long *)__A, __B); }
> +
> +extern __inline void
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_aor_i64 (long long *__A, long long __B) {
> +  __builtin_ia32_aor64 ((long long *)__A, __B); }
> +
> +extern __inline void
> +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
> +_axor_i64 (long long *__A, long long __B) {
> +  __builtin_ia32_axor64 ((long long *)__A, __B); } #endif /* __x86_64__
> +*/
> +
> +#ifdef __DISABLE_RAOINT__
> +#undef __DISABLE_RAOINT__
> +#pragma GCC pop_options
> +#endif /* __DISABLE_RAOINT__ */
> +
> +#endif /* __RAOINTINTRIN_H_INCLUDED */
> +
> diff --git a/gcc/config/i386/sync.md b/gcc/config/i386/sync.md index 98a39b4e5f0..af9a1f43741 100644
> --- a/gcc/config/i386/sync.md
> +++ b/gcc/config/i386/sync.md
> @@ -40,6 +40,9 @@
>
>    ;; For CMPccXADD support
>    UNSPECV_CMPCCXADD
> +
> +  ;; For RAOINT support
> +  UNSPECV_RAOINT
>  ])
>
>  (define_expand "sse2_lfence"
> @@ -785,6 +788,19 @@
>    ""
>    "%K3xchg{<imodesuffix>}\t{%1, %0|%0, %1}")
>
> +(define_code_iterator any_plus_logic [and ior xor plus])
> +(define_code_attr plus_logic [(and "and") (ior "or") (xor "xor") (plus
> +"add")])
> +
> +(define_insn "rao_a<plus_logic><mode>"
> +  [(set (match_operand:SWI48 0 "memory_operand" "+m")
> +       (unspec_volatile:SWI48
> +         [(any_plus_logic:SWI48 (match_dup 0)
> +                               (match_operand:SWI48 1 "register_operand" "r"))
> +          (const_int 0)]      ;; MEMMODEL_RELAXED
> +         UNSPECV_RAOINT))]
> +  "TARGET_RAOINT"
> +  "a<plus_logic>\t{%1, %0|%0, %1}")
> +
>  (define_insn "atomic_add<mode>"
>    [(set (match_operand:SWI 0 "memory_operand" "+m")
>         (unspec_volatile:SWI
> diff --git a/gcc/config/i386/x86gprintrin.h b/gcc/config/i386/x86gprintrin.h index a84fbe9137d..a453404073b 100644
> --- a/gcc/config/i386/x86gprintrin.h
> +++ b/gcc/config/i386/x86gprintrin.h
> @@ -74,6 +74,8 @@
>
>  #include <pkuintrin.h>
>
> +#include <raointintrin.h>
> +
>  #include <rdseedintrin.h>
>
>  #include <rtmintrin.h>
> diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index 8ac9f9108bf..33a49338bd3 100644
> --- a/gcc/doc/extend.texi
> +++ b/gcc/doc/extend.texi
> @@ -7090,6 +7090,11 @@ Enable/disable the generation of the AMX-FP16 instructions.
>  @cindex @code{target("prefetchi")} function attribute, x86  Enable/disable the generation of the PREFETCHI instructions.
>
> +@item raoint
> +@itemx no-raoint
> +@cindex @code{target("raoint")} function attribute, x86 Enable/disable
> +the generation of the RAOINT instructions.
> +
>  @item cld
>  @itemx no-cld
>  @cindex @code{target("cld")} function attribute, x86 diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 5e2e1031e05..4f4171e3966 100644
> --- a/gcc/doc/invoke.texi
> +++ b/gcc/doc/invoke.texi
> @@ -1438,7 +1438,7 @@ See RS/6000 and PowerPC Options.
>  -mrdseed  -msgx -mavx512vp2intersect -mserialize -mtsxldtrk@gol  -mamx-tile  -mamx-int8  -mamx-bf16 -muintr -mhreset -mavxvnni@gol
>  -mavx512fp16 -mavxifma -mavxvnniint8 -mavxneconvert -mcmpccxadd -mamx-fp16 @gol --mprefetchi @gol
> +-mprefetchi -mraoint @gol
>  -mcldemote  -mms-bitfields  -mno-align-stringops  -minline-all-stringops @gol  -minline-stringops-dynamically  -mstringop-strategy=@var{alg} @gol  -mkl -mwidekl @gol @@ -32999,6 +32999,9 @@ preferred alignment to @option{-mpreferred-stack-boundary=2}.
>  @need 200
>  @itemx -mprefetchi
>  @opindex mprefetchi
> +@need 200
> +@itemx -mraoint
> +@opindex mraoint
>  These switches enable the use of instructions in the MMX, SSE,  SSE2, SSE3, SSSE3, SSE4, SSE4A, SSE4.1, SSE4.2, AVX, AVX2, AVX512F, AVX512PF,  AVX512ER, AVX512CD, AVX512VL, AVX512BW, AVX512DQ, AVX512IFMA, AVX512VBMI, SHA, @@ -33009,9 +33012,9 @@ XSAVEOPT, XSAVEC, XSAVES, RTM, HLE, TBM, MWAITX, CLZERO, PKU, AVX512VBMI2,  GFNI, VAES, WAITPKG, VPCLMULQDQ, AVX512BITALG, MOVDIRI, MOVDIR64B, AVX512BF16,  ENQCMD, AVX512VPOPCNTDQ, AVX5124FMAPS, AVX512VNNI, AVX5124VNNIW, SERIALIZE,  UINTR, HRESET, AMXTILE, AMXINT8, AMXBF16, KL, WIDEKL, AVXVNNI, AVX512FP16, -AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, AMX-FP16, PREFETCHI or CLDEMOTE -extended instruction sets. Each has a corresponding @option{-mno-} option to -disable use of these instructions.
> +AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, AMX-FP16, PREFETCHI,
> +RAOINT or CLDEMOTE extended instruction sets. Each has a corresponding
> +@option{-mno-} option to disable use of these instructions.
>
>  These extensions are also available as built-in functions: see
>  @ref{x86 Built-in Functions}, for details of the functions enabled and diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi index 58adb6516ed..fae43c98712 100644
> --- a/gcc/doc/sourcebuild.texi
> +++ b/gcc/doc/sourcebuild.texi
> @@ -2538,6 +2538,9 @@ The x86-64 target linker supports PIE with copy reloc.
>  @item prefetchi
>  Target supports the execution of @code{prefetchi} instructions.
>
> +@item raoint
> +Target supports the execution of @code{raoint} instructions.
> +
>  @item rdrand
>  Target supports x86 @code{rdrand} instruction.
>
> diff --git a/gcc/testsuite/g++.dg/other/i386-2.C b/gcc/testsuite/g++.dg/other/i386-2.C
> index ec3b1864ec0..fc910cec78a 100644
> --- a/gcc/testsuite/g++.dg/other/i386-2.C
> +++ b/gcc/testsuite/g++.dg/other/i386-2.C
> @@ -1,5 +1,5 @@
>  /* { dg-do compile { target i?86-*-* x86_64-*-* } } */
> -/* { dg-options "-O -pedantic-errors -march=k8 -msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed -mprfchw -madx -mfxsr -mxsaveopt -mavx512f -mavx512er -mavx512cd -mavx512pf -msha -mprefetchwt1 -mxsavec -mxsaves -mclflushopt  -mavx512dq -mavx512bw -mavx512vl -mavx512ifma -mavx512vbmi -mavx512vbmi2 -mavx5124fmaps -mavx5124vnniw -mavx512vpopcntdq -mclwb -mmwaitx -mclzero -mpku -msgx -mrdpid -mgfni -mavx512bitalg -mpconfig -mwbnoinvd -mavx512bf16 -menqcmd -mavx512vp2intersect -mserialize -mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -mkl -mwidekl -mavxvnni -mavx512fp16 -mavxifma -mavxvnniint8 -mavxneconvert -mcmpccxadd -mamx-fp16 -mprefetchi" } */
> +/* { dg-options "-O -pedantic-errors -march=k8 -msse4a -m3dnow -mavx
> +-mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2
> +-mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed -mprfchw
> +-madx -mfxsr -mxsaveopt -mavx512f -mavx512er -mavx512cd -mavx512pf
> +-msha -mprefetchwt1 -mxsavec -mxsaves -mclflushopt  -mavx512dq
> +-mavx512bw -mavx512vl -mavx512ifma -mavx512vbmi -mavx512vbmi2
> +-mavx5124fmaps -mavx5124vnniw -mavx512vpopcntdq -mclwb -mmwaitx
> +-mclzero -mpku -msgx -mrdpid -mgfni -mavx512bitalg -mpconfig -mwbnoinvd
> +-mavx512bf16 -menqcmd -mavx512vp2intersect -mserialize -mtsxldtrk
> +-mamx-tile -mamx-int8 -mamx-bf16 -mkl -mwidekl -mavxvnni -mavx512fp16
> +-mavxifma -mavxvnniint8 -mavxneconvert -mcmpccxadd -mamx-fp16
> +-mprefetchi -mraoint" } */
>
>  /* Test that {,x,e,p,t,s,w,a,b,i}mmintrin.h, mm3dnow.h, fma4intrin.h,
>     xopintrin.h, abmintrin.h, bmiintrin.h, tbmintrin.h, lwpintrin.h, diff --git a/gcc/testsuite/g++.dg/other/i386-3.C b/gcc/testsuite/g++.dg/other/i386-3.C
> index 542275ca057..64741b11685 100644
> --- a/gcc/testsuite/g++.dg/other/i386-3.C
> +++ b/gcc/testsuite/g++.dg/other/i386-3.C
> @@ -1,5 +1,5 @@
>  /* { dg-do compile { target i?86-*-* x86_64-*-* } } */
> -/* { dg-options "-O -fkeep-inline-functions -march=k8 -msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed -mprfchw -madx -mfxsr -mxsaveopt -mavx512f -mavx512er -mavx512cd -mavx512pf -msha -mprefetchwt1 -mxsavec -mxsaves -mclflushopt -mavx512dq -mavx512bw -mavx512vl -mavx512ifma -mavx512vbmi -mavx512vbmi2 -mavx5124fmaps -mavx5124vnniw -mavx512vpopcntdq -mclwb -mmwaitx -mclzero -mpku -msgx -mrdpid -mgfni -mavx512bitalg -mpconfig -mwbnoinvd -mavx512bf16 -menqcmd -mavx512vp2intersect -mserialize -mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -mkl -mwidekl -mavxvnni -mavx512fp16 -mavxifma -mavxvnniint8 -mavxneconvert -mcmpccxadd -mamx-fp16 -mprefetchi" } */
> +/* { dg-options "-O -fkeep-inline-functions -march=k8 -msse4a -m3dnow
> +-mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi
> +-mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed
> +-mprfchw -madx -mfxsr -mxsaveopt -mavx512f -mavx512er -mavx512cd
> +-mavx512pf -msha -mprefetchwt1 -mxsavec -mxsaves -mclflushopt
> +-mavx512dq -mavx512bw -mavx512vl -mavx512ifma -mavx512vbmi
> +-mavx512vbmi2 -mavx5124fmaps -mavx5124vnniw -mavx512vpopcntdq -mclwb
> +-mmwaitx -mclzero -mpku -msgx -mrdpid -mgfni -mavx512bitalg -mpconfig
> +-mwbnoinvd -mavx512bf16 -menqcmd -mavx512vp2intersect -mserialize
> +-mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -mkl -mwidekl -mavxvnni
> +-mavx512fp16 -mavxifma -mavxvnniint8 -mavxneconvert -mcmpccxadd
> +-mamx-fp16 -mprefetchi -mraoint" } */
>
>  /* Test that {,x,e,p,t,s,w,a,b,i}mmintrin.h, mm3dnow.h, fma4intrin.h,
>     xopintrin.h, abmintrin.h, bmiintrin.h, tbmintrin.h, lwpintrin.h, diff --git a/gcc/testsuite/gcc.target/i386/funcspec-56.inc b/gcc/testsuite/gcc.target/i386/funcspec-56.inc
> index 1dca8b060d3..7eb18c6952d 100644
> --- a/gcc/testsuite/gcc.target/i386/funcspec-56.inc
> +++ b/gcc/testsuite/gcc.target/i386/funcspec-56.inc
> @@ -86,6 +86,7 @@ extern void test_avxneconvert (void)          __attribute__((__target__("avxneconvert"))
>  extern void test_cmpccxadd (void)              __attribute__((__target__("cmpccxadd")));
>  extern void test_amx_fp16 (void)               __attribute__((__target__("amx-fp16")));
>  extern void test_prefetchi (void)               __attribute__((__target__("prefetchi")));
> +extern void test_raoint (void)                  __attribute__((__target__("raoint")));
>
>  extern void test_no_sgx (void)                 __attribute__((__target__("no-sgx")));
>  extern void test_no_avx5124fmaps(void)         __attribute__((__target__("no-avx5124fmaps")));
> @@ -173,6 +174,7 @@ extern void test_no_avxneconvert (void)             __attribute__((__target__("no-avxneconv
>  extern void test_no_cmpccxadd (void)            __attribute__((__target__("no-cmpccxadd")));
>  extern void test_no_amx_fp16 (void)            __attribute__((__target__("no-amx-fp16")));
>  extern void test_no_prefetchi (void)            __attribute__((__target__("no-prefetchi")));
> +extern void test_no_raoint (void)               __attribute__((__target__("no-raoint")));
>
>  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/rao-helper.h b/gcc/testsuite/gcc.target/i386/rao-helper.h
> new file mode 100644
> index 00000000000..df385516f48
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/rao-helper.h
> @@ -0,0 +1,79 @@
> +#include <immintrin.h>
> +#include <stdint.h>
> +#include <pthread.h>
> +#include <string.h>
> +#ifdef DEBUG
> +#include <stdio.h>
> +#endif
> +#include "cpuid.h"
> +
> +typedef struct {
> +  uint32_t id; /* filled in by launch_threads. */ } state_t;
> +
> +static pthread_t* threads = 0;
> +static state_t* thread_state = 0;
> +static const unsigned int num_threads = 4;
> +
> +static void* threads_worker (state_t *tstate);
> +
> +void launch_threads (uint32_t nthreads,
> +                     void* (*worker)(state_t*),
> +                     state_t* tstate_proto) {
> +  int i;
> +  thread_state = malloc (sizeof (state_t) *nthreads);
> +  threads = malloc (sizeof (pthread_t) *nthreads);
> +  memset (threads, 0, sizeof (pthread_t) *nthreads);
> +  for(i = 0; i < nthreads; i++)
> +    {
> +      memcpy (thread_state + i, tstate_proto, sizeof (state_t));
> +      thread_state[i].id = i;
> +      pthread_create (threads+i, NULL,
> +                      (void* (*)(void*))worker,
> +                     (void*) (thread_state+i));
> +    }
> +}
> +
> +void wait()
> +{
> +  int i;
> +  for(i = 0; i < num_threads; i++)
> +    pthread_join (threads[i], 0);
> +  free (threads);
> +  threads = 0;
> +  free (thread_state);
> +  thread_state  = 0;
> +}
> +
> +#ifndef DO_TEST
> +#define DO_TEST do_test
> +static void rao_test (void);
> +__attribute__ ((noinline))
> +static void
> +do_test (void)
> +{
> +  state_t tstate_proto;
> +  launch_threads(num_threads, threads_worker, &tstate_proto);
> +  wait();
> +  rao_test ();
> +}
> +#endif
> +
> +int
> +main()
> +{
> +  if (__builtin_cpu_supports ("raoint"))
> +    {
> +      DO_TEST ();
> +#ifdef DEBUG
> +      printf ("PASSED\n");
> +#endif
> +    }
> +#ifdef DEBUG
> +  else
> +    printf ("SKIPPED\n");
> +#endif
> +
> +  return 0;
> +}
> diff --git a/gcc/testsuite/gcc.target/i386/raoint-1.c b/gcc/testsuite/gcc.target/i386/raoint-1.c
> new file mode 100644
> index 00000000000..d4f880ee304
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/raoint-1.c
> @@ -0,0 +1,31 @@
> +/* { dg-do compile } */
> +/* { dg-options "-mraoint -O2" } */
> +/* { dg-final { scan-assembler-times "aadd" 2 { target {! ia32 } } } }
> +*/
> +/* { dg-final { scan-assembler-times "aand" 2 { target {! ia32 } } } }
> +*/
> +/* { dg-final { scan-assembler-times "aor" 2 { target {! ia32 } } } }
> +*/
> +/* { dg-final { scan-assembler-times "axor" 2 { target {! ia32 } } } }
> +*/
> +/* { dg-final { scan-assembler-times "aadd" 1 { target ia32 } } } */
> +/* { dg-final { scan-assembler-times "aand" 1 { target ia32 } } } */
> +/* { dg-final { scan-assembler-times "aor" 1 { target ia32 } } } */
> +/* { dg-final { scan-assembler-times "axor" 1 { target ia32 } } } */
> +#include <immintrin.h>
> +
> +volatile int x;
> +volatile long long y;
> +int *a;
> +long long *b;
> +
> +void extern
> +rao_int_test (void)
> +{
> +  _aadd_i32 (a, x);
> +  _aand_i32 (a, x);
> +  _aor_i32 (a, x);
> +  _axor_i32 (a, x);
> +#ifdef __x86_64__
> +  _aadd_i64 (b, y);
> +  _aand_i64 (b, y);
> +  _aor_i64 (b, y);
> +  _axor_i64 (b, y);
> +#endif
> +}
> diff --git a/gcc/testsuite/gcc.target/i386/raoint-aadd-2.c b/gcc/testsuite/gcc.target/i386/raoint-aadd-2.c
> new file mode 100644
> index 00000000000..8ae9bc25b17
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/raoint-aadd-2.c
> @@ -0,0 +1,24 @@
> +/* { dg-do run { target { *-*-linux* && { ! ia32 } } } }*/
> +/* { dg-require-effective-target raoint }*/
> +/* { dg-options "-pthread -O2 -mraoint" }*/ #include "rao-helper.h"
> +
> +const unsigned int inc_val = 3;
> +const unsigned int num_iters= 1000000;
> +static long long shared_val = 0;
> +
> +static
> +void* threads_worker (state_t *tstate)
> +{
> +  int i;
> +  for (i = 0; i < num_iters; i++)
> +     _aadd_i64 (&shared_val, inc_val);
> +  return 0;
> +}
> +
> +static void
> +rao_test (void)
> +{
> +  if (shared_val != num_iters * num_threads * inc_val)
> +    abort ();
> +}
> diff --git a/gcc/testsuite/gcc.target/i386/raoint-aand-2.c b/gcc/testsuite/gcc.target/i386/raoint-aand-2.c
> new file mode 100644
> index 00000000000..40bc1d71621
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/raoint-aand-2.c
> @@ -0,0 +1,25 @@
> +/* { dg-do run { target { *-*-linux* && { ! ia32 } } } }*/
> +/* { dg-require-effective-target raoint }*/
> +/* { dg-options "-pthread -O2 -mraoint" }*/ #include "rao-helper.h"
> +
> +const unsigned int num_iters= 1000000;
> +unsigned int thread_val[4] = { 0xffffff5a, 0xffff96ff, 0xff73ffff,
> +0xceffffff }; static long long shared_val = 0xffffffff; unsigned int
> +expected_val = 0xce73965a;
> +
> +static void*
> +threads_worker (state_t *tstate)
> +{
> +  int i;
> +  unsigned int val = thread_val[tstate->id];
> +  for (i = 0; i < num_iters; i++)
> +    _aand_i64 (&shared_val, val);
> +}
> +
> +static void
> +rao_test(void)
> +{
> +  if (shared_val != expected_val)
> +    abort ();
> +}
> diff --git a/gcc/testsuite/gcc.target/i386/raoint-aor-2.c b/gcc/testsuite/gcc.target/i386/raoint-aor-2.c
> new file mode 100644
> index 00000000000..ec7f7cc1689
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/raoint-aor-2.c
> @@ -0,0 +1,25 @@
> +/* { dg-do run { target { *-*-linux* && { ! ia32 } } } }*/
> +/* { dg-require-effective-target raoint }*/
> +/* { dg-options "-pthread -O2 -mraoint" }*/ #include "rao-helper.h"
> +
> +const unsigned int num_iters= 1000000;
> +unsigned int thread_val[4] = { 0x5a, 0x9600, 0x730000, 0xce000000 };
> +static long long shared_val = 0; unsigned int expected_val =
> +0xce73965a;
> +
> +static void*
> +threads_worker (state_t *tstate)
> +{
> +  int i;
> +  unsigned int val = thread_val[tstate->id];
> +  for (i = 0; i < num_iters; i++)
> +    _aor_i64 (&shared_val, val);
> +}
> +
> +static void
> +rao_test (void)
> +{
> +  if (shared_val != expected_val)
> +    abort ();
> +}
> diff --git a/gcc/testsuite/gcc.target/i386/raoint-axor-2.c b/gcc/testsuite/gcc.target/i386/raoint-axor-2.c
> new file mode 100644
> index 00000000000..a875592a486
> --- /dev/null
> +++ b/gcc/testsuite/gcc.target/i386/raoint-axor-2.c
> @@ -0,0 +1,25 @@
> +/* { dg-do run { target { *-*-linux* && { ! ia32 } } } }*/
> +/* { dg-require-effective-target raoint }*/
> +/* { dg-options "-pthread -O2 -mraoint" }*/ #include "rao-helper.h"
> +
> +const unsigned int num_iters= 1000001;
> +unsigned int thread_val[4] = { 0x5a, 0x9600, 0x730000, 0xce000000 };
> +static long long shared_val = 0; unsigned int expected_val =
> +0xce73965a;
> +
> +static void*
> +threads_worker (state_t *tstate)
> +{
> +  int i;
> +  unsigned int val = thread_val[tstate->id];
> +  for (i = 0; i < num_iters; i++)
> +    _axor_i64 (&shared_val, val);
> +}
> +
> +static void
> +rao_test (void)
> +{
> +  if (shared_val != expected_val)
> +    abort ();
> +}
> diff --git a/gcc/testsuite/gcc.target/i386/sse-12.c b/gcc/testsuite/gcc.target/i386/sse-12.c
> index 8c556f3fcc5..c5b2a18945c 100644
> --- a/gcc/testsuite/gcc.target/i386/sse-12.c
> +++ b/gcc/testsuite/gcc.target/i386/sse-12.c
> @@ -3,7 +3,7 @@
>     popcntintrin.h gfniintrin.h and mm_malloc.h are usable
>     with -O -std=c89 -pedantic-errors.  */
>  /* { dg-do compile } */
> -/* { dg-options "-O -std=c89 -pedantic-errors -march=k8 -msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed -mprfchw -madx -mfxsr -mxsaveopt -mavx512f -mavx512er -mavx512cd -mavx512pf -msha -mprefetchwt1 -mxsavec -mxsaves -mclflushopt -mavx512bw -mavx512dq -mavx512vl -mavx512vbmi -mavx512vbmi2 -mavx512ifma -mavx5124fmaps -mavx5124vnniw -mavx512vpopcntdq -mclwb -mmwaitx -mclzero -mpku -msgx -mrdpid -mgfni -mavx512bitalg -mpconfig -mwbnoinvd -mavx512bf16 -menqcmd -mavx512vp2intersect -mserialize -mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -mkl -mwidekl -mavxvnni -mavxifma -mavxvnniint8 -mavxneconvert -mamx-fp16 -mprefetchi" } */
> +/* { dg-options "-O -std=c89 -pedantic-errors -march=k8 -msse4a -m3dnow
> +-mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi
> +-mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed
> +-mprfchw -madx -mfxsr -mxsaveopt -mavx512f -mavx512er -mavx512cd
> +-mavx512pf -msha -mprefetchwt1 -mxsavec -mxsaves -mclflushopt
> +-mavx512bw -mavx512dq -mavx512vl -mavx512vbmi -mavx512vbmi2
> +-mavx512ifma -mavx5124fmaps -mavx5124vnniw -mavx512vpopcntdq -mclwb
> +-mmwaitx -mclzero -mpku -msgx -mrdpid -mgfni -mavx512bitalg -mpconfig
> +-mwbnoinvd -mavx512bf16 -menqcmd -mavx512vp2intersect -mserialize
> +-mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -mkl -mwidekl -mavxvnni
> +-mavxifma -mavxvnniint8 -mavxneconvert -mamx-fp16 -mprefetchi -mraoint"
> +} */
>
>  #include <x86intrin.h>
>
> diff --git a/gcc/testsuite/gcc.target/i386/sse-13.c b/gcc/testsuite/gcc.target/i386/sse-13.c
> index ee5ba5ae4d5..858d5744b76 100644
> --- a/gcc/testsuite/gcc.target/i386/sse-13.c
> +++ b/gcc/testsuite/gcc.target/i386/sse-13.c
> @@ -1,5 +1,5 @@
>  /* { dg-do compile } */
> -/* { dg-options "-O2 -Werror-implicit-function-declaration -march=k8 -msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed -mprfchw -madx -mfxsr -mxsaveopt -mavx512f -mavx512er -mavx512cd -mavx512pf -msha -mprefetchwt1 -mxsavec -mxsaves -mclflushopt -mavx512vl -mavx512dq -mavx512bw -mavx512vbmi -mavx512vbmi2 -mavx512ifma -mavx5124fmaps -mavx5124vnniw -mavx512vpopcntdq -mavx512vp2intersect -mclwb -mmwaitx -mclzero -mpku -msgx -mrdpid -mgfni -mavx512bitalg -mpconfig -mwbnoinvd -mavx512bf16 -menqcmd -mserialize -mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -mkl -mwidekl -mavxvnni -mavx512fp16 -mavxifma -mavxvnniint8 -mavxneconvert -mcmpccxadd -mamx-fp16 -mprefetchi" } */
> +/* { dg-options "-O2 -Werror-implicit-function-declaration -march=k8
> +-msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm
> +-mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm
> +-mrdseed -mprfchw -madx -mfxsr -mxsaveopt -mavx512f -mavx512er
> +-mavx512cd -mavx512pf -msha -mprefetchwt1 -mxsavec -mxsaves
> +-mclflushopt -mavx512vl -mavx512dq -mavx512bw -mavx512vbmi
> +-mavx512vbmi2 -mavx512ifma -mavx5124fmaps -mavx5124vnniw
> +-mavx512vpopcntdq -mavx512vp2intersect -mclwb -mmwaitx -mclzero -mpku
> +-msgx -mrdpid -mgfni -mavx512bitalg -mpconfig -mwbnoinvd -mavx512bf16
> +-menqcmd -mserialize -mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -mkl
> +-mwidekl -mavxvnni -mavx512fp16 -mavxifma -mavxvnniint8 -mavxneconvert
> +-mcmpccxadd -mamx-fp16 -mprefetchi -mraoint" } */
>  /* { dg-add-options bind_pic_locally } */
>
>  #include <mm_malloc.h>
> diff --git a/gcc/testsuite/gcc.target/i386/sse-14.c b/gcc/testsuite/gcc.target/i386/sse-14.c
> index 4f3bd70d03e..18d97fea2e9 100644
> --- a/gcc/testsuite/gcc.target/i386/sse-14.c
> +++ b/gcc/testsuite/gcc.target/i386/sse-14.c
> @@ -1,5 +1,5 @@
>  /* { dg-do compile } */
> -/* { dg-options "-O0 -Werror-implicit-function-declaration -march=k8 -msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed -mprfchw -madx -mfxsr -mxsaveopt -mavx512f -mavx512er -mavx512cd -mavx512pf -msha -mprefetchwt1 -mxsavec -mxsaves -mclflushopt -mavx512dq -mavx512bw -mavx512vl -mavx512ifma -mavx512vbmi -mavx512vbmi2 -mavx5124fmaps -mavx5124vnniw -mavx512vpopcntdq -mclwb -mmwaitx -mclzero -mpku -msgx -mrdpid -mgfni -mpconfig -mwbnoinvd -mavx512vl -mavx512bf16 -menqcmd -mavx512vp2intersect -mserialize -mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -mkl -mwidekl -mavxvnni -mavx512fp16 -mavxifma -mavxvnniint8 -mavxneconvert -mamx-fp16 -mprefetchi" } */
> +/* { dg-options "-O0 -Werror-implicit-function-declaration -march=k8
> +-msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm
> +-mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm
> +-mrdseed -mprfchw -madx -mfxsr -mxsaveopt -mavx512f -mavx512er
> +-mavx512cd -mavx512pf -msha -mprefetchwt1 -mxsavec -mxsaves
> +-mclflushopt -mavx512dq -mavx512bw -mavx512vl -mavx512ifma -mavx512vbmi
> +-mavx512vbmi2 -mavx5124fmaps -mavx5124vnniw -mavx512vpopcntdq -mclwb
> +-mmwaitx -mclzero -mpku -msgx -mrdpid -mgfni -mpconfig -mwbnoinvd
> +-mavx512vl -mavx512bf16 -menqcmd -mavx512vp2intersect -mserialize
> +-mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -mkl -mwidekl -mavxvnni
> +-mavx512fp16 -mavxifma -mavxvnniint8 -mavxneconvert -mamx-fp16
> +-mprefetchi -mraoint" } */
>  /* { dg-add-options bind_pic_locally } */
>
>  #include <mm_malloc.h>
> diff --git a/gcc/testsuite/gcc.target/i386/sse-22.c b/gcc/testsuite/gcc.target/i386/sse-22.c
> index 8bd046b19c2..0d9965e284e 100644
> --- a/gcc/testsuite/gcc.target/i386/sse-22.c
> +++ b/gcc/testsuite/gcc.target/i386/sse-22.c
> @@ -103,7 +103,7 @@
>
>
>  #ifndef DIFFERENT_PRAGMAS
> -#pragma GCC target ("sse4a,3dnow,avx,avx2,fma4,xop,aes,pclmul,popcnt,abm,lzcnt,bmi,bmi2,tbm,lwp,fsgsbase,rdrnd,f16c,rtm,rdseed,prfchw,adx,fxsr,xsaveopt,avx512f,avx512er,avx512cd,avx512pf,sha,prefetchwt1,avx512vl,avx512bw,avx512dq,avx512vbmi,avx512vbmi2,avx512ifma,avx5124fmaps,avx5124vnniw,avx512vpopcntdq,gfni,avx512bitalg,avx512bf16,avx512vp2intersect,serialize,tsxldtrk,amx-tile,amx-int8,amx-bf16,kl,widekl,avxvnni,avx512fp16,avxifma,avxvnniint8,avxneconvert,amx-fp16,prefetchi")
> +#pragma GCC target
> +("sse4a,3dnow,avx,avx2,fma4,xop,aes,pclmul,popcnt,abm,lzcnt,bmi,bmi2,tb
> +m,lwp,fsgsbase,rdrnd,f16c,rtm,rdseed,prfchw,adx,fxsr,xsaveopt,avx512f,a
> +vx512er,avx512cd,avx512pf,sha,prefetchwt1,avx512vl,avx512bw,avx512dq,av
> +x512vbmi,avx512vbmi2,avx512ifma,avx5124fmaps,avx5124vnniw,avx512vpopcnt
> +dq,gfni,avx512bitalg,avx512bf16,avx512vp2intersect,serialize,tsxldtrk,a
> +mx-tile,amx-int8,amx-bf16,kl,widekl,avxvnni,avx512fp16,avxifma,avxvnnii
> +nt8,avxneconvert,amx-fp16,prefetchi,raoint")
>  #endif
>
>  /* Following intrinsics require immediate arguments.  They @@ -220,7 +220,7 @@ test_4 (_mm_cmpestrz, int, __m128i, int, __m128i, int, 1)
>
>  /* immintrin.h (AVX/AVX2/RDRND/FSGSBASE/F16C/RTM/AVX512F/SHA) */  #ifdef DIFFERENT_PRAGMAS -#pragma GCC target ("avx,avx2,rdrnd,fsgsbase,f16c,rtm,avx512f,avx512er,avx512cd,avx512pf,sha,avx512vl,avx512bw,avx512dq,avx512ifma,avx512vbmi,avx512vbmi2,avx5124fmaps,avx5124vnniw,avx512vpopcntdq,gfni,avx512bitalg,avx512bf16,avx512vp2intersect,serialize,tsxldtrk,amx-tile,amx-int8,amx-bf16,kl,widekl,avxvnni,avx512fp16,avxifma,avxvnniint8,avxneconvert,amx-fp16,prefetchi")
> +#pragma GCC target
> +("avx,avx2,rdrnd,fsgsbase,f16c,rtm,avx512f,avx512er,avx512cd,avx512pf,s
> +ha,avx512vl,avx512bw,avx512dq,avx512ifma,avx512vbmi,avx512vbmi2,avx5124
> +fmaps,avx5124vnniw,avx512vpopcntdq,gfni,avx512bitalg,avx512bf16,avx512v
> +p2intersect,serialize,tsxldtrk,amx-tile,amx-int8,amx-bf16,kl,widekl,avx
> +vnni,avx512fp16,avxifma,avxvnniint8,avxneconvert,amx-fp16,prefetchi,rao
> +int")
>  #endif
>  #include <immintrin.h>
>  test_1 (_cvtss_sh, unsigned short, float, 1) diff --git a/gcc/testsuite/gcc.target/i386/sse-23.c b/gcc/testsuite/gcc.target/i386/sse-23.c
> index 16ac9c9b7a4..c9bfd75aa92 100644
> --- a/gcc/testsuite/gcc.target/i386/sse-23.c
> +++ b/gcc/testsuite/gcc.target/i386/sse-23.c
> @@ -847,6 +847,6 @@
>  #define __builtin_ia32_cmpccxadd(A, B, C, D) __builtin_ia32_cmpccxadd(A, B, C, 1)  #define __builtin_ia32_cmpccxadd64(A, B, C, D) __builtin_ia32_cmpccxadd64(A, B, C, 1)
>
> -#pragma GCC target ("sse4a,3dnow,avx,avx2,fma4,xop,aes,pclmul,popcnt,abm,lzcnt,bmi,bmi2,tbm,lwp,fsgsbase,rdrnd,f16c,fma,rtm,rdseed,prfchw,adx,fxsr,xsaveopt,avx512f,avx512er,avx512cd,avx512pf,sha,prefetchwt1,xsavec,xsaves,clflushopt,avx512bw,avx512dq,avx512vl,avx512vbmi,avx512ifma,avx5124fmaps,avx5124vnniw,avx512vpopcntdq,clwb,mwaitx,clzero,pku,sgx,rdpid,gfni,avx512vbmi2,vpclmulqdq,avx512bitalg,pconfig,wbnoinvd,avx512bf16,enqcmd,avx512vp2intersect,serialize,tsxldtrk,amx-tile,amx-int8,amx-bf16,kl,widekl,avxvnni,avx512fp16,avxifma,avxvnniint8,avxneconvert,cmpccxadd,amx-fp16,prefetchi")
> +#pragma GCC target
> +("sse4a,3dnow,avx,avx2,fma4,xop,aes,pclmul,popcnt,abm,lzcnt,bmi,bmi2,tb
> +m,lwp,fsgsbase,rdrnd,f16c,fma,rtm,rdseed,prfchw,adx,fxsr,xsaveopt,avx51
> +2f,avx512er,avx512cd,avx512pf,sha,prefetchwt1,xsavec,xsaves,clflushopt,
> +avx512bw,avx512dq,avx512vl,avx512vbmi,avx512ifma,avx5124fmaps,avx5124vn
> +niw,avx512vpopcntdq,clwb,mwaitx,clzero,pku,sgx,rdpid,gfni,avx512vbmi2,v
> +pclmulqdq,avx512bitalg,pconfig,wbnoinvd,avx512bf16,enqcmd,avx512vp2inte
> +rsect,serialize,tsxldtrk,amx-tile,amx-int8,amx-bf16,kl,widekl,avxvnni,a
> +vx512fp16,avxifma,avxvnniint8,avxneconvert,cmpccxadd,amx-fp16,prefetchi
> +,raoint")
>
>  #include <x86intrin.h>
> diff --git a/gcc/testsuite/gcc.target/i386/x86gprintrin-1.c b/gcc/testsuite/gcc.target/i386/x86gprintrin-1.c
> index 76de89d0cb7..6325ff9f5ba 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 -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 -mno-sse -mno-mmx" } */
>  /* { dg-additional-options "-mcmpccxadd -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 aefad77f864..9c9e87c42c7 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 -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 -mno-sse -mno-mmx" } */
>  /* { dg-add-options bind_pic_locally } */
>  /* { dg-additional-options "-mcmpccxadd -muintr" { target { ! ia32 } } }  */
>
> diff --git a/gcc/testsuite/gcc.target/i386/x86gprintrin-3.c b/gcc/testsuite/gcc.target/i386/x86gprintrin-3.c
> index 261c9180aa0..3a3c344a78a 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 -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 -mno-sse -mno-mmx" } */
>  /* { dg-add-options bind_pic_locally } */
>  /* { dg-additional-options "-mcmpccxadd -muintr" { target { ! ia32 } } }  */
>
> diff --git a/gcc/testsuite/gcc.target/i386/x86gprintrin-4.c b/gcc/testsuite/gcc.target/i386/x86gprintrin-4.c
> index 7f76b870934..b1bbda31237 100644
> --- a/gcc/testsuite/gcc.target/i386/x86gprintrin-4.c
> +++ b/gcc/testsuite/gcc.target/i386/x86gprintrin-4.c
> @@ -15,9 +15,9 @@
>
>  #ifndef DIFFERENT_PRAGMAS
>  #ifdef __x86_64__
> -#pragma GCC target ("adx,bmi,bmi2,cmpccxadd,fsgsbase,fxsr,hreset,lwp,lzcnt,popcnt,rdrnd,rdseed,tbm,rtm,serialize,tsxldtrk,uintr,xsaveopt")
> +#pragma GCC target
> +("adx,bmi,bmi2,cmpccxadd,fsgsbase,fxsr,hreset,lwp,lzcnt,popcnt,raoint,r
> +drnd,rdseed,tbm,rtm,serialize,tsxldtrk,uintr,xsaveopt")
>  #else
> -#pragma GCC target ("adx,bmi,bmi2,fsgsbase,fxsr,hreset,lwp,lzcnt,popcnt,rdrnd,rdseed,tbm,rtm,serialize,tsxldtrk,xsaveopt")
> +#pragma GCC target
> +("adx,bmi,bmi2,fsgsbase,fxsr,hreset,lwp,lzcnt,popcnt,raoint,rdrnd,rdsee
> +d,tbm,rtm,serialize,tsxldtrk,xsaveopt")
>  #endif
>  #endif
>
> diff --git a/gcc/testsuite/gcc.target/i386/x86gprintrin-5.c b/gcc/testsuite/gcc.target/i386/x86gprintrin-5.c
> index 54d826c4f46..e3ad67d1e77 100644
> --- a/gcc/testsuite/gcc.target/i386/x86gprintrin-5.c
> +++ b/gcc/testsuite/gcc.target/i386/x86gprintrin-5.c
> @@ -32,9 +32,9 @@
>  #define __builtin_ia32_cmpccxadd64(A, B, C, D) __builtin_ia32_cmpccxadd64(A, B, C, 1)
>
>  #ifdef __x86_64__
> -#pragma GCC target ("adx,bmi,bmi2,clflushopt,clwb,clzero,cmpccxadd,enqcmd,fsgsbase,fxsr,hreset,lwp,lzcnt,mwaitx,pconfig,pku,popcnt,rdpid,rdrnd,rdseed,tbm,rtm,serialize,sgx,tsxldtrk,uintr,xsavec,xsaveopt,xsaves,wbnoinvd")
> +#pragma GCC target
> +("adx,bmi,bmi2,clflushopt,clwb,clzero,cmpccxadd,enqcmd,fsgsbase,fxsr,hr
> +eset,lwp,lzcnt,mwaitx,pconfig,pku,popcnt,raoint,rdpid,rdrnd,rdseed,tbm,
> +rtm,serialize,sgx,tsxldtrk,uintr,xsavec,xsaveopt,xsaves,wbnoinvd")
>  #else
> -#pragma GCC target ("adx,bmi,bmi2,clflushopt,clwb,clzero,enqcmd,fsgsbase,fxsr,hreset,lwp,lzcnt,mwaitx,pconfig,pku,popcnt,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,l
> +zcnt,mwaitx,pconfig,pku,popcnt,raoint,rdpid,rdrnd,rdseed,tbm,rtm,serial
> +ize,sgx,tsxldtrk,xsavec,xsaveopt,xsaves,wbnoinvd")
>  #endif
>
>  #include <x86gprintrin.h>
> diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
> index 30e192f4d46..c7f583d6d14 100644
> --- a/gcc/testsuite/lib/target-supports.exp
> +++ b/gcc/testsuite/lib/target-supports.exp
> @@ -9571,6 +9571,17 @@ proc check_effective_target_cmpccxadd { } {
>      } "-mcmpccxadd" ]
>  }
>
> +# Return 1 if raoint instructions can be compiled.
> +proc check_effective_target_raoint { } {
> +    return [check_no_compiler_messages raoint object {
> +       void
> +       _aadd_si32 (int *__A, int __B)
> +       {
> +         return __builtin_ia32_aadd32((int *)__A, __B);
> +       }
> +    } "-mraoint" ]
> +}
> +
>  # Return 1 if sse instructions can be compiled.
>  proc check_effective_target_sse { } {
>      return [check_no_compiler_messages sse object {
> --
> 2.27.0
>
  

Patch

diff --git a/gcc/common/config/i386/cpuinfo.h b/gcc/common/config/i386/cpuinfo.h
index 42c25b8a636..df3500adc83 100644
--- a/gcc/common/config/i386/cpuinfo.h
+++ b/gcc/common/config/i386/cpuinfo.h
@@ -850,6 +850,8 @@  get_available_features (struct __processor_model *cpu_model,
 	set_feature(FEATURE_CMPCCXADD);
       if (edx & bit_PREFETCHI)
 	set_feature (FEATURE_PREFETCHI);
+      if (eax & bit_RAOINT)
+	set_feature (FEATURE_RAOINT);
       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 c828ae5b7d7..60a193a651c 100644
--- a/gcc/common/config/i386/i386-common.cc
+++ b/gcc/common/config/i386/i386-common.cc
@@ -113,6 +113,7 @@  along with GCC; see the file COPYING3.  If not see  #define OPTION_MASK_ISA2_CMPCCXADD_SET OPTION_MASK_ISA2_CMPCCXADD  #define OPTION_MASK_ISA2_AMX_FP16_SET OPTION_MASK_ISA2_AMX_FP16  #define OPTION_MASK_ISA2_PREFETCHI_SET OPTION_MASK_ISA2_PREFETCHI
+#define OPTION_MASK_ISA2_RAOINT_SET OPTION_MASK_ISA2_RAOINT
 
 /* SSE4 includes both SSE4.1 and SSE4.2. -msse4 should be the same
    as -msse4.2.  */
@@ -289,6 +290,7 @@  along with GCC; see the file COPYING3.  If not see  #define OPTION_MASK_ISA2_CMPCCXADD_UNSET OPTION_MASK_ISA2_CMPCCXADD  #define OPTION_MASK_ISA2_AMX_FP16_UNSET OPTION_MASK_ISA2_AMX_FP16  #define OPTION_MASK_ISA2_PREFETCHI_UNSET OPTION_MASK_ISA2_PREFETCHI
+#define OPTION_MASK_ISA2_RAOINT_UNSET OPTION_MASK_ISA2_RAOINT
 
 /* SSE4 includes both SSE4.1 and SSE4.2.  -mno-sse4 should the same
    as -mno-sse4.1. */
@@ -1226,6 +1228,19 @@  ix86_handle_option (struct gcc_options *opts,
 	}
       return true;
 
+    case OPT_mraoint:
+      if (value)
+	{
+	  opts->x_ix86_isa_flags2 |= OPTION_MASK_ISA2_RAOINT_SET;
+	  opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_RAOINT_SET;
+	}
+      else
+	{
+	  opts->x_ix86_isa_flags2 &= ~OPTION_MASK_ISA2_RAOINT_UNSET;
+	  opts->x_ix86_isa_flags2_explicit |= OPTION_MASK_ISA2_RAOINT_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 c06f089b0c5..345fda648ff 100644
--- a/gcc/common/config/i386/i386-cpuinfo.h
+++ b/gcc/common/config/i386/i386-cpuinfo.h
@@ -251,6 +251,7 @@  enum processor_features
   FEATURE_CMPCCXADD,
   FEATURE_AMX_FP16,
   FEATURE_PREFETCHI,
+  FEATURE_RAOINT,
   CPU_FEATURE_MAX
 };
 
diff --git a/gcc/common/config/i386/i386-isas.h b/gcc/common/config/i386/i386-isas.h
index 8648ea6903c..ba2c2d94534 100644
--- a/gcc/common/config/i386/i386-isas.h
+++ b/gcc/common/config/i386/i386-isas.h
@@ -183,4 +183,5 @@  ISA_NAMES_TABLE_START
   ISA_NAMES_TABLE_ENTRY("cmpccxadd", FEATURE_CMPCCXADD, P_NONE, "-mcmpccxadd")
   ISA_NAMES_TABLE_ENTRY("amx-fp16", FEATURE_AMX_FP16, P_NONE, "-mamx-fp16")
   ISA_NAMES_TABLE_ENTRY("prefetchi", FEATURE_PREFETCHI, P_NONE, "-mprefetchi")
+  ISA_NAMES_TABLE_ENTRY("raoint", FEATURE_RAOINT, P_NONE, "-mraoint")
 ISA_NAMES_TABLE_END
diff --git a/gcc/config.gcc b/gcc/config.gcc index 03c1523f7af..ceaeaebf059 100644
--- a/gcc/config.gcc
+++ b/gcc/config.gcc
@@ -423,7 +423,8 @@  i[34567]86-*-* | x86_64-*-*)
 		       hresetintrin.h keylockerintrin.h avxvnniintrin.h
 		       mwaitintrin.h avx512fp16intrin.h avx512fp16vlintrin.h
 		       avxifmaintrin.h avxvnniint8intrin.h avxneconvertintrin.h
-		       cmpccxaddintrin.h amxfp16intrin.h prfchiintrin.h"
+		       cmpccxaddintrin.h amxfp16intrin.h prfchiintrin.h
+		       raointintrin.h"
 	;;
 ia64-*-*)
 	extra_headers=ia64intrin.h
diff --git a/gcc/config/i386/cpuid.h b/gcc/config/i386/cpuid.h index 92583261883..a33abf35cc0 100644
--- a/gcc/config/i386/cpuid.h
+++ b/gcc/config/i386/cpuid.h
@@ -25,6 +25,7 @@ 
 #define _CPUID_H_INCLUDED
 
 /* %eax */
+#define bit_RAOINT	(1 << 3)
 #define bit_AVXVNNI	(1 << 4)
 #define bit_AVX512BF16	(1 << 5)
 #define bit_CMPCCXADD	(1 << 7)
diff --git a/gcc/config/i386/i386-builtin.def b/gcc/config/i386/i386-builtin.def
index c272c392d03..2d683514f87 100644
--- a/gcc/config/i386/i386-builtin.def
+++ b/gcc/config/i386/i386-builtin.def
@@ -415,6 +415,16 @@  BDESC (OPTION_MASK_ISA_AVX512BW, 0, CODE_FOR_avx512bw_truncatev32hiv32qi2_mask_s
 BDESC (0, OPTION_MASK_ISA2_AVX512FP16, CODE_FOR_avx512f_loadhf_mask, "__builtin_ia32_loadsh_mask", IX86_BUILTIN_LOADSH_MASK, UNKNOWN, (int) V8HF_FTYPE_PCFLOAT16_V8HF_UQI)  BDESC (0, OPTION_MASK_ISA2_AVX512FP16, CODE_FOR_avx512f_storehf_mask, "__builtin_ia32_storesh_mask", IX86_BUILTIN_STORESH_MASK, UNKNOWN, (int) VOID_FTYPE_PCFLOAT16_V8HF_UQI)
 
+/* RAOINT */
+BDESC (0, OPTION_MASK_ISA2_RAOINT, CODE_FOR_rao_aaddsi, 
+"__builtin_ia32_aadd32", IX86_BUILTIN_AADD32, UNKNOWN, (int) 
+VOID_FTYPE_PINT_INT) BDESC (0, OPTION_MASK_ISA2_RAOINT, 
+CODE_FOR_rao_aandsi, "__builtin_ia32_aand32", IX86_BUILTIN_AAND32, 
+UNKNOWN, (int) VOID_FTYPE_PINT_INT) BDESC (0, OPTION_MASK_ISA2_RAOINT, 
+CODE_FOR_rao_aorsi, "__builtin_ia32_aor32", IX86_BUILTIN_AOR32, 
+UNKNOWN, (int) VOID_FTYPE_PINT_INT) BDESC (0, OPTION_MASK_ISA2_RAOINT, 
+CODE_FOR_rao_axorsi, "__builtin_ia32_axor32", IX86_BUILTIN_AXOR32, 
+UNKNOWN, (int) VOID_FTYPE_PINT_INT) BDESC (OPTION_MASK_ISA_64BIT, 
+OPTION_MASK_ISA2_RAOINT, CODE_FOR_rao_aadddi, "__builtin_ia32_aadd64", 
+IX86_BUILTIN_AADD64, UNKNOWN, (int) VOID_FTYPE_PLONGLONG_LONGLONG) 
+BDESC (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_RAOINT, 
+CODE_FOR_rao_aanddi, "__builtin_ia32_aand64", IX86_BUILTIN_AAND64, 
+UNKNOWN, (int) VOID_FTYPE_PLONGLONG_LONGLONG) BDESC 
+(OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_RAOINT, CODE_FOR_rao_aordi, 
+"__builtin_ia32_aor64", IX86_BUILTIN_AOR64, UNKNOWN, (int) 
+VOID_FTYPE_PLONGLONG_LONGLONG) BDESC (OPTION_MASK_ISA_64BIT, 
+OPTION_MASK_ISA2_RAOINT, CODE_FOR_rao_axordi, "__builtin_ia32_axor64", 
+IX86_BUILTIN_AXOR64, UNKNOWN, (int) VOID_FTYPE_PLONGLONG_LONGLONG)
+
 /* RDPKRU and WRPKRU.  */
 BDESC (OPTION_MASK_ISA_PKU, 0, CODE_FOR_rdpkru,  "__builtin_ia32_rdpkru", IX86_BUILTIN_RDPKRU, UNKNOWN, (int) UNSIGNED_FTYPE_VOID)  BDESC (OPTION_MASK_ISA_PKU, 0, CODE_FOR_wrpkru,  "__builtin_ia32_wrpkru", IX86_BUILTIN_WRPKRU, UNKNOWN, (int) VOID_FTYPE_UNSIGNED) diff --git a/gcc/config/i386/i386-c.cc b/gcc/config/i386/i386-c.cc index c92796281e0..a877d24148d 100644
--- a/gcc/config/i386/i386-c.cc
+++ b/gcc/config/i386/i386-c.cc
@@ -666,6 +666,8 @@  ix86_target_macros_internal (HOST_WIDE_INT isa_flag,
     def_or_undef (parse_in, "__AMX_FP16__");
   if (isa_flag2 & OPTION_MASK_ISA2_PREFETCHI)
     def_or_undef (parse_in, "__PREFETCHI__");
+  if (isa_flag2 & OPTION_MASK_ISA2_RAOINT)
+    def_or_undef (parse_in, "__RAOINT__");
   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 f234dcc37d7..63a2490316a 100644
--- a/gcc/config/i386/i386-isa.def
+++ b/gcc/config/i386/i386-isa.def
@@ -115,3 +115,4 @@  DEF_PTA(AVXNECONVERT)
 DEF_PTA(CMPCCXADD)
 DEF_PTA(AMX_FP16)
 DEF_PTA(PREFETCHI)
+DEF_PTA(RAOINT)
diff --git a/gcc/config/i386/i386-options.cc b/gcc/config/i386/i386-options.cc index 633d5dd7eea..10c7a3bb13e 100644
--- a/gcc/config/i386/i386-options.cc
+++ b/gcc/config/i386/i386-options.cc
@@ -235,7 +235,8 @@  static struct ix86_target_opts isa2_opts[] =
   { "-mavxneconvert",   OPTION_MASK_ISA2_AVXNECONVERT },
   { "-mcmpccxadd",      OPTION_MASK_ISA2_CMPCCXADD },
   { "-mamx-fp16",       OPTION_MASK_ISA2_AMX_FP16 },
-  { "-mprefetchi",      OPTION_MASK_ISA2_PREFETCHI }
+  { "-mprefetchi",      OPTION_MASK_ISA2_PREFETCHI },
+  { "-mraoint", 	OPTION_MASK_ISA2_RAOINT }
 };
 static struct ix86_target_opts isa_opts[] =  { @@ -1090,6 +1091,7 @@ ix86_valid_target_attribute_inner_p (tree fndecl, tree args, char *p_strings[],
     IX86_ATTR_ISA ("cmpccxadd",   OPT_mcmpccxadd),
     IX86_ATTR_ISA ("amx-fp16", OPT_mamx_fp16),
     IX86_ATTR_ISA ("prefetchi",   OPT_mprefetchi),
+    IX86_ATTR_ISA ("raoint", OPT_mraoint),
 
     /* enum options */
     IX86_ATTR_ENUM ("fpmath=",	OPT_mfpmath_),
diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt index 1d91103cd54..415c52e1bb4 100644
--- a/gcc/config/i386/i386.opt
+++ b/gcc/config/i386/i386.opt
@@ -1242,3 +1242,7 @@  Support AMX-FP16 built-in functions and code generation.
 mprefetchi
 Target Mask(ISA2_PREFETCHI) Var(ix86_isa_flags2) Save  Support PREFETCHI built-in functions and code generation.
+
+mraoint
+Target Mask(ISA2_RAOINT) Var(ix86_isa_flags2) Save Support RAOINT 
+built-in functions and code generation.
diff --git a/gcc/config/i386/raointintrin.h b/gcc/config/i386/raointintrin.h new file mode 100644 index 00000000000..3d966573f23
--- /dev/null
+++ b/gcc/config/i386/raointintrin.h
@@ -0,0 +1,101 @@ 
+/* Copyright (C) 2019-2022 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/>.  */
+
+#ifndef _X86GPRINTRIN_H_INCLUDED
+#error "Never use <raointintrin.h> directly; include <x86gprintrin.h> instead."
+#endif // _X86GPRINTRIN_H_INCLUDED
+
+#ifndef __RAOINTINTRIN_H_INCLUDED
+#define __RAOINTINTRIN_H_INCLUDED
+
+#ifndef __RAOINT__
+#pragma GCC push_options
+#pragma GCC target("raoint")
+#define __DISABLE_RAOINT__
+#endif /* __RAOINT__ */
+
+extern __inline void
+__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
+_aadd_i32 (int *__A, int __B)
+{
+  __builtin_ia32_aadd32 ((int *)__A, __B); }
+
+extern __inline void
+__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
+_aand_i32 (int *__A, int __B)
+{
+  __builtin_ia32_aand32 ((int *)__A, __B); }
+
+extern __inline void
+__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
+_aor_i32 (int *__A, int __B)
+{
+  __builtin_ia32_aor32 ((int *)__A, __B); }
+
+extern __inline void
+__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
+_axor_i32 (int *__A, int __B)
+{
+  __builtin_ia32_axor32 ((int *)__A, __B); }
+
+#ifdef __x86_64__
+extern __inline void
+__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
+_aadd_i64 (long long *__A, long long __B) {
+  __builtin_ia32_aadd64 ((long long *)__A, __B); }
+
+extern __inline void
+__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
+_aand_i64 (long long *__A, long long __B) {
+  __builtin_ia32_aand64 ((long long *)__A, __B); }
+
+extern __inline void
+__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
+_aor_i64 (long long *__A, long long __B) {
+  __builtin_ia32_aor64 ((long long *)__A, __B); }
+
+extern __inline void
+__attribute__ ((__gnu_inline__, __always_inline__, __artificial__))
+_axor_i64 (long long *__A, long long __B) {
+  __builtin_ia32_axor64 ((long long *)__A, __B); } #endif /* __x86_64__ 
+*/
+
+#ifdef __DISABLE_RAOINT__
+#undef __DISABLE_RAOINT__
+#pragma GCC pop_options
+#endif /* __DISABLE_RAOINT__ */
+
+#endif /* __RAOINTINTRIN_H_INCLUDED */
+
diff --git a/gcc/config/i386/sync.md b/gcc/config/i386/sync.md index 98a39b4e5f0..af9a1f43741 100644
--- a/gcc/config/i386/sync.md
+++ b/gcc/config/i386/sync.md
@@ -40,6 +40,9 @@ 
   
   ;; For CMPccXADD support
   UNSPECV_CMPCCXADD
+
+  ;; For RAOINT support
+  UNSPECV_RAOINT
 ])
 
 (define_expand "sse2_lfence"
@@ -785,6 +788,19 @@ 
   ""
   "%K3xchg{<imodesuffix>}\t{%1, %0|%0, %1}")
 
+(define_code_iterator any_plus_logic [and ior xor plus]) 
+(define_code_attr plus_logic [(and "and") (ior "or") (xor "xor") (plus 
+"add")])
+
+(define_insn "rao_a<plus_logic><mode>"
+  [(set (match_operand:SWI48 0 "memory_operand" "+m")
+       (unspec_volatile:SWI48
+         [(any_plus_logic:SWI48 (match_dup 0)
+				(match_operand:SWI48 1 "register_operand" "r"))
+          (const_int 0)]      ;; MEMMODEL_RELAXED
+         UNSPECV_RAOINT))]
+  "TARGET_RAOINT"
+  "a<plus_logic>\t{%1, %0|%0, %1}")
+
 (define_insn "atomic_add<mode>"
   [(set (match_operand:SWI 0 "memory_operand" "+m")
 	(unspec_volatile:SWI
diff --git a/gcc/config/i386/x86gprintrin.h b/gcc/config/i386/x86gprintrin.h index a84fbe9137d..a453404073b 100644
--- a/gcc/config/i386/x86gprintrin.h
+++ b/gcc/config/i386/x86gprintrin.h
@@ -74,6 +74,8 @@ 
 
 #include <pkuintrin.h>
 
+#include <raointintrin.h>
+
 #include <rdseedintrin.h>
 
 #include <rtmintrin.h>
diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index 8ac9f9108bf..33a49338bd3 100644
--- a/gcc/doc/extend.texi
+++ b/gcc/doc/extend.texi
@@ -7090,6 +7090,11 @@  Enable/disable the generation of the AMX-FP16 instructions.
 @cindex @code{target("prefetchi")} function attribute, x86  Enable/disable the generation of the PREFETCHI instructions.
 
+@item raoint
+@itemx no-raoint
+@cindex @code{target("raoint")} function attribute, x86 Enable/disable 
+the generation of the RAOINT instructions.
+
 @item cld
 @itemx no-cld
 @cindex @code{target("cld")} function attribute, x86 diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index 5e2e1031e05..4f4171e3966 100644
--- a/gcc/doc/invoke.texi
+++ b/gcc/doc/invoke.texi
@@ -1438,7 +1438,7 @@  See RS/6000 and PowerPC Options.
 -mrdseed  -msgx -mavx512vp2intersect -mserialize -mtsxldtrk@gol  -mamx-tile  -mamx-int8  -mamx-bf16 -muintr -mhreset -mavxvnni@gol
 -mavx512fp16 -mavxifma -mavxvnniint8 -mavxneconvert -mcmpccxadd -mamx-fp16 @gol --mprefetchi @gol
+-mprefetchi -mraoint @gol
 -mcldemote  -mms-bitfields  -mno-align-stringops  -minline-all-stringops @gol  -minline-stringops-dynamically  -mstringop-strategy=@var{alg} @gol  -mkl -mwidekl @gol @@ -32999,6 +32999,9 @@ preferred alignment to @option{-mpreferred-stack-boundary=2}.
 @need 200
 @itemx -mprefetchi
 @opindex mprefetchi
+@need 200
+@itemx -mraoint
+@opindex mraoint
 These switches enable the use of instructions in the MMX, SSE,  SSE2, SSE3, SSSE3, SSE4, SSE4A, SSE4.1, SSE4.2, AVX, AVX2, AVX512F, AVX512PF,  AVX512ER, AVX512CD, AVX512VL, AVX512BW, AVX512DQ, AVX512IFMA, AVX512VBMI, SHA, @@ -33009,9 +33012,9 @@ XSAVEOPT, XSAVEC, XSAVES, RTM, HLE, TBM, MWAITX, CLZERO, PKU, AVX512VBMI2,  GFNI, VAES, WAITPKG, VPCLMULQDQ, AVX512BITALG, MOVDIRI, MOVDIR64B, AVX512BF16,  ENQCMD, AVX512VPOPCNTDQ, AVX5124FMAPS, AVX512VNNI, AVX5124VNNIW, SERIALIZE,  UINTR, HRESET, AMXTILE, AMXINT8, AMXBF16, KL, WIDEKL, AVXVNNI, AVX512FP16, -AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, AMX-FP16, PREFETCHI or CLDEMOTE -extended instruction sets. Each has a corresponding @option{-mno-} option to -disable use of these instructions.
+AVXIFMA, AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, AMX-FP16, PREFETCHI, 
+RAOINT or CLDEMOTE extended instruction sets. Each has a corresponding 
+@option{-mno-} option to disable use of these instructions.
 
 These extensions are also available as built-in functions: see
 @ref{x86 Built-in Functions}, for details of the functions enabled and diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi index 58adb6516ed..fae43c98712 100644
--- a/gcc/doc/sourcebuild.texi
+++ b/gcc/doc/sourcebuild.texi
@@ -2538,6 +2538,9 @@  The x86-64 target linker supports PIE with copy reloc.
 @item prefetchi
 Target supports the execution of @code{prefetchi} instructions.
 
+@item raoint
+Target supports the execution of @code{raoint} instructions.
+
 @item rdrand
 Target supports x86 @code{rdrand} instruction.
 
diff --git a/gcc/testsuite/g++.dg/other/i386-2.C b/gcc/testsuite/g++.dg/other/i386-2.C
index ec3b1864ec0..fc910cec78a 100644
--- a/gcc/testsuite/g++.dg/other/i386-2.C
+++ b/gcc/testsuite/g++.dg/other/i386-2.C
@@ -1,5 +1,5 @@ 
 /* { dg-do compile { target i?86-*-* x86_64-*-* } } */
-/* { dg-options "-O -pedantic-errors -march=k8 -msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed -mprfchw -madx -mfxsr -mxsaveopt -mavx512f -mavx512er -mavx512cd -mavx512pf -msha -mprefetchwt1 -mxsavec -mxsaves -mclflushopt  -mavx512dq -mavx512bw -mavx512vl -mavx512ifma -mavx512vbmi -mavx512vbmi2 -mavx5124fmaps -mavx5124vnniw -mavx512vpopcntdq -mclwb -mmwaitx -mclzero -mpku -msgx -mrdpid -mgfni -mavx512bitalg -mpconfig -mwbnoinvd -mavx512bf16 -menqcmd -mavx512vp2intersect -mserialize -mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -mkl -mwidekl -mavxvnni -mavx512fp16 -mavxifma -mavxvnniint8 -mavxneconvert -mcmpccxadd -mamx-fp16 -mprefetchi" } */
+/* { dg-options "-O -pedantic-errors -march=k8 -msse4a -m3dnow -mavx 
+-mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 
+-mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed -mprfchw 
+-madx -mfxsr -mxsaveopt -mavx512f -mavx512er -mavx512cd -mavx512pf 
+-msha -mprefetchwt1 -mxsavec -mxsaves -mclflushopt  -mavx512dq 
+-mavx512bw -mavx512vl -mavx512ifma -mavx512vbmi -mavx512vbmi2 
+-mavx5124fmaps -mavx5124vnniw -mavx512vpopcntdq -mclwb -mmwaitx 
+-mclzero -mpku -msgx -mrdpid -mgfni -mavx512bitalg -mpconfig -mwbnoinvd 
+-mavx512bf16 -menqcmd -mavx512vp2intersect -mserialize -mtsxldtrk 
+-mamx-tile -mamx-int8 -mamx-bf16 -mkl -mwidekl -mavxvnni -mavx512fp16 
+-mavxifma -mavxvnniint8 -mavxneconvert -mcmpccxadd -mamx-fp16 
+-mprefetchi -mraoint" } */
 
 /* Test that {,x,e,p,t,s,w,a,b,i}mmintrin.h, mm3dnow.h, fma4intrin.h,
    xopintrin.h, abmintrin.h, bmiintrin.h, tbmintrin.h, lwpintrin.h, diff --git a/gcc/testsuite/g++.dg/other/i386-3.C b/gcc/testsuite/g++.dg/other/i386-3.C
index 542275ca057..64741b11685 100644
--- a/gcc/testsuite/g++.dg/other/i386-3.C
+++ b/gcc/testsuite/g++.dg/other/i386-3.C
@@ -1,5 +1,5 @@ 
 /* { dg-do compile { target i?86-*-* x86_64-*-* } } */
-/* { dg-options "-O -fkeep-inline-functions -march=k8 -msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed -mprfchw -madx -mfxsr -mxsaveopt -mavx512f -mavx512er -mavx512cd -mavx512pf -msha -mprefetchwt1 -mxsavec -mxsaves -mclflushopt -mavx512dq -mavx512bw -mavx512vl -mavx512ifma -mavx512vbmi -mavx512vbmi2 -mavx5124fmaps -mavx5124vnniw -mavx512vpopcntdq -mclwb -mmwaitx -mclzero -mpku -msgx -mrdpid -mgfni -mavx512bitalg -mpconfig -mwbnoinvd -mavx512bf16 -menqcmd -mavx512vp2intersect -mserialize -mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -mkl -mwidekl -mavxvnni -mavx512fp16 -mavxifma -mavxvnniint8 -mavxneconvert -mcmpccxadd -mamx-fp16 -mprefetchi" } */
+/* { dg-options "-O -fkeep-inline-functions -march=k8 -msse4a -m3dnow 
+-mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi 
+-mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed 
+-mprfchw -madx -mfxsr -mxsaveopt -mavx512f -mavx512er -mavx512cd 
+-mavx512pf -msha -mprefetchwt1 -mxsavec -mxsaves -mclflushopt 
+-mavx512dq -mavx512bw -mavx512vl -mavx512ifma -mavx512vbmi 
+-mavx512vbmi2 -mavx5124fmaps -mavx5124vnniw -mavx512vpopcntdq -mclwb 
+-mmwaitx -mclzero -mpku -msgx -mrdpid -mgfni -mavx512bitalg -mpconfig 
+-mwbnoinvd -mavx512bf16 -menqcmd -mavx512vp2intersect -mserialize 
+-mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -mkl -mwidekl -mavxvnni 
+-mavx512fp16 -mavxifma -mavxvnniint8 -mavxneconvert -mcmpccxadd 
+-mamx-fp16 -mprefetchi -mraoint" } */
 
 /* Test that {,x,e,p,t,s,w,a,b,i}mmintrin.h, mm3dnow.h, fma4intrin.h,
    xopintrin.h, abmintrin.h, bmiintrin.h, tbmintrin.h, lwpintrin.h, diff --git a/gcc/testsuite/gcc.target/i386/funcspec-56.inc b/gcc/testsuite/gcc.target/i386/funcspec-56.inc
index 1dca8b060d3..7eb18c6952d 100644
--- a/gcc/testsuite/gcc.target/i386/funcspec-56.inc
+++ b/gcc/testsuite/gcc.target/i386/funcspec-56.inc
@@ -86,6 +86,7 @@  extern void test_avxneconvert (void)		__attribute__((__target__("avxneconvert"))
 extern void test_cmpccxadd (void)		__attribute__((__target__("cmpccxadd")));
 extern void test_amx_fp16 (void)		__attribute__((__target__("amx-fp16")));
 extern void test_prefetchi (void)               __attribute__((__target__("prefetchi")));
+extern void test_raoint (void)                  __attribute__((__target__("raoint")));
 
 extern void test_no_sgx (void)			__attribute__((__target__("no-sgx")));
 extern void test_no_avx5124fmaps(void)		__attribute__((__target__("no-avx5124fmaps")));
@@ -173,6 +174,7 @@  extern void test_no_avxneconvert (void)		__attribute__((__target__("no-avxneconv
 extern void test_no_cmpccxadd (void)            __attribute__((__target__("no-cmpccxadd")));
 extern void test_no_amx_fp16 (void)		__attribute__((__target__("no-amx-fp16")));
 extern void test_no_prefetchi (void)            __attribute__((__target__("no-prefetchi")));
+extern void test_no_raoint (void)               __attribute__((__target__("no-raoint")));
 
 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/rao-helper.h b/gcc/testsuite/gcc.target/i386/rao-helper.h
new file mode 100644
index 00000000000..df385516f48
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/rao-helper.h
@@ -0,0 +1,79 @@ 
+#include <immintrin.h>
+#include <stdint.h>
+#include <pthread.h>
+#include <string.h>
+#ifdef DEBUG
+#include <stdio.h>
+#endif
+#include "cpuid.h"
+
+typedef struct {
+  uint32_t id; /* filled in by launch_threads. */ } state_t;
+
+static pthread_t* threads = 0;
+static state_t* thread_state = 0;
+static const unsigned int num_threads = 4;
+
+static void* threads_worker (state_t *tstate);
+
+void launch_threads (uint32_t nthreads,
+                     void* (*worker)(state_t*),
+                     state_t* tstate_proto) {
+  int i;
+  thread_state = malloc (sizeof (state_t) *nthreads);
+  threads = malloc (sizeof (pthread_t) *nthreads);
+  memset (threads, 0, sizeof (pthread_t) *nthreads);
+  for(i = 0; i < nthreads; i++)
+    {
+      memcpy (thread_state + i, tstate_proto, sizeof (state_t));
+      thread_state[i].id = i;
+      pthread_create (threads+i, NULL,
+                      (void* (*)(void*))worker,  
+		      (void*) (thread_state+i));
+    }
+}
+
+void wait()
+{
+  int i;
+  for(i = 0; i < num_threads; i++)
+    pthread_join (threads[i], 0);
+  free (threads);
+  threads = 0;
+  free (thread_state);
+  thread_state  = 0;
+}
+
+#ifndef DO_TEST
+#define DO_TEST do_test
+static void rao_test (void);
+__attribute__ ((noinline))
+static void
+do_test (void)
+{
+  state_t tstate_proto;
+  launch_threads(num_threads, threads_worker, &tstate_proto);
+  wait();
+  rao_test ();
+}
+#endif
+
+int
+main()
+{
+  if (__builtin_cpu_supports ("raoint"))
+    {
+      DO_TEST ();
+#ifdef DEBUG
+      printf ("PASSED\n");
+#endif
+    }
+#ifdef DEBUG
+  else
+    printf ("SKIPPED\n");
+#endif
+
+  return 0;
+}
diff --git a/gcc/testsuite/gcc.target/i386/raoint-1.c b/gcc/testsuite/gcc.target/i386/raoint-1.c
new file mode 100644
index 00000000000..d4f880ee304
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/raoint-1.c
@@ -0,0 +1,31 @@ 
+/* { dg-do compile } */
+/* { dg-options "-mraoint -O2" } */
+/* { dg-final { scan-assembler-times "aadd" 2 { target {! ia32 } } } } 
+*/
+/* { dg-final { scan-assembler-times "aand" 2 { target {! ia32 } } } } 
+*/
+/* { dg-final { scan-assembler-times "aor" 2 { target {! ia32 } } } } 
+*/
+/* { dg-final { scan-assembler-times "axor" 2 { target {! ia32 } } } } 
+*/
+/* { dg-final { scan-assembler-times "aadd" 1 { target ia32 } } } */
+/* { dg-final { scan-assembler-times "aand" 1 { target ia32 } } } */
+/* { dg-final { scan-assembler-times "aor" 1 { target ia32 } } } */
+/* { dg-final { scan-assembler-times "axor" 1 { target ia32 } } } */ 
+#include <immintrin.h>
+
+volatile int x;
+volatile long long y;
+int *a;
+long long *b;
+
+void extern
+rao_int_test (void)
+{
+  _aadd_i32 (a, x);
+  _aand_i32 (a, x);
+  _aor_i32 (a, x);
+  _axor_i32 (a, x);
+#ifdef __x86_64__
+  _aadd_i64 (b, y);
+  _aand_i64 (b, y);
+  _aor_i64 (b, y);
+  _axor_i64 (b, y);
+#endif
+}
diff --git a/gcc/testsuite/gcc.target/i386/raoint-aadd-2.c b/gcc/testsuite/gcc.target/i386/raoint-aadd-2.c
new file mode 100644
index 00000000000..8ae9bc25b17
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/raoint-aadd-2.c
@@ -0,0 +1,24 @@ 
+/* { dg-do run { target { *-*-linux* && { ! ia32 } } } }*/
+/* { dg-require-effective-target raoint }*/
+/* { dg-options "-pthread -O2 -mraoint" }*/ #include "rao-helper.h"
+
+const unsigned int inc_val = 3;
+const unsigned int num_iters= 1000000;
+static long long shared_val = 0;
+
+static
+void* threads_worker (state_t *tstate)
+{
+  int i;
+  for (i = 0; i < num_iters; i++) 
+     _aadd_i64 (&shared_val, inc_val);
+  return 0;
+}
+
+static void
+rao_test (void)
+{
+  if (shared_val != num_iters * num_threads * inc_val)
+    abort ();	
+}
diff --git a/gcc/testsuite/gcc.target/i386/raoint-aand-2.c b/gcc/testsuite/gcc.target/i386/raoint-aand-2.c
new file mode 100644
index 00000000000..40bc1d71621
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/raoint-aand-2.c
@@ -0,0 +1,25 @@ 
+/* { dg-do run { target { *-*-linux* && { ! ia32 } } } }*/
+/* { dg-require-effective-target raoint }*/
+/* { dg-options "-pthread -O2 -mraoint" }*/ #include "rao-helper.h"
+
+const unsigned int num_iters= 1000000;
+unsigned int thread_val[4] = { 0xffffff5a, 0xffff96ff, 0xff73ffff, 
+0xceffffff }; static long long shared_val = 0xffffffff; unsigned int 
+expected_val = 0xce73965a;
+
+static void*
+threads_worker (state_t *tstate)
+{
+  int i;
+  unsigned int val = thread_val[tstate->id];
+  for (i = 0; i < num_iters; i++) 
+    _aand_i64 (&shared_val, val);
+}
+
+static void
+rao_test(void)
+{
+  if (shared_val != expected_val)
+    abort ();	
+}
diff --git a/gcc/testsuite/gcc.target/i386/raoint-aor-2.c b/gcc/testsuite/gcc.target/i386/raoint-aor-2.c
new file mode 100644
index 00000000000..ec7f7cc1689
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/raoint-aor-2.c
@@ -0,0 +1,25 @@ 
+/* { dg-do run { target { *-*-linux* && { ! ia32 } } } }*/
+/* { dg-require-effective-target raoint }*/
+/* { dg-options "-pthread -O2 -mraoint" }*/ #include "rao-helper.h"
+
+const unsigned int num_iters= 1000000;
+unsigned int thread_val[4] = { 0x5a, 0x9600, 0x730000, 0xce000000 }; 
+static long long shared_val = 0; unsigned int expected_val = 
+0xce73965a;
+
+static void*
+threads_worker (state_t *tstate)
+{
+  int i;
+  unsigned int val = thread_val[tstate->id];
+  for (i = 0; i < num_iters; i++) 
+    _aor_i64 (&shared_val, val);
+}
+
+static void
+rao_test (void)
+{
+  if (shared_val != expected_val)
+    abort ();	
+}
diff --git a/gcc/testsuite/gcc.target/i386/raoint-axor-2.c b/gcc/testsuite/gcc.target/i386/raoint-axor-2.c
new file mode 100644
index 00000000000..a875592a486
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/raoint-axor-2.c
@@ -0,0 +1,25 @@ 
+/* { dg-do run { target { *-*-linux* && { ! ia32 } } } }*/
+/* { dg-require-effective-target raoint }*/
+/* { dg-options "-pthread -O2 -mraoint" }*/ #include "rao-helper.h"
+
+const unsigned int num_iters= 1000001;
+unsigned int thread_val[4] = { 0x5a, 0x9600, 0x730000, 0xce000000 }; 
+static long long shared_val = 0; unsigned int expected_val = 
+0xce73965a;
+
+static void*
+threads_worker (state_t *tstate)
+{
+  int i;
+  unsigned int val = thread_val[tstate->id];
+  for (i = 0; i < num_iters; i++) 
+    _axor_i64 (&shared_val, val);
+}
+
+static void
+rao_test (void)
+{
+  if (shared_val != expected_val)
+    abort ();	
+}
diff --git a/gcc/testsuite/gcc.target/i386/sse-12.c b/gcc/testsuite/gcc.target/i386/sse-12.c
index 8c556f3fcc5..c5b2a18945c 100644
--- a/gcc/testsuite/gcc.target/i386/sse-12.c
+++ b/gcc/testsuite/gcc.target/i386/sse-12.c
@@ -3,7 +3,7 @@ 
    popcntintrin.h gfniintrin.h and mm_malloc.h are usable
    with -O -std=c89 -pedantic-errors.  */
 /* { dg-do compile } */
-/* { dg-options "-O -std=c89 -pedantic-errors -march=k8 -msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed -mprfchw -madx -mfxsr -mxsaveopt -mavx512f -mavx512er -mavx512cd -mavx512pf -msha -mprefetchwt1 -mxsavec -mxsaves -mclflushopt -mavx512bw -mavx512dq -mavx512vl -mavx512vbmi -mavx512vbmi2 -mavx512ifma -mavx5124fmaps -mavx5124vnniw -mavx512vpopcntdq -mclwb -mmwaitx -mclzero -mpku -msgx -mrdpid -mgfni -mavx512bitalg -mpconfig -mwbnoinvd -mavx512bf16 -menqcmd -mavx512vp2intersect -mserialize -mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -mkl -mwidekl -mavxvnni -mavxifma -mavxvnniint8 -mavxneconvert -mamx-fp16 -mprefetchi" } */
+/* { dg-options "-O -std=c89 -pedantic-errors -march=k8 -msse4a -m3dnow 
+-mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi 
+-mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed 
+-mprfchw -madx -mfxsr -mxsaveopt -mavx512f -mavx512er -mavx512cd 
+-mavx512pf -msha -mprefetchwt1 -mxsavec -mxsaves -mclflushopt 
+-mavx512bw -mavx512dq -mavx512vl -mavx512vbmi -mavx512vbmi2 
+-mavx512ifma -mavx5124fmaps -mavx5124vnniw -mavx512vpopcntdq -mclwb 
+-mmwaitx -mclzero -mpku -msgx -mrdpid -mgfni -mavx512bitalg -mpconfig 
+-mwbnoinvd -mavx512bf16 -menqcmd -mavx512vp2intersect -mserialize 
+-mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -mkl -mwidekl -mavxvnni 
+-mavxifma -mavxvnniint8 -mavxneconvert -mamx-fp16 -mprefetchi -mraoint" 
+} */
 
 #include <x86intrin.h>
 
diff --git a/gcc/testsuite/gcc.target/i386/sse-13.c b/gcc/testsuite/gcc.target/i386/sse-13.c
index ee5ba5ae4d5..858d5744b76 100644
--- a/gcc/testsuite/gcc.target/i386/sse-13.c
+++ b/gcc/testsuite/gcc.target/i386/sse-13.c
@@ -1,5 +1,5 @@ 
 /* { dg-do compile } */
-/* { dg-options "-O2 -Werror-implicit-function-declaration -march=k8 -msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed -mprfchw -madx -mfxsr -mxsaveopt -mavx512f -mavx512er -mavx512cd -mavx512pf -msha -mprefetchwt1 -mxsavec -mxsaves -mclflushopt -mavx512vl -mavx512dq -mavx512bw -mavx512vbmi -mavx512vbmi2 -mavx512ifma -mavx5124fmaps -mavx5124vnniw -mavx512vpopcntdq -mavx512vp2intersect -mclwb -mmwaitx -mclzero -mpku -msgx -mrdpid -mgfni -mavx512bitalg -mpconfig -mwbnoinvd -mavx512bf16 -menqcmd -mserialize -mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -mkl -mwidekl -mavxvnni -mavx512fp16 -mavxifma -mavxvnniint8 -mavxneconvert -mcmpccxadd -mamx-fp16 -mprefetchi" } */
+/* { dg-options "-O2 -Werror-implicit-function-declaration -march=k8 
+-msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm 
+-mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm 
+-mrdseed -mprfchw -madx -mfxsr -mxsaveopt -mavx512f -mavx512er 
+-mavx512cd -mavx512pf -msha -mprefetchwt1 -mxsavec -mxsaves 
+-mclflushopt -mavx512vl -mavx512dq -mavx512bw -mavx512vbmi 
+-mavx512vbmi2 -mavx512ifma -mavx5124fmaps -mavx5124vnniw 
+-mavx512vpopcntdq -mavx512vp2intersect -mclwb -mmwaitx -mclzero -mpku 
+-msgx -mrdpid -mgfni -mavx512bitalg -mpconfig -mwbnoinvd -mavx512bf16 
+-menqcmd -mserialize -mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -mkl 
+-mwidekl -mavxvnni -mavx512fp16 -mavxifma -mavxvnniint8 -mavxneconvert 
+-mcmpccxadd -mamx-fp16 -mprefetchi -mraoint" } */
 /* { dg-add-options bind_pic_locally } */
 
 #include <mm_malloc.h>
diff --git a/gcc/testsuite/gcc.target/i386/sse-14.c b/gcc/testsuite/gcc.target/i386/sse-14.c
index 4f3bd70d03e..18d97fea2e9 100644
--- a/gcc/testsuite/gcc.target/i386/sse-14.c
+++ b/gcc/testsuite/gcc.target/i386/sse-14.c
@@ -1,5 +1,5 @@ 
 /* { dg-do compile } */
-/* { dg-options "-O0 -Werror-implicit-function-declaration -march=k8 -msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm -mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm -mrdseed -mprfchw -madx -mfxsr -mxsaveopt -mavx512f -mavx512er -mavx512cd -mavx512pf -msha -mprefetchwt1 -mxsavec -mxsaves -mclflushopt -mavx512dq -mavx512bw -mavx512vl -mavx512ifma -mavx512vbmi -mavx512vbmi2 -mavx5124fmaps -mavx5124vnniw -mavx512vpopcntdq -mclwb -mmwaitx -mclzero -mpku -msgx -mrdpid -mgfni -mpconfig -mwbnoinvd -mavx512vl -mavx512bf16 -menqcmd -mavx512vp2intersect -mserialize -mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -mkl -mwidekl -mavxvnni -mavx512fp16 -mavxifma -mavxvnniint8 -mavxneconvert -mamx-fp16 -mprefetchi" } */
+/* { dg-options "-O0 -Werror-implicit-function-declaration -march=k8 
+-msse4a -m3dnow -mavx -mavx2 -mfma4 -mxop -maes -mpclmul -mpopcnt -mabm 
+-mlzcnt -mbmi -mbmi2 -mtbm -mlwp -mfsgsbase -mrdrnd -mf16c -mfma -mrtm 
+-mrdseed -mprfchw -madx -mfxsr -mxsaveopt -mavx512f -mavx512er 
+-mavx512cd -mavx512pf -msha -mprefetchwt1 -mxsavec -mxsaves 
+-mclflushopt -mavx512dq -mavx512bw -mavx512vl -mavx512ifma -mavx512vbmi 
+-mavx512vbmi2 -mavx5124fmaps -mavx5124vnniw -mavx512vpopcntdq -mclwb 
+-mmwaitx -mclzero -mpku -msgx -mrdpid -mgfni -mpconfig -mwbnoinvd 
+-mavx512vl -mavx512bf16 -menqcmd -mavx512vp2intersect -mserialize 
+-mtsxldtrk -mamx-tile -mamx-int8 -mamx-bf16 -mkl -mwidekl -mavxvnni 
+-mavx512fp16 -mavxifma -mavxvnniint8 -mavxneconvert -mamx-fp16 
+-mprefetchi -mraoint" } */
 /* { dg-add-options bind_pic_locally } */
 
 #include <mm_malloc.h>
diff --git a/gcc/testsuite/gcc.target/i386/sse-22.c b/gcc/testsuite/gcc.target/i386/sse-22.c
index 8bd046b19c2..0d9965e284e 100644
--- a/gcc/testsuite/gcc.target/i386/sse-22.c
+++ b/gcc/testsuite/gcc.target/i386/sse-22.c
@@ -103,7 +103,7 @@ 
 
 
 #ifndef DIFFERENT_PRAGMAS
-#pragma GCC target ("sse4a,3dnow,avx,avx2,fma4,xop,aes,pclmul,popcnt,abm,lzcnt,bmi,bmi2,tbm,lwp,fsgsbase,rdrnd,f16c,rtm,rdseed,prfchw,adx,fxsr,xsaveopt,avx512f,avx512er,avx512cd,avx512pf,sha,prefetchwt1,avx512vl,avx512bw,avx512dq,avx512vbmi,avx512vbmi2,avx512ifma,avx5124fmaps,avx5124vnniw,avx512vpopcntdq,gfni,avx512bitalg,avx512bf16,avx512vp2intersect,serialize,tsxldtrk,amx-tile,amx-int8,amx-bf16,kl,widekl,avxvnni,avx512fp16,avxifma,avxvnniint8,avxneconvert,amx-fp16,prefetchi")
+#pragma GCC target 
+("sse4a,3dnow,avx,avx2,fma4,xop,aes,pclmul,popcnt,abm,lzcnt,bmi,bmi2,tb
+m,lwp,fsgsbase,rdrnd,f16c,rtm,rdseed,prfchw,adx,fxsr,xsaveopt,avx512f,a
+vx512er,avx512cd,avx512pf,sha,prefetchwt1,avx512vl,avx512bw,avx512dq,av
+x512vbmi,avx512vbmi2,avx512ifma,avx5124fmaps,avx5124vnniw,avx512vpopcnt
+dq,gfni,avx512bitalg,avx512bf16,avx512vp2intersect,serialize,tsxldtrk,a
+mx-tile,amx-int8,amx-bf16,kl,widekl,avxvnni,avx512fp16,avxifma,avxvnnii
+nt8,avxneconvert,amx-fp16,prefetchi,raoint")
 #endif
 
 /* Following intrinsics require immediate arguments.  They @@ -220,7 +220,7 @@ test_4 (_mm_cmpestrz, int, __m128i, int, __m128i, int, 1)
 
 /* immintrin.h (AVX/AVX2/RDRND/FSGSBASE/F16C/RTM/AVX512F/SHA) */  #ifdef DIFFERENT_PRAGMAS -#pragma GCC target ("avx,avx2,rdrnd,fsgsbase,f16c,rtm,avx512f,avx512er,avx512cd,avx512pf,sha,avx512vl,avx512bw,avx512dq,avx512ifma,avx512vbmi,avx512vbmi2,avx5124fmaps,avx5124vnniw,avx512vpopcntdq,gfni,avx512bitalg,avx512bf16,avx512vp2intersect,serialize,tsxldtrk,amx-tile,amx-int8,amx-bf16,kl,widekl,avxvnni,avx512fp16,avxifma,avxvnniint8,avxneconvert,amx-fp16,prefetchi")
+#pragma GCC target 
+("avx,avx2,rdrnd,fsgsbase,f16c,rtm,avx512f,avx512er,avx512cd,avx512pf,s
+ha,avx512vl,avx512bw,avx512dq,avx512ifma,avx512vbmi,avx512vbmi2,avx5124
+fmaps,avx5124vnniw,avx512vpopcntdq,gfni,avx512bitalg,avx512bf16,avx512v
+p2intersect,serialize,tsxldtrk,amx-tile,amx-int8,amx-bf16,kl,widekl,avx
+vnni,avx512fp16,avxifma,avxvnniint8,avxneconvert,amx-fp16,prefetchi,rao
+int")
 #endif
 #include <immintrin.h>
 test_1 (_cvtss_sh, unsigned short, float, 1) diff --git a/gcc/testsuite/gcc.target/i386/sse-23.c b/gcc/testsuite/gcc.target/i386/sse-23.c
index 16ac9c9b7a4..c9bfd75aa92 100644
--- a/gcc/testsuite/gcc.target/i386/sse-23.c
+++ b/gcc/testsuite/gcc.target/i386/sse-23.c
@@ -847,6 +847,6 @@ 
 #define __builtin_ia32_cmpccxadd(A, B, C, D) __builtin_ia32_cmpccxadd(A, B, C, 1)  #define __builtin_ia32_cmpccxadd64(A, B, C, D) __builtin_ia32_cmpccxadd64(A, B, C, 1)
 
-#pragma GCC target ("sse4a,3dnow,avx,avx2,fma4,xop,aes,pclmul,popcnt,abm,lzcnt,bmi,bmi2,tbm,lwp,fsgsbase,rdrnd,f16c,fma,rtm,rdseed,prfchw,adx,fxsr,xsaveopt,avx512f,avx512er,avx512cd,avx512pf,sha,prefetchwt1,xsavec,xsaves,clflushopt,avx512bw,avx512dq,avx512vl,avx512vbmi,avx512ifma,avx5124fmaps,avx5124vnniw,avx512vpopcntdq,clwb,mwaitx,clzero,pku,sgx,rdpid,gfni,avx512vbmi2,vpclmulqdq,avx512bitalg,pconfig,wbnoinvd,avx512bf16,enqcmd,avx512vp2intersect,serialize,tsxldtrk,amx-tile,amx-int8,amx-bf16,kl,widekl,avxvnni,avx512fp16,avxifma,avxvnniint8,avxneconvert,cmpccxadd,amx-fp16,prefetchi")
+#pragma GCC target 
+("sse4a,3dnow,avx,avx2,fma4,xop,aes,pclmul,popcnt,abm,lzcnt,bmi,bmi2,tb
+m,lwp,fsgsbase,rdrnd,f16c,fma,rtm,rdseed,prfchw,adx,fxsr,xsaveopt,avx51
+2f,avx512er,avx512cd,avx512pf,sha,prefetchwt1,xsavec,xsaves,clflushopt,
+avx512bw,avx512dq,avx512vl,avx512vbmi,avx512ifma,avx5124fmaps,avx5124vn
+niw,avx512vpopcntdq,clwb,mwaitx,clzero,pku,sgx,rdpid,gfni,avx512vbmi2,v
+pclmulqdq,avx512bitalg,pconfig,wbnoinvd,avx512bf16,enqcmd,avx512vp2inte
+rsect,serialize,tsxldtrk,amx-tile,amx-int8,amx-bf16,kl,widekl,avxvnni,a
+vx512fp16,avxifma,avxvnniint8,avxneconvert,cmpccxadd,amx-fp16,prefetchi
+,raoint")
 
 #include <x86intrin.h>
diff --git a/gcc/testsuite/gcc.target/i386/x86gprintrin-1.c b/gcc/testsuite/gcc.target/i386/x86gprintrin-1.c
index 76de89d0cb7..6325ff9f5ba 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 -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 -mno-sse -mno-mmx" } */
 /* { dg-additional-options "-mcmpccxadd -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 aefad77f864..9c9e87c42c7 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 -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 -mno-sse -mno-mmx" } */
 /* { dg-add-options bind_pic_locally } */
 /* { dg-additional-options "-mcmpccxadd -muintr" { target { ! ia32 } } }  */
 
diff --git a/gcc/testsuite/gcc.target/i386/x86gprintrin-3.c b/gcc/testsuite/gcc.target/i386/x86gprintrin-3.c
index 261c9180aa0..3a3c344a78a 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 -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 -mno-sse -mno-mmx" } */
 /* { dg-add-options bind_pic_locally } */
 /* { dg-additional-options "-mcmpccxadd -muintr" { target { ! ia32 } } }  */
 
diff --git a/gcc/testsuite/gcc.target/i386/x86gprintrin-4.c b/gcc/testsuite/gcc.target/i386/x86gprintrin-4.c
index 7f76b870934..b1bbda31237 100644
--- a/gcc/testsuite/gcc.target/i386/x86gprintrin-4.c
+++ b/gcc/testsuite/gcc.target/i386/x86gprintrin-4.c
@@ -15,9 +15,9 @@ 
 
 #ifndef DIFFERENT_PRAGMAS
 #ifdef __x86_64__
-#pragma GCC target ("adx,bmi,bmi2,cmpccxadd,fsgsbase,fxsr,hreset,lwp,lzcnt,popcnt,rdrnd,rdseed,tbm,rtm,serialize,tsxldtrk,uintr,xsaveopt")
+#pragma GCC target 
+("adx,bmi,bmi2,cmpccxadd,fsgsbase,fxsr,hreset,lwp,lzcnt,popcnt,raoint,r
+drnd,rdseed,tbm,rtm,serialize,tsxldtrk,uintr,xsaveopt")
 #else
-#pragma GCC target ("adx,bmi,bmi2,fsgsbase,fxsr,hreset,lwp,lzcnt,popcnt,rdrnd,rdseed,tbm,rtm,serialize,tsxldtrk,xsaveopt")
+#pragma GCC target 
+("adx,bmi,bmi2,fsgsbase,fxsr,hreset,lwp,lzcnt,popcnt,raoint,rdrnd,rdsee
+d,tbm,rtm,serialize,tsxldtrk,xsaveopt")
 #endif
 #endif
 
diff --git a/gcc/testsuite/gcc.target/i386/x86gprintrin-5.c b/gcc/testsuite/gcc.target/i386/x86gprintrin-5.c
index 54d826c4f46..e3ad67d1e77 100644
--- a/gcc/testsuite/gcc.target/i386/x86gprintrin-5.c
+++ b/gcc/testsuite/gcc.target/i386/x86gprintrin-5.c
@@ -32,9 +32,9 @@ 
 #define __builtin_ia32_cmpccxadd64(A, B, C, D) __builtin_ia32_cmpccxadd64(A, B, C, 1)
 
 #ifdef __x86_64__
-#pragma GCC target ("adx,bmi,bmi2,clflushopt,clwb,clzero,cmpccxadd,enqcmd,fsgsbase,fxsr,hreset,lwp,lzcnt,mwaitx,pconfig,pku,popcnt,rdpid,rdrnd,rdseed,tbm,rtm,serialize,sgx,tsxldtrk,uintr,xsavec,xsaveopt,xsaves,wbnoinvd")
+#pragma GCC target 
+("adx,bmi,bmi2,clflushopt,clwb,clzero,cmpccxadd,enqcmd,fsgsbase,fxsr,hr
+eset,lwp,lzcnt,mwaitx,pconfig,pku,popcnt,raoint,rdpid,rdrnd,rdseed,tbm,
+rtm,serialize,sgx,tsxldtrk,uintr,xsavec,xsaveopt,xsaves,wbnoinvd")
 #else
-#pragma GCC target ("adx,bmi,bmi2,clflushopt,clwb,clzero,enqcmd,fsgsbase,fxsr,hreset,lwp,lzcnt,mwaitx,pconfig,pku,popcnt,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,l
+zcnt,mwaitx,pconfig,pku,popcnt,raoint,rdpid,rdrnd,rdseed,tbm,rtm,serial
+ize,sgx,tsxldtrk,xsavec,xsaveopt,xsaves,wbnoinvd")
 #endif
 
 #include <x86gprintrin.h>
diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp
index 30e192f4d46..c7f583d6d14 100644
--- a/gcc/testsuite/lib/target-supports.exp
+++ b/gcc/testsuite/lib/target-supports.exp
@@ -9571,6 +9571,17 @@  proc check_effective_target_cmpccxadd { } {
     } "-mcmpccxadd" ]
 }
 
+# Return 1 if raoint instructions can be compiled.
+proc check_effective_target_raoint { } {
+    return [check_no_compiler_messages raoint object {
+	void
+	_aadd_si32 (int *__A, int __B)
+	{
+	  return __builtin_ia32_aadd32((int *)__A, __B);
+	}
+    } "-mraoint" ]
+}
+
 # Return 1 if sse instructions can be compiled.
 proc check_effective_target_sse { } {
     return [check_no_compiler_messages sse object {