From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.7]) by sourceware.org (Postfix) with ESMTPS id BC8283858D1E for ; Thu, 12 Oct 2023 01:47:07 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org BC8283858D1E Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=intel.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1697075228; x=1728611228; h=from:to:cc:subject:date:message-id:references: in-reply-to:content-transfer-encoding:mime-version; bh=iU0lvPeKe3zrEPpm0oHInbL3iBdQEiWQXnwyT0I10nE=; b=QqaLdbrBXAqqgTaDpKWS629SKZSLrFopGXpS0xIdGw+cti0b/aSFX4Xq dMM7ceiQGID0hZxYeyYmbtw3xdd3/J+9hs5qSUtr+6xuVlkJHCBXTuTo0 HQqSmZjiPWNCu9DxGkCUbs3mNs2I07mL0kUX313MitUYugekbLQr/SNWa UU25kpHXMMWpKFZQ9pfy9xaPPRLztulFJ7GbqdBCWUwEnd1l58Cvhjtr2 Dv+CYoBo8Ln+ltSIjFUKeeTM0yqal++hCNeL5d7Fw8+fGBrhgznG5pDFS cj0htclM5UhWT09RNyyJKlBexW6p6EGMZVck69MstYojBubXQC3LF7sZK w==; X-IronPort-AV: E=McAfee;i="6600,9927,10860"; a="6361379" X-IronPort-AV: E=Sophos;i="6.03,217,1694761200"; d="scan'208";a="6361379" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmvoesa101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 11 Oct 2023 18:47:06 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10860"; a="789205602" X-IronPort-AV: E=Sophos;i="6.03,217,1694761200"; d="scan'208";a="789205602" Received: from fmsmsx603.amr.corp.intel.com ([10.18.126.83]) by orsmga001.jf.intel.com with ESMTP/TLS/AES256-GCM-SHA384; 11 Oct 2023 18:47:05 -0700 Received: from fmsmsx610.amr.corp.intel.com (10.18.126.90) by fmsmsx603.amr.corp.intel.com (10.18.126.83) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Wed, 11 Oct 2023 18:47:05 -0700 Received: from fmsmsx610.amr.corp.intel.com (10.18.126.90) by fmsmsx610.amr.corp.intel.com (10.18.126.90) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32; Wed, 11 Oct 2023 18:47:04 -0700 Received: from fmsedg601.ED.cps.intel.com (10.1.192.135) by fmsmsx610.amr.corp.intel.com (10.18.126.90) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2507.32 via Frontend Transport; Wed, 11 Oct 2023 18:47:04 -0700 Received: from NAM12-BN8-obe.outbound.protection.outlook.com (104.47.55.168) by edgegateway.intel.com (192.55.55.70) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.32; Wed, 11 Oct 2023 18:47:04 -0700 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=Byu0/JilFEGNFt0bXeCrx5ERwdbNP14GUrz9M1o+lBBb7iQNzZCHkdXAqIBMa8COhOOLb24ruG1E7ylNTkfCr/hNawEy1N5H/WIzsHrxxZvIYEcfmwXrXwe8bPlMkYehtf9gBMmxz9mazLhxTz1uEiRs1vz/Ml9raVj664xo665X12itaHnDY9xtihrzXqTT6iePVCatZMiRuYbPhEFoTxb4raR8BjZqoj6q9GdmNfhOpdpX1ZFFdOV/3xb68mBSBRvasq4uz03ddtVBNpcnzUXWGksMxJ9wk3d5V14ws6mtKqUe57RdXvnSWPxIUENflb4eP5i+Lrbfvrl/TbXkww== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=7djqBrGpGhYgq3C+OJqfZ66onXoZ11NAFDU6Bp923gw=; b=lK9C2FfG4SO5Ap4GkVHrBttFjN1a4C6jDi2D3bSEYSmobTkGwGj4+Y6VjZvZ1yQZv/cADO5zMIud3w7lUtvtgICB9Jpx1EX2F0cJusNT8+Ig6U8hMMWi3VEQFS7AbTETqkfS3dGhhVSuEBmLXbKmhDJc2+WudYx5Drpy4/tFvP9HF7BOG7yci6j61fCy4XD6QglWgAMSOzH18nCA3KUFQ6bdgvRDR1DFdORSeYUAcIShNZKkDWEZfhYnrPhZ1yA7arRE7MNkyHkvpWP1iUCgY9Sslrpwm14Qu3VFutpSECGMgTkmGwKzWSE+iNOTgJ6iHiNjqLW8RoPbkVOf+YZS8g== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=intel.com; dmarc=pass action=none header.from=intel.com; dkim=pass header.d=intel.com; arc=none Received: from SA1PR11MB6757.namprd11.prod.outlook.com (2603:10b6:806:25c::13) by SN7PR11MB6653.namprd11.prod.outlook.com (2603:10b6:806:26f::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.6863.43; Thu, 12 Oct 2023 01:47:00 +0000 Received: from SA1PR11MB6757.namprd11.prod.outlook.com ([fe80::1f87:bea9:c6c3:4a31]) by SA1PR11MB6757.namprd11.prod.outlook.com ([fe80::1f87:bea9:c6c3:4a31%4]) with mapi id 15.20.6863.043; Thu, 12 Oct 2023 01:47:00 +0000 From: "Liu, Hongtao" To: "Hu, Lin1" , "gcc-patches@gcc.gnu.org" CC: "ubizjak@gmail.com" Subject: RE: [PATCH] Support Intel USER_MSR Thread-Topic: [PATCH] Support Intel USER_MSR Thread-Index: AQHZ+047GZoY9YUSTEW+/Lz5hJQMQbBCqryAgAK6jSA= Date: Thu, 12 Oct 2023 01:47:00 +0000 Message-ID: References: <20231010074645.1392417-1-lin1.hu@intel.com> In-Reply-To: Accept-Language: zh-CN, en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: authentication-results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=intel.com; x-ms-publictraffictype: Email x-ms-traffictypediagnostic: SA1PR11MB6757:EE_|SN7PR11MB6653:EE_ x-ms-office365-filtering-correlation-id: ac1b2de3-2237-4c23-6e0c-08dbcac5209f x-ms-exchange-senderadcheck: 1 x-ms-exchange-antispam-relay: 0 x-microsoft-antispam: BCL:0; x-microsoft-antispam-message-info: lblQ5ZLICX0Jn2DuRDZZYDgpxvopBPdr2ALU1Teq5LGN7oL6HgmPsOdS6kmB8eAxVdimaZAa6Nu43zC/JvlK88rMaxWi3DgsWPgam12TgAzDfBVRE4MDiICKvfbOnXB9Lf9QokTYwFPipf3MB9W2ZPzt4iBE3udwM5UTr8BltiI3i/VNMpZIR2KNN3IFtNsanIk7FavxetB0G3PE+THZ9NzYaTDJlENtz5jsAtWf09G+OQ0j7WPaDaPaS/Af32p1Pf2uh0FD85MtHZUoPJmkLpTgfB6dG18QQf/EKq8TYCJDJVAfAuFHVMSjJn5jSYq9EJbzD4MMuZn3BBSHsJMX99efz8Bj/1Vg8/eDEbOKpfVcJO0gtnGNXjaCGI/+T8oagestbzHFKqHEehX7ZsVUhxob/iX+whg+u2v7sqwrC0PVUeC338JuIPUsPpP1NfMwVc/DDNTc5PdAwx1L9zjuK2PbekiV1KK3aw+hQ6J+TcQr8rDzt9GYITB0MyHK1sTgYGFfIwcbaskjT8x6R9gdwFzm0aMpfNM/BfydbB1ca12rKW+n7+hhQd04vZ1H9VAHR4nuBHbYOp+NXzTo7fJ/XSP9mEEL6BbI98HKI0EY3umvO8UjgNcOiQlCPpHhrxAtjv9oXy79J2ZL+JiubjKz1dQHDnYhAf1oNVkjLvzQ4fo= x-forefront-antispam-report: CIP:255.255.255.255;CTRY:;LANG:en;SCL:1;SRV:;IPV:NLI;SFV:NSPM;H:SA1PR11MB6757.namprd11.prod.outlook.com;PTR:;CAT:NONE;SFS:(13230031)(346002)(366004)(39860400002)(396003)(136003)(376002)(230922051799003)(64100799003)(451199024)(186009)(1800799009)(33656002)(55016003)(5660300002)(8936002)(4326008)(8676002)(52536014)(86362001)(2906002)(30864003)(82960400001)(478600001)(122000001)(9686003)(84970400001)(26005)(83380400001)(38100700002)(38070700005)(71200400001)(6506007)(7696005)(53546011)(41300700001)(316002)(76116006)(110136005)(66556008)(66476007)(66446008)(66946007)(64756008)(2004002)(579004)(559001);DIR:OUT;SFP:1102; x-ms-exchange-antispam-messagedata-chunkcount: 1 x-ms-exchange-antispam-messagedata-0: =?us-ascii?Q?8udMRIADjX77MeaYCu1h6IRYHaF4n6CykEtdR8gfNcCv4/zT6KKbtqkSByUn?= =?us-ascii?Q?g4MoJMIXN1/gsE05xOQYoa0TmBa5NB1PB+2C4RQufIlB+yzsnj+opeia4f00?= =?us-ascii?Q?X+FZTY6SGCIrJNR5dH4Vp9aZCyhS38sVECOVc7uL9AAzvUsV4u95/NANFGeA?= =?us-ascii?Q?anibCRwt8lx4FtKt3MYkVOxx7QibrC4WIpn2yuj3LwpfHxVxzsYfn+pe/mKz?= =?us-ascii?Q?Z3ISocWhfU6+Ae3FJFgN8juhDed8bbpZ2Ungde7fUNPgZXMa7eb92mPFsLck?= =?us-ascii?Q?Br6khEmuu7e+9TYvhvspZDvEs2QFIyU1q5duwIVcJ2O//vnwNKRch+FB/oPq?= =?us-ascii?Q?Jzs21Yx3593wcGEdqIHos11sBFXECAm2b0YHpo+9KtEtLPpHqFRJ2riWL0wp?= =?us-ascii?Q?MgX+X6cvqSj3J7wnCakZdkIvRwfU+bpLj5EuoVvjDMCKTdK756y98ASXTjfg?= =?us-ascii?Q?cJ6kkC4+T9oNWMouJaq6OwVmMggJI35BxljE4Kn8g1MH5YmU3ByG7t+U6f1D?= =?us-ascii?Q?8MqHE6kTZLKlvCVZUMGpbrdN8zaINCZWw/wvUlLkZzcEomaVGUAn4RiKQRYF?= =?us-ascii?Q?jg98Du6C9fD1NcCRw1EPsoDCay7dUPnP9Mv47+pa3O8fezALthPUOOhF/6+o?= =?us-ascii?Q?njIS+0SbzKIvLQXzcKF3ooUnePvWXwUnkFfR91YUMEeCiI7Zh97bWiJ47IuC?= =?us-ascii?Q?s7rwcah/kQ5YDX+G466pJExatfU4dNf6OT/zATwYHLhR5Yyqgq5gr1pqDZyX?= =?us-ascii?Q?Wf6wgeXQKMMn498jn4m/IA64vyguyAJ7fB0CIPr52ke1c2nBHwY4OgKwCIHL?= =?us-ascii?Q?GpSzfbofHzxCaNMoJjB+V7dSceXfkLnTu83Z4rQP62OMvk/yOn4hF/d36Piu?= =?us-ascii?Q?IlHyoj/l3gRRxVf/36K69WVqsN8qBf5gtXoUI2G3iSczxpRBUNKMgc9DRuUU?= =?us-ascii?Q?4dLmIpGANj5uV5yxUvvKg5k9Q8lFFatsxe1qs+KQyewpqYCdquKh9K36+rYZ?= =?us-ascii?Q?mU1znO9ttDQxY359Gjp/bXQhktqVm9FlYx4vM26rfc0HYbdpeMvhrCTugA+m?= =?us-ascii?Q?VjBGFnEIxfdE9GmeKe7tZ/cXFdpabOJtP2898eii5oysQRF1DfaVr/2RarH1?= =?us-ascii?Q?1B1EjJuXAVephajldUQEpWp+/lT6jJmzeC3F+hF2Ev/DTFvYoG7nlsNb8l+A?= =?us-ascii?Q?A0TTxge+Tzldq6W0l0copJ1ZzJdLAnNJ4rIweDeVLX/SNLz0YsoZWXxycYbO?= =?us-ascii?Q?U3IQT3l+EfLPt2dwY+VK9xdHzeTc8j3mlHjffputY2MP23l7H18BzMtDk54/?= =?us-ascii?Q?mGoUiinPoR1XObD+0rXDg6JOkc9iFM8FNcSACvW5hQOMI5Kcha8GSYUeEKdH?= =?us-ascii?Q?w5kkLJ61GQ4kmDgIXYdfcthUw2EP76BuFYrwtAWE+0sahkx1puFoF+khhttu?= =?us-ascii?Q?Shd9MSaZ9gjwKlAXkea3HWkWbrvluPe8lHihJFgBQycL6GabZx6hQ71qg0xb?= =?us-ascii?Q?r3kvD5Y9cCjq98BIo1aZMBaA9FHdRKBB8/mkCAkO9XkUTx+BusZ5ehUGhQrD?= =?us-ascii?Q?koU7luLozyoql+tGF84WRnbnP6A9eVDkmsKALxdP?= Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-AuthSource: SA1PR11MB6757.namprd11.prod.outlook.com X-MS-Exchange-CrossTenant-Network-Message-Id: ac1b2de3-2237-4c23-6e0c-08dbcac5209f X-MS-Exchange-CrossTenant-originalarrivaltime: 12 Oct 2023 01:47:00.7539 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: 46c98d88-e344-4ed4-8496-4ed7712e255d X-MS-Exchange-CrossTenant-mailboxtype: HOSTED X-MS-Exchange-CrossTenant-userprincipalname: H44GuA3hYY2K3wIt5IWoT2Rarkp9D5uic5zjkONolsWmyaRQ6VGbOPNG7yf2T9DpfDviNKrxDwGxv3C8W253Jg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: SN7PR11MB6653 X-OriginatorOrg: intel.com X-Spam-Status: No, score=-11.6 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH,DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,GIT_PATCH_0,KAM_SHORT,LOTS_OF_MONEY,SPF_HELO_NONE,SPF_NONE,TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org List-Id: > -----Original Message----- > From: Hu, Lin1 > Sent: Tuesday, October 10, 2023 4:06 PM > To: Hu, Lin1 ; gcc-patches@gcc.gnu.org > Cc: Liu, Hongtao ; ubizjak@gmail.com > Subject: RE: [PATCH] Support Intel USER_MSR >=20 > There are some typos In /gcc/doc/extend.texi and /gcc/doc/invoke.texi. Th= ey > should be USER_MSR, not UMSR. I have modified them in my branch. >=20 > -----Original Message----- > From: Hu, Lin1 > Sent: Tuesday, October 10, 2023 3:47 PM > To: gcc-patches@gcc.gnu.org > Cc: Liu, Hongtao ; ubizjak@gmail.com > Subject: [PATCH] Support Intel USER_MSR >=20 > This patch aims to support Intel USER_MSR. Ok. >=20 > gcc/ChangeLog: >=20 > * common/config/i386/cpuinfo.h (get_available_features): > Detect USER_MSR. > * common/config/i386/i386-common.cc > (OPTION_MASK_ISA2_USER_MSR_SET): New. > (OPTION_MASK_ISA2_USER_MSR_UNSET): Ditto. > (ix86_handle_option): Handle -musermsr. > * common/config/i386/i386-cpuinfo.h (enum processor_features): > Add FEATURE_USER_MSR. > * common/config/i386/i386-isas.h: Add ISA_NAME_TABLE_ENTRY > for usermsr. > * config.gcc: Add usermsrintrin.h > * config/i386/cpuid.h (bit_USER_MSR): New. > * config/i386/i386-builtin-types.def: > Add DEF_FUNCTION_TYPE (VOID, UINT64, UINT64). > * config/i386/i386-builtins.cc (ix86_init_mmx_sse_builtins): > Add __builtin_urdmsr and __builtin_uwrmsr. > * config/i386/i386-builtins.h (ix86_builtins): > Add IX86_BUILTIN_URDMSR and IX86_BUILTIN_UWRMSR. > * config/i386/i386-c.cc (ix86_target_macros_internal): > Define __USER_MSR__. > * config/i386/i386-expand.cc (ix86_expand_builtin): > Handle new builtins. > * config/i386/i386-isa.def (USER_MSR): Add DEF_PTA(USER_MSR). > * config/i386/i386-options.cc (ix86_valid_target_attribute_inner_p): > Handle usermsr. > * config/i386/i386.md (urdmsr): New define_insn. > (uwrmsr): Ditto. > * config/i386/i386.opt: Add option -musermsr. > * config/i386/x86gprintrin.h: Include usermsrintrin.h > * doc/extend.texi: Document usermsr. > * doc/invoke.texi: Document -musermsr. > * doc/sourcebuild.texi: Document target usermsr. > * config/i386/usermsrintrin.h: New file. >=20 > gcc/testsuite/ChangeLog: >=20 > * gcc.target/i386/funcspec-56.inc: Add new target attribute. > * gcc.target/i386/x86gprintrin-1.c: Add -musermsr for 64bit target. > * gcc.target/i386/x86gprintrin-2.c: Ditto. > * gcc.target/i386/x86gprintrin-3.c: Ditto. > * gcc.target/i386/x86gprintrin-4.c: Add musermsr for 64bit target. > * gcc.target/i386/x86gprintrin-5.c: Ditto > * gcc.target/i386/usermsr-1.c: New test. > * gcc.target/i386/usermsr-2.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-types.def | 3 + > gcc/config/i386/i386-builtins.cc | 8 +++ > gcc/config/i386/i386-builtins.h | 2 + > gcc/config/i386/i386-c.cc | 2 + > gcc/config/i386/i386-expand.cc | 35 +++++++++++ > gcc/config/i386/i386-isa.def | 1 + > gcc/config/i386/i386-options.cc | 4 +- > gcc/config/i386/i386.md | 24 ++++++++ > gcc/config/i386/i386.opt | 4 ++ > gcc/config/i386/usermsrintrin.h | 60 +++++++++++++++++++ > gcc/config/i386/x86gprintrin.h | 2 + > gcc/doc/extend.texi | 5 ++ > gcc/doc/invoke.texi | 6 +- > gcc/doc/sourcebuild.texi | 3 + > gcc/testsuite/gcc.target/i386/funcspec-56.inc | 2 + > gcc/testsuite/gcc.target/i386/user_msr-1.c | 20 +++++++ > gcc/testsuite/gcc.target/i386/user_msr-2.c | 16 +++++ > .../gcc.target/i386/x86gprintrin-1.c | 2 +- > .../gcc.target/i386/x86gprintrin-2.c | 6 +- > .../gcc.target/i386/x86gprintrin-3.c | 28 ++++++++- > .../gcc.target/i386/x86gprintrin-4.c | 32 +++++++++- > .../gcc.target/i386/x86gprintrin-5.c | 6 +- > 28 files changed, 286 insertions(+), 8 deletions(-) create mode 100644 > gcc/config/i386/usermsrintrin.h create mode 100644 > gcc/testsuite/gcc.target/i386/user_msr-1.c > create mode 100644 gcc/testsuite/gcc.target/i386/user_msr-2.c >=20 > diff --git a/gcc/common/config/i386/cpuinfo.h > b/gcc/common/config/i386/cpuinfo.h > index 141d3743316..0f86b44730b 100644 > --- a/gcc/common/config/i386/cpuinfo.h > +++ b/gcc/common/config/i386/cpuinfo.h > @@ -838,6 +838,8 @@ get_available_features (struct __processor_model > *cpu_model, > set_feature (FEATURE_IBT); > if (edx & bit_UINTR) > set_feature (FEATURE_UINTR); > + if (edx & bit_USER_MSR) > + set_feature (FEATURE_USER_MSR); > if (amx_usable) > { > if (edx & bit_AMX_TILE) > diff --git a/gcc/common/config/i386/i386-common.cc > b/gcc/common/config/i386/i386-common.cc > index 684b0451bb3..13e423deceb 100644 > --- a/gcc/common/config/i386/i386-common.cc > +++ b/gcc/common/config/i386/i386-common.cc > @@ -125,6 +125,7 @@ along with GCC; see the file COPYING3. If not see > #define OPTION_MASK_ISA2_SM4_SET OPTION_MASK_ISA2_SM4 #define > OPTION_MASK_ISA2_APX_F_SET OPTION_MASK_ISA2_APX_F #define > OPTION_MASK_ISA2_EVEX512_SET OPTION_MASK_ISA2_EVEX512 > +#define OPTION_MASK_ISA2_USER_MSR_SET > OPTION_MASK_ISA2_USER_MSR >=20 > /* SSE4 includes both SSE4.1 and SSE4.2. -msse4 should be the same > as -msse4.2. */ > @@ -313,6 +314,7 @@ along with GCC; see the file COPYING3. If not see > #define OPTION_MASK_ISA2_SM4_UNSET OPTION_MASK_ISA2_SM4 > #define OPTION_MASK_ISA2_APX_F_UNSET OPTION_MASK_ISA2_APX_F > #define OPTION_MASK_ISA2_EVEX512_UNSET > OPTION_MASK_ISA2_EVEX512 > +#define OPTION_MASK_ISA2_USER_MSR_UNSET > OPTION_MASK_ISA2_USER_MSR >=20 > /* SSE4 includes both SSE4.1 and SSE4.2. -mno-sse4 should the same > as -mno-sse4.1. */ > @@ -1373,6 +1375,19 @@ ix86_handle_option (struct gcc_options *opts, > } > return true; >=20 > + case OPT_musermsr: > + if (value) > + { > + opts->x_ix86_isa_flags2 |=3D OPTION_MASK_ISA2_USER_MSR_SET; > + opts->x_ix86_isa_flags2_explicit |=3D > OPTION_MASK_ISA2_USER_MSR_SET; > + } > + else > + { > + opts->x_ix86_isa_flags2 &=3D > ~OPTION_MASK_ISA2_USER_MSR_UNSET; > + opts->x_ix86_isa_flags2_explicit |=3D > OPTION_MASK_ISA2_USER_MSR_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 8bf592191ab..47e9dcfb8f7 100644 > --- a/gcc/common/config/i386/i386-cpuinfo.h > +++ b/gcc/common/config/i386/i386-cpuinfo.h > @@ -262,6 +262,7 @@ enum processor_features > FEATURE_SHA512, > FEATURE_SM4, > FEATURE_APX_F, > + FEATURE_USER_MSR, > CPU_FEATURE_MAX > }; >=20 > diff --git a/gcc/common/config/i386/i386-isas.h > b/gcc/common/config/i386/i386-isas.h > index 47e0cbd6f5b..6875924994d 100644 > --- a/gcc/common/config/i386/i386-isas.h > +++ b/gcc/common/config/i386/i386-isas.h > @@ -192,4 +192,5 @@ ISA_NAMES_TABLE_START > ISA_NAMES_TABLE_ENTRY("sha512", FEATURE_SHA512, P_NONE, "- > msha512") > ISA_NAMES_TABLE_ENTRY("sm4", FEATURE_SM4, P_NONE, "-msm4") > ISA_NAMES_TABLE_ENTRY("apxf", FEATURE_APX_F, P_NONE, "-mapxf") > + ISA_NAMES_TABLE_ENTRY("usermsr", FEATURE_USER_MSR, P_NONE, > + "-musermsr") > ISA_NAMES_TABLE_END > diff --git a/gcc/config.gcc b/gcc/config.gcc index cc37a9c768d..284f3d507= ba > 100644 > --- a/gcc/config.gcc > +++ b/gcc/config.gcc > @@ -448,7 +448,8 @@ i[34567]86-*-* | x86_64-*-*) > avxvnniint8intrin.h avxneconvertintrin.h > cmpccxaddintrin.h amxfp16intrin.h prfchiintrin.h > raointintrin.h amxcomplexintrin.h avxvnniint16intrin.h > - sm3intrin.h sha512intrin.h sm4intrin.h" > + sm3intrin.h sha512intrin.h sm4intrin.h > + usermsrintrin.h" > ;; > ia64-*-*) > extra_headers=3Dia64intrin.h > diff --git a/gcc/config/i386/cpuid.h b/gcc/config/i386/cpuid.h index > f3d3a2a1c22..75ef2718204 100644 > --- a/gcc/config/i386/cpuid.h > +++ b/gcc/config/i386/cpuid.h > @@ -149,6 +149,7 @@ > #define bit_AVXNECONVERT (1 << 5) > #define bit_AVXVNNIINT16 (1 << 10) > #define bit_PREFETCHI (1 << 14) > +#define bit_USER_MSR (1 << 15) > #define bit_APX_F (1 << 21) >=20 > /* Extended State Enumeration Sub-leaf (%eax =3D=3D 0xd, %ecx =3D=3D 1) = */ diff --git > a/gcc/config/i386/i386-builtin-types.def b/gcc/config/i386/i386-builtin- > types.def > index e9463120eea..183029f2c75 100644 > --- a/gcc/config/i386/i386-builtin-types.def > +++ b/gcc/config/i386/i386-builtin-types.def > @@ -1422,3 +1422,6 @@ DEF_FUNCTION_TYPE (V4SI, V4SI, V4SI, V4SI, INT) >=20 > # SHA512 builtins > DEF_FUNCTION_TYPE (V4DI, V4DI, V4DI, V2DI) > + > +# USER_MSR builtins > +DEF_FUNCTION_TYPE (VOID, UINT64, UINT64) > diff --git a/gcc/config/i386/i386-builtins.cc b/gcc/config/i386/i386-buil= tins.cc > index 70538fbe17b..42fc3751676 100644 > --- a/gcc/config/i386/i386-builtins.cc > +++ b/gcc/config/i386/i386-builtins.cc > @@ -1262,6 +1262,14 @@ ix86_init_mmx_sse_builtins (void) > "__builtin_ia32_testui", > UINT8_FTYPE_VOID, IX86_BUILTIN_TESTUI); >=20 > + /* USER_MSR. */ > + def_builtin (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_USER_MSR, > + "__builtin_ia32_urdmsr", UINT64_FTYPE_UINT64, > + IX86_BUILTIN_URDMSR); > + def_builtin (OPTION_MASK_ISA_64BIT, OPTION_MASK_ISA2_USER_MSR, > + "__builtin_ia32_uwrmsr", VOID_FTYPE_UINT64_UINT64, > + IX86_BUILTIN_UWRMSR); > + > /* CLDEMOTE. */ > def_builtin (0, OPTION_MASK_ISA2_CLDEMOTE, "__builtin_ia32_cldemote", > VOID_FTYPE_PCVOID, IX86_BUILTIN_CLDEMOTE); diff --git > a/gcc/config/i386/i386-builtins.h b/gcc/config/i386/i386-builtins.h index > c632482087c..40785b0aa34 100644 > --- a/gcc/config/i386/i386-builtins.h > +++ b/gcc/config/i386/i386-builtins.h > @@ -39,6 +39,8 @@ enum ix86_builtins > IX86_BUILTIN_MWAIT, > IX86_BUILTIN_UMONITOR, > IX86_BUILTIN_UMWAIT, > + IX86_BUILTIN_URDMSR, > + IX86_BUILTIN_UWRMSR, > IX86_BUILTIN_TPAUSE, > IX86_BUILTIN_TESTUI, > IX86_BUILTIN_CLZERO, > diff --git a/gcc/config/i386/i386-c.cc b/gcc/config/i386/i386-c.cc index > 9c44bd7fb63..042ad8b9d9c 100644 > --- a/gcc/config/i386/i386-c.cc > +++ b/gcc/config/i386/i386-c.cc > @@ -712,6 +712,8 @@ ix86_target_macros_internal (HOST_WIDE_INT > isa_flag, > def_or_undef (parse_in, "__SM4__"); > if (isa_flag2 & OPTION_MASK_ISA2_EVEX512) > def_or_undef (parse_in, "__EVEX512__"); > + if (isa_flag2 & OPTION_MASK_ISA2_USER_MSR) > + def_or_undef (parse_in, "__USER_MSR__"); > if (TARGET_IAMCU) > { > def_or_undef (parse_in, "__iamcu"); diff --git a/gcc/config/i386/i= 386- > expand.cc b/gcc/config/i386/i386-expand.cc index > d5083494798..4ef85570d44 100644 > --- a/gcc/config/i386/i386-expand.cc > +++ b/gcc/config/i386/i386-expand.cc > @@ -13471,6 +13471,41 @@ ix86_expand_builtin (tree exp, rtx target, rtx > subtarget, > return 0; > } >=20 > + case IX86_BUILTIN_URDMSR: > + case IX86_BUILTIN_UWRMSR: > + { > + arg0 =3D CALL_EXPR_ARG (exp, 0); > + op0 =3D expand_normal (arg0); > + > + if (CONST_INT_P (op0)) > + { > + unsigned HOST_WIDE_INT val =3D UINTVAL (op0); > + if (val > 0xffffffff) > + op0 =3D force_reg (DImode, op0); > + } > + else > + op0 =3D force_reg (DImode, op0); > + > + if (fcode =3D=3D IX86_BUILTIN_UWRMSR) > + { > + arg1 =3D CALL_EXPR_ARG (exp, 1); > + op1 =3D expand_normal (arg1); > + op1 =3D force_reg (DImode, op1); > + icode =3D CODE_FOR_uwrmsr; > + target =3D 0; > + } > + else > + { > + if (target =3D=3D 0) > + target =3D gen_reg_rtx (DImode); > + icode =3D CODE_FOR_urdmsr; > + op1 =3D op0; > + op0 =3D target; > + } > + emit_insn (GEN_FCN (icode) (op0, op1)); > + return target; > + } > + > case IX86_BUILTIN_VEC_INIT_V2SI: > case IX86_BUILTIN_VEC_INIT_V4HI: > case IX86_BUILTIN_VEC_INIT_V8QI: > diff --git a/gcc/config/i386/i386-isa.def b/gcc/config/i386/i386-isa.def = index > c581f343339..991df5e2ef0 100644 > --- a/gcc/config/i386/i386-isa.def > +++ b/gcc/config/i386/i386-isa.def > @@ -122,3 +122,4 @@ DEF_PTA(SM3) > DEF_PTA(SHA512) > DEF_PTA(SM4) > DEF_PTA(APX_F) > +DEF_PTA(USER_MSR) > diff --git a/gcc/config/i386/i386-options.cc b/gcc/config/i386/i386- > options.cc index 06af373ca57..9506c470147 100644 > --- a/gcc/config/i386/i386-options.cc > +++ b/gcc/config/i386/i386-options.cc > @@ -251,7 +251,8 @@ static struct ix86_target_opts isa2_opts[] =3D > { "-msm3", OPTION_MASK_ISA2_SM3 }, > { "-msha512", OPTION_MASK_ISA2_SHA512 }, > { "-msm4", OPTION_MASK_ISA2_SM4 }, > - { "-mevex512", OPTION_MASK_ISA2_EVEX512 } > + { "-mevex512", OPTION_MASK_ISA2_EVEX512 }, > + { "-musermsr", OPTION_MASK_ISA2_USER_MSR } > }; > static struct ix86_target_opts isa_opts[] =3D { @@ -1114,6 +1115,7 @@ > ix86_valid_target_attribute_inner_p (tree fndecl, tree args, char *p_stri= ngs[], > IX86_ATTR_ISA ("sm4", OPT_msm4), > IX86_ATTR_ISA ("apxf", OPT_mapxf), > IX86_ATTR_ISA ("evex512", OPT_mevex512), > + IX86_ATTR_ISA ("usermsr", OPT_musermsr), >=20 > /* enum options */ > IX86_ATTR_ENUM ("fpmath=3D", OPT_mfpmath_), > diff --git a/gcc/config/i386/i386.md b/gcc/config/i386/i386.md index > f390fb5692b..b8f60d1df4b 100644 > --- a/gcc/config/i386/i386.md > +++ b/gcc/config/i386/i386.md > @@ -340,6 +340,10 @@ >=20 > ;; For PREFETCHI support > UNSPECV_PREFETCHI > + > + ;; For USER_MSR support > + UNSPECV_URDMSR > + UNSPECV_UWRMSR > ]) >=20 > ;; Constants to represent rounding modes in the ROUND instruction @@ - > 26601,6 +26605,26 @@ > DONE; > }) >=20 > +(define_insn "urdmsr" > + [(set (match_operand:DI 0 "register_operand" "=3Dr") > + (unspec_volatile:DI > + [(match_operand:DI 1 "x86_64_szext_nonmemory_operand" "reZ")] > + UNSPECV_URDMSR))] > + "TARGET_USER_MSR && TARGET_64BIT" > + "urdmsr\t{%1, %0|%0, %1}" > + [(set_attr "prefix" "vex") > + (set_attr "type" "other")]) > + > +(define_insn "uwrmsr" > + [(unspec_volatile > + [(match_operand:DI 0 "x86_64_szext_nonmemory_operand" "reZ") > + (match_operand:DI 1 "register_operand" "r")] > + UNSPECV_UWRMSR)] > + "TARGET_USER_MSR && TARGET_64BIT" > + "uwrmsr\t{%1, %0|%0, %1}" > + [(set_attr "prefix" "vex") > + (set_attr "type" "other")]) > + > (include "mmx.md") > (include "sse.md") > (include "sync.md") > diff --git a/gcc/config/i386/i386.opt b/gcc/config/i386/i386.opt index > 05ba7f37244..b8382c48099 100644 > --- a/gcc/config/i386/i386.opt > +++ b/gcc/config/i386/i386.opt > @@ -1344,3 +1344,7 @@ hook reg or mem constraint in inline asm to > GPR16. > mevex512 > Target Mask(ISA2_EVEX512) Var(ix86_isa_flags2) Save Support 512 bit > vector built-in functions and code generation. > + > +musermsr > +Target Mask(ISA2_USER_MSR) Var(ix86_isa_flags2) Save Support USER_MSR > +built-in functions and code generation. > diff --git a/gcc/config/i386/usermsrintrin.h > b/gcc/config/i386/usermsrintrin.h new file mode 100644 index > 00000000000..9e1dbdca112 > --- /dev/null > +++ b/gcc/config/i386/usermsrintrin.h > @@ -0,0 +1,60 @@ > +/* Copyright (C) 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 > + . */ > + > +#if !defined _X86GPRINTRIN_H_INCLUDED > +#error "Never use directly; include > instead." > +#endif > + > +#ifndef _USER_MSRINTRIN_H_INCLUDED > +#define _USER_MSRINTRIN_H_INCLUDED > + > +#ifdef __x86_64__ > + > +#ifndef __USER_MSR__ > +#pragma GCC push_options > +#pragma GCC target("usermsr") > +#define __DISABLE_USER_MSR__ > +#endif /* __USER_MSR__ */ > + > +extern __inline unsigned long long > +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) > +_urdmsr (unsigned long long __A) { > + return (unsigned long long) __builtin_ia32_urdmsr (__A); } > + > +extern __inline void > +__attribute__ ((__gnu_inline__, __always_inline__, __artificial__)) > +_uwrmsr (unsigned long long __A, unsigned long long __B) { > + __builtin_ia32_uwrmsr (__A, __B); > +} > + > +#ifdef __DISABLE_USER_MSR__ > +#undef __DISABLE_USER_MSR__ > +#pragma GCC pop_options > +#endif /* __DISABLE_USER_MSR__ */ > + > +#endif /* __x86_64__ */ > + > +#endif /* _USER_MSRINTRIN_H_INCLUDED */ > diff --git a/gcc/config/i386/x86gprintrin.h b/gcc/config/i386/x86gprintri= n.h > index f41be3ffcde..11a8a963020 100644 > --- a/gcc/config/i386/x86gprintrin.h > +++ b/gcc/config/i386/x86gprintrin.h > @@ -108,6 +108,8 @@ >=20 > #include >=20 > +#include > + > extern __inline void > __attribute__((__gnu_inline__, __always_inline__, __artificial__)) _wbi= nvd > (void) diff --git a/gcc/doc/extend.texi b/gcc/doc/extend.texi index > b82497f00e4..991c2db8eba 100644 > --- a/gcc/doc/extend.texi > +++ b/gcc/doc/extend.texi > @@ -7210,6 +7210,11 @@ Enable/disable the generation of the SHA512 > instructions. > @itemx no-sm4 > Enable/disable the generation of the SM4 instructions. >=20 > +@cindex @code{target("umsr")} function attribute, x86 @item umsr @itemx > +no-umsr Enable/disable the generation of the UMSR instructions. > + > @cindex @code{target("cld")} function attribute, x86 @item cld @itemx = no- > cld diff --git a/gcc/doc/invoke.texi b/gcc/doc/invoke.texi index > 7c5f81d9783..3edf41257f1 100644 > --- a/gcc/doc/invoke.texi > +++ b/gcc/doc/invoke.texi > @@ -1444,6 +1444,7 @@ See RS/6000 and PowerPC Options. > -mamx-tile -mamx-int8 -mamx-bf16 -muintr -mhreset -mavxvnni > -mavx512fp16 -mavxifma -mavxvnniint8 -mavxneconvert -mcmpccxadd - > mamx-fp16 -mprefetchi -mraoint -mamx-complex -mavxvnniint16 -msm3 - > msha512 -msm4 -mapxf > +-mumsr > -mcldemote -mms-bitfields -mno-align-stringops -minline-all-stringops= - > minline-stringops-dynamically -mstringop-strategy=3D@var{alg} -mkl -mwi= dekl > @@ -33830,6 +33831,9 @@ preferred alignment to @option{-mpreferred- > stack-boundary=3D2}. > @need 200 > @opindex mapxf > @itemx -mapxf > +@need 200 > +@opindex mumsr > +@itemx -mumsr > These switches enable the use of instructions in the MMX, SSE, AVX512ER= , > AVX512CD, AVX512VL, AVX512BW, AVX512DQ, AVX512IFMA, > AVX512VBMI, SHA, AES, PCLMUL, CLFLUSHOPT, CLWB, FSGSBASE, PTWRITE, > RDRND, F16C, FMA, PCONFIG, @@ -33840,7 +33844,7 @@ GFNI, VAES, > WAITPKG, VPCLMULQDQ, AVX512BITALG, MOVDIRI, MOVDIR64B, > AVX512BF16, ENQCMD, AVX512VPOPCNTDQ, AVX5124FMAPS, > AVX512VNNI, AVX5124VNNIW, SERIALIZE, UINTR, HRESET, AMXTILE, > AMXINT8, AMXBF16, KL, WIDEKL, AVXVNNI, AVX512-FP16, AVXIFMA, > AVXVNNIINT8, AVXNECONVERT, CMPCCXADD, AMX-FP16, PREFETCHI, > RAOINT, -AMX-COMPLEX, AVXVNNIINT16, SM3, SHA512, SM4, APX_F or > CLDEMOTE extended > +AMX-COMPLEX, AVXVNNIINT16, SM3, SHA512, SM4, APX_F, UMSR or > CLDEMOTE > +extended > instruction sets. Each has a corresponding @option{-mno-} option to disa= ble > use of these instructions. >=20 > diff --git a/gcc/doc/sourcebuild.texi b/gcc/doc/sourcebuild.texi index > 8bf701461ec..a859bcc53cc 100644 > --- a/gcc/doc/sourcebuild.texi > +++ b/gcc/doc/sourcebuild.texi > @@ -2624,6 +2624,9 @@ Test environment appears to run executables on a > simulator that accepts only @code{EM_SPARC} executables and chokes on > @code{EM_SPARC32PLUS} or @code{EM_SPARCV9} executables. >=20 > +@item umsr > +Target supports the execution of @code{umsr} instructions. > + > @item vect_cmdline_needed > Target requires a command line argument to enable a SIMD instruction set= . >=20 > diff --git a/gcc/testsuite/gcc.target/i386/funcspec-56.inc > b/gcc/testsuite/gcc.target/i386/funcspec-56.inc > index ca558b3e828..e0470a60483 100644 > --- a/gcc/testsuite/gcc.target/i386/funcspec-56.inc > +++ b/gcc/testsuite/gcc.target/i386/funcspec-56.inc > @@ -92,6 +92,7 @@ extern void test_avxvnniint16 (void) > __attribute__((__target__("avxvnniint16")) > extern void test_sm3 (void) > __attribute__((__target__("sm3"))); > extern void test_sha512 (void) > __attribute__((__target__("sha512"))); > extern void test_sm4 (void) __attribute__((__target_= _("sm4"))); > +extern void test_user_msr (void) > __attribute__((__target__("usermsr"))); >=20 > extern void test_no_sgx (void) > __attribute__((__target__("no-sgx"))); > extern void test_no_avx5124fmaps(void) > __attribute__((__target__("no-avx5124fmaps"))); > @@ -185,6 +186,7 @@ extern void test_no_avxvnniint16 (void) > __attribute__((__target__("no-avxvnniin > extern void test_no_sm3 (void) > __attribute__((__target__("no-sm3"))); > extern void test_no_sha512 (void) > __attribute__((__target__("no-sha512"))); > extern void test_no_sm4 (void) __attribute__((__target_= _("no- > sm4"))); > +extern void test_no_user_msr (void) > __attribute__((__target__("no-usermsr"))); >=20 > extern void test_arch_nocona (void) > __attribute__((__target__("arch=3Dnocona"))); > extern void test_arch_core2 (void) > __attribute__((__target__("arch=3Dcore2"))); > diff --git a/gcc/testsuite/gcc.target/i386/user_msr-1.c > b/gcc/testsuite/gcc.target/i386/user_msr-1.c > new file mode 100644 > index 00000000000..447852306df > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/user_msr-1.c > @@ -0,0 +1,20 @@ > +/* { dg-do compile { target { ! ia32 } } } */ > +/* { dg-options "-musermsr -O2" } */ > +/* { dg-final { scan-assembler-times "urdmsr\[ \\t\]\\%r\[a-z\]x, > +\\%r\[a-z\]x" 1 } } */ > +/* { dg-final { scan-assembler-times "urdmsr\[ \\t\]\\\$121" 1 } } */ > +/* { dg-final { scan-assembler-times "uwrmsr\[ \\t\]\\%r\[a-z\]x, > +\\%r\[a-z\]x" 1 } } */ > +/* { dg-final { scan-assembler-times "uwrmsr\[ \\t\]\\%r\[a-z\]x, > +\\\$121" 1 } } */ > + > +#include > + > +volatile unsigned long long x; > +volatile unsigned long long y; > + > +void extern > +user_msr_test (void) > +{ > + x =3D _urdmsr(y); > + x =3D _urdmsr(121); > + _uwrmsr(y, x); > + _uwrmsr(121, x); > +} > diff --git a/gcc/testsuite/gcc.target/i386/user_msr-2.c > b/gcc/testsuite/gcc.target/i386/user_msr-2.c > new file mode 100644 > index 00000000000..ab0e76f9088 > --- /dev/null > +++ b/gcc/testsuite/gcc.target/i386/user_msr-2.c > @@ -0,0 +1,16 @@ > +/* { dg-do compile { target { ! ia32 } } } */ > +/* { dg-options "-O2 -musermsr" } */ > +/* { dg-final { scan-assembler-times "urdmsr\[ \\t\]\\%r\[a-z\]x, > +\\%r\[a-z\]x" 1 } } */ > +/* { dg-final { scan-assembler-times "uwrmsr\[ \\t\]\\%r\[a-z\]x, > +\\%r\[a-z\]x" 1 } } */ > +/* { dg-final { scan-assembler-times "movabsq\[ > +\\t\]\\\$20018842566655, \\%r\[a-z\]x" 1 } } */ > + > +#include > + > +volatile unsigned long long x; > + > +void extern > +user_msr_test (void) > +{ > + x =3D _urdmsr(0x1234ffffffffULL); > + _uwrmsr(0x1234ffffffffULL, x); > +} > diff --git a/gcc/testsuite/gcc.target/i386/x86gprintrin-1.c > b/gcc/testsuite/gcc.target/i386/x86gprintrin-1.c > index 68da4db4f3c..b9479beef7c 100644 > --- a/gcc/testsuite/gcc.target/i386/x86gprintrin-1.c > +++ b/gcc/testsuite/gcc.target/i386/x86gprintrin-1.c > @@ -1,7 +1,7 @@ > /* Test that is usable with -O -std=3Dc89 -pedantic-err= ors. */ > /* { dg-do compile } */ > /* { dg-options "-O -std=3Dc89 -pedantic-errors -march=3Dx86-64 -madx -m= bmi - > 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 -mprefetchi -muintr" { target { = ! > ia32 } } } */ > +/* { dg-additional-options "-musermsr -mcmpccxadd -mprefetchi -muintr" > +{ target { ! ia32 } } } */ >=20 > #include >=20 > diff --git a/gcc/testsuite/gcc.target/i386/x86gprintrin-2.c > b/gcc/testsuite/gcc.target/i386/x86gprintrin-2.c > index 737c2a26f98..ee167ebab90 100644 > --- a/gcc/testsuite/gcc.target/i386/x86gprintrin-2.c > +++ b/gcc/testsuite/gcc.target/i386/x86gprintrin-2.c > @@ -1,7 +1,7 @@ > /* { dg-do compile } */ > /* { dg-options "-O2 -Werror-implicit-function-declaration -march=3Dx86-= 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 -mprefetchi -muintr" { target { = ! > ia32 } } } */ > +/* { dg-additional-options "-musermsr -mcmpccxadd -mprefetchi -muintr" > +{ target { ! ia32 } } } */ >=20 > /* Test that the intrinsics in compile with optimizatio= n. > All of them are defined as inline functions that reference the proper= @@ - > 32,4 +32,8 @@ #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) >=20 > +/* usermsrintrin.h */ > +#define __builtin_ia32_urdmsr(A) __builtin_ia32_urdmsr(1) #define > +__builtin_ia32_uwrmsr(A, B) __builtin_ia32_uwrmsr(1, B) > + > #include > diff --git a/gcc/testsuite/gcc.target/i386/x86gprintrin-3.c > b/gcc/testsuite/gcc.target/i386/x86gprintrin-3.c > index 52690b1dfb5..a87039149f9 100644 > --- a/gcc/testsuite/gcc.target/i386/x86gprintrin-3.c > +++ b/gcc/testsuite/gcc.target/i386/x86gprintrin-3.c > @@ -1,7 +1,7 @@ > /* { dg-do compile } */ > /* { dg-options "-O0 -Werror-implicit-function-declaration -march=3Dx86-= 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 -mprefetchi -muintr" { target { = ! > ia32 } } } */ > +/* { dg-additional-options "-musermsr -mcmpccxadd -mprefetchi -muintr" > +{ target { ! ia32 } } } */ >=20 > /* Test that the intrinsics in compile without optimiza= tion. > All of them are defined as inline functions that reference the proper= @@ - > 14,3 +14,29 @@ #define __inline >=20 > #include > + > +#define _CONCAT(x,y) x ## y > + > +#define test_0(func, type, imm) \ > + type _CONCAT(_0,func) (int const I) \ > + { return func (imm); } > + > +#define test_1(func, type, op1_type) \ > + type _CONCAT(_1,func) (op1_type A) \ > + { return func (A); } > + > +#define test_1r(func, type, op1_type, imm) \ > + type _CONCAT(_1r,func) (op1_type A, int const I) \ > + { return func (imm, A); } > + > +#define test_2(func, type, op1_type, op2_type) \ > + type _CONCAT(_2,func) (op1_type A, op2_type B) \ > + { return func (A, B); } > + > +/* usermsrintrin.h */ > +#ifdef __x86_64__ > +test_0 (_urdmsr, unsigned long long, 1) > +test_1 (_urdmsr, unsigned long long, unsigned long long) test_1r > +(_uwrmsr, void, unsigned long long, 1) > +test_2 (_uwrmsr, void, unsigned long long, unsigned long long) #endif > diff --git a/gcc/testsuite/gcc.target/i386/x86gprintrin-4.c > b/gcc/testsuite/gcc.target/i386/x86gprintrin-4.c > index 94cfc583dc9..c3c79473020 100644 > --- a/gcc/testsuite/gcc.target/i386/x86gprintrin-4.c > +++ b/gcc/testsuite/gcc.target/i386/x86gprintrin-4.c > @@ -13,9 +13,27 @@ > #define extern > #define __inline >=20 > +#define _CONCAT(x,y) x ## y > + > +#define test_0(func, type, imm) \ > + type _CONCAT(_0,func) (int const I) \ > + { return func (imm); } > + > +#define test_1(func, type, op1_type) \ > + type _CONCAT(_1,func) (op1_type A) \ > + { return func (A); } > + > +#define test_1r(func, type, op1_type, imm) \ > + type _CONCAT(_1r,func) (op1_type A, int const I) \ > + { return func (imm, A); } > + > +#define test_2(func, type, op1_type, op2_type) \ > + type _CONCAT(_2,func) (op1_type A, op2_type B) \ > + { return func (A, B); } > + > #ifndef DIFFERENT_PRAGMAS > #ifdef __x86_64__ > -#pragma GCC target > ("adx,bmi,bmi2,cmpccxadd,fsgsbase,fxsr,hreset,lwp,lzcnt,popcnt,prefetchi,= ra > oint,rdrnd,rdseed,tbm,rtm,serialize,tsxldtrk,uintr,xsaveopt") > +#pragma GCC target > +("adx,bmi,bmi2,cmpccxadd,fsgsbase,fxsr,hreset,lwp,lzcnt,popcnt,prefetch > +i,raoint,rdrnd,rdseed,tbm,rtm,serialize,tsxldtrk,uintr,usermsr,xsaveopt > +") > #else > #pragma GCC target > ("adx,bmi,bmi2,fsgsbase,fxsr,hreset,lwp,lzcnt,popcnt,raoint,rdrnd,rdseed,= tb > m,rtm,serialize,tsxldtrk,xsaveopt") > #endif > @@ -29,6 +47,18 @@ >=20 > /* x86intrin.h (LWP/BMI/BMI2/TBM/LZCNT). */ #ifdef DIFFERENT_PRAGMAS > +#ifdef __x86_64__ > +#pragma GCC target ("lwp,bmi,bmi2,tbm,lzcnt,usermsr") > +#else > #pragma GCC target ("lwp,bmi,bmi2,tbm,lzcnt") #endif > +#endif > #include > + > +/* usermsrintrin.h */ > +#ifdef __x86_64__ > +test_0 (_urdmsr, unsigned long long, 1) > +test_1 (_urdmsr, unsigned long long, unsigned long long) test_1r > +(_uwrmsr, void, unsigned long long, 1) > +test_2 (_uwrmsr, void, unsigned long long, unsigned long long) #endif > diff --git a/gcc/testsuite/gcc.target/i386/x86gprintrin-5.c > b/gcc/testsuite/gcc.target/i386/x86gprintrin-5.c > index 95f3e0a003c..ef126ea76c2 100644 > --- a/gcc/testsuite/gcc.target/i386/x86gprintrin-5.c > +++ b/gcc/testsuite/gcc.target/i386/x86gprintrin-5.c > @@ -31,8 +31,12 @@ > #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) >=20 > +/* usermsrintrin.h */ > +#define __builtin_ia32_urdmsr(A) __builtin_ia32_urdmsr(1) #define > +__builtin_ia32_uwrmsr(A, B) __builtin_ia32_uwrmsr(1, B) > + > #ifdef __x86_64__ > -#pragma GCC target > ("adx,bmi,bmi2,clflushopt,clwb,clzero,cmpccxadd,enqcmd,fsgsbase,fxsr,hres= e > t,lwp,lzcnt,mwaitx,pconfig,pku,popcnt,prefetchi,raoint,rdpid,rdrnd,rdseed= ,tb > m,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,prefetchi,raoint,rdpid,rdrnd,r > +dseed,tbm,rtm,serialize,sgx,tsxldtrk,uintr,usermsr,xsavec,xsaveopt,xsav > +es,wbnoinvd") > #else > #pragma GCC target > ("adx,bmi,bmi2,clflushopt,clwb,clzero,enqcmd,fsgsbase,fxsr,hreset,lwp,lzc= nt, > mwaitx,pconfig,pku,popcnt,raoint,rdpid,rdrnd,rdseed,tbm,rtm,serialize,sgx= ,ts > xldtrk,xsavec,xsaveopt,xsaves,wbnoinvd") > #endif > -- > 2.31.1