From patchwork Mon Mar 23 17:43:41 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Srinath Parvathaneni X-Patchwork-Id: 1260177 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=8.43.85.97; helo=sourceware.org; envelope-from=gcc-patches-bounces@gcc.gnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=arm.com Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=armh.onmicrosoft.com header.i=@armh.onmicrosoft.com header.a=rsa-sha256 header.s=selector2-armh-onmicrosoft-com header.b=A0wP4vil; dkim=pass (1024-bit key) header.d=armh.onmicrosoft.com header.i=@armh.onmicrosoft.com header.a=rsa-sha256 header.s=selector2-armh-onmicrosoft-com header.b=A0wP4vil; dkim-atps=neutral Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 48mMK11RvLz9sQt for ; Tue, 24 Mar 2020 04:47:17 +1100 (AEDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 341E0385E00B; Mon, 23 Mar 2020 17:47:15 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from EUR05-VI1-obe.outbound.protection.outlook.com (mail-vi1eur05on2077.outbound.protection.outlook.com [40.107.21.77]) by sourceware.org (Postfix) with ESMTPS id 795E5385C426 for ; Mon, 23 Mar 2020 17:47:08 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 795E5385C426 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=Srinath.Parvathaneni@arm.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=FrO4FXQ4XS0xH33wVIxyOlrXuC2js3rJ8gSZeXh64/E=; b=A0wP4vilS8seFbNsLaPdzuMM6Z+2wRLORKQHc3NcJbPHM7V8lh1V+HMYwaduYNM6gy57SaeN/vSKFko75DDq3FHuefVsPBMSHpgxlJWTX6Wla3Kb6sBghOO0HiL9ixBKfBtGv4s1ANw4GNTwVSDTt6MZxw0eZKfnSTuuqVbJLHw= Received: from AM4PR0501CA0063.eurprd05.prod.outlook.com (2603:10a6:200:68::31) by HE1PR08MB2779.eurprd08.prod.outlook.com (2603:10a6:7:35::13) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2835.18; Mon, 23 Mar 2020 17:47:05 +0000 Received: from AM5EUR03FT022.eop-EUR03.prod.protection.outlook.com (2603:10a6:200:68:cafe::b1) by AM4PR0501CA0063.outlook.office365.com (2603:10a6:200:68::31) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2835.20 via Frontend Transport; Mon, 23 Mar 2020 17:47:05 +0000 Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; gcc.gnu.org; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com; gcc.gnu.org; dmarc=bestguesspass action=none header.from=arm.com; Received-SPF: Pass (protection.outlook.com: domain of arm.com designates 63.35.35.123 as permitted sender) receiver=protection.outlook.com; client-ip=63.35.35.123; helo=64aa7808-outbound-1.mta.getcheckrecipient.com; Received: from 64aa7808-outbound-1.mta.getcheckrecipient.com (63.35.35.123) by AM5EUR03FT022.mail.protection.outlook.com (10.152.16.79) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2814.13 via Frontend Transport; Mon, 23 Mar 2020 17:47:05 +0000 Received: ("Tessian outbound 47356f393f3c:v48"); Mon, 23 Mar 2020 17:47:05 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: b79557c67c1b5499 X-CR-MTA-TID: 64aa7808 Received: from 918d09ad1f9c.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 7B9B973E-2A95-40CD-ACC8-C8BADECE2016.1; Mon, 23 Mar 2020 17:46:59 +0000 Received: from EUR04-DB3-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 918d09ad1f9c.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Mon, 23 Mar 2020 17:46:59 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=nc4G1u0Ta79mETtfbtztii9S8XDRrzWvyEl8uSUO2A5YOdA0xHnEvHW2y3CT2lPzJl5BwR8zdGuy6tlODESlTyPlmaD+WCWuG54/vUU6Or8HICwnKwBiiVMIXCxRDwEKvzXz8cu2IfZU/Br/F6xRwZtsiFUgQg8Dw31glVqNlOVspJcGvwpy6waIi1HD4BzMqWu6L06JiB8sTvlhKgKo53JtOHU0CTxuza1Dpqwc7ClS5S3P+bk8pdo9bia0RqPAQRg+Qs37SibOU7qfsLXDkNLyRllbRHUQYCRcZFgWqxLkslmg3KoQ6uHAJ0vNQ6QnQ3oRPBpfbMDCtNLYTe5mCw== 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-SenderADCheck; bh=FrO4FXQ4XS0xH33wVIxyOlrXuC2js3rJ8gSZeXh64/E=; b=VBX1RI2imW46u8ojJrEMamaFr5JKZY8UririYts/iDaUCgt5imFOKIHBvU3xczIuK/80mhnS7YJP3RjVWPSlg3s8wvtiRy3Y+x1RQAp4gV7s+O0deK2fvQJ6GKRFARqDLGQTzrT1WdM7Z4jzDKxLA8eSXKfMRfZ6AWXnppEWsioB8S0m6jfibmOMmGnkrbx1aELZInbgdee9R02Xdq6WsWiM9GURzn3Lgkn0PXoESYw0u51btFSfnKv9S9iZRLDCEn9AL6DFuvo9oouTtkf/bzIAuAd4E5eML/QYfE/3xOpfB5Ouipi5DmTKEo55hd2Jz5UGpb9uln0PQ2lIeY5deA== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=pass smtp.mailfrom=arm.com; dmarc=pass action=none header.from=arm.com; dkim=pass header.d=arm.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=armh.onmicrosoft.com; s=selector2-armh-onmicrosoft-com; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-SenderADCheck; bh=FrO4FXQ4XS0xH33wVIxyOlrXuC2js3rJ8gSZeXh64/E=; b=A0wP4vilS8seFbNsLaPdzuMM6Z+2wRLORKQHc3NcJbPHM7V8lh1V+HMYwaduYNM6gy57SaeN/vSKFko75DDq3FHuefVsPBMSHpgxlJWTX6Wla3Kb6sBghOO0HiL9ixBKfBtGv4s1ANw4GNTwVSDTt6MZxw0eZKfnSTuuqVbJLHw= Authentication-Results-Original: spf=none (sender IP is ) smtp.mailfrom=Srinath.Parvathaneni@arm.com; Received: from AM0PR08MB5380.eurprd08.prod.outlook.com (52.132.213.136) by AM0PR08MB5234.eurprd08.prod.outlook.com (10.255.29.84) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2835.22; Mon, 23 Mar 2020 17:46:58 +0000 Received: from AM0PR08MB5380.eurprd08.prod.outlook.com ([fe80::e016:9e56:512d:b9ae]) by AM0PR08MB5380.eurprd08.prod.outlook.com ([fe80::e016:9e56:512d:b9ae%7]) with mapi id 15.20.2835.021; Mon, 23 Mar 2020 17:46:58 +0000 From: Srinath Parvathaneni Date: Mon, 23 Mar 2020 17:43:41 +0000 To: gcc-patches@gcc.gnu.org Subject: [PATCH v2][ARM][GCC][13x]: MVE ACLE scalar shift intrinsics. X-ClientProxiedBy: LO2P265CA0370.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:a3::22) To AM0PR08MB5380.eurprd08.prod.outlook.com (2603:10a6:208:183::8) Message-ID: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from e120703-lin.cambridge.arm.com (217.140.106.50) by LO2P265CA0370.GBRP265.PROD.OUTLOOK.COM (2603:10a6:600:a3::22) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.2835.18 via Frontend Transport; Mon, 23 Mar 2020 17:46:58 +0000 X-Originating-IP: [217.140.106.50] X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 19e5f39e-ad01-4b73-ab6a-08d7cf523398 X-MS-TrafficTypeDiagnostic: AM0PR08MB5234:|AM0PR08MB5234:|HE1PR08MB2779: X-MS-Exchange-Transport-Forked: True X-Microsoft-Antispam-PRVS: x-checkrecipientrouted: true NoDisclaimer: true X-MS-Oob-TLC-OOBClassifiers: OLM:110;OLM:110; X-Forefront-PRVS: 0351D213B3 X-Forefront-Antispam-Report-Untrusted: SFV:NSPM; SFS:(10009020)(4636009)(366004)(39860400002)(376002)(396003)(346002)(136003)(199004)(6512007)(9686003)(956004)(8936002)(44832011)(6916009)(8676002)(478600001)(235185007)(5660300002)(4326008)(81156014)(81166006)(2906002)(52116002)(33964004)(52536014)(966005)(6666004)(33656002)(16526019)(186003)(26005)(316002)(30864003)(6486002)(86362001)(66556008)(66616009)(66946007)(66476007); DIR:OUT; SFP:1101; SCL:1; SRVR:AM0PR08MB5234; H:AM0PR08MB5380.eurprd08.prod.outlook.com; FPR:; SPF:None; LANG:en; PTR:InfoNoRecords; A:1; Received-SPF: None (protection.outlook.com: arm.com does not designate permitted sender hosts) X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: x0PjCc9+yy+zIdMSq6cmltWtKO0GGSeBZ5HxlS6OqVNwpKMjgqc2PI4YGJ2V7dZO2Iw1V//vJiwNQdJf8dgh/Et1f72/0jpfGZDVN/8ntJkvOOA9jhNNy+Pd0HAKY93D3xARMbmWzLAbbRE7yQA0yX/eqGRBJQCCnA3EJG4Bg3H/5x9ZwixkNGGjcsIePCfKNaBMKCv+6/7tfYlwYfr76554B6bqZDWAFlNteaBEpYHkF3SEeQw+kzh89XZF8YIsZMCR0D3WxnG5XgeOo3874ECF55LbiAl6TfeHaaf4rvDi6lxJj4mOO8EBVfuaOYtclPYOK0FbOOl1uHjnAQrwgjgHeDamajN6ousdkhH7AsZzBz63P7yDhWZhIG6djNDaKEbLW4GKVjxDvtCYVBTuxh1dcHN2/DMa13PGwxp6rVF3mDrvWbvMItyvbtqfPRhynFmnNKGIjUc6VPa8hgTW25SrTftkLjX0IazzsmNlp3abNbbiHyzV9icuAYG/DAw2ogu6J60QAQeDJF4GSbGQ8Q== X-MS-Exchange-AntiSpam-MessageData: pzN4lIp3EtcXMRojCU8/uEPJoNCgRIC1RtXrEebf3ovaE0k/LySdvlsBREFa1IGEfPjjVvk57btzgeDyqU1Npr6IAz0ovn+ArduJsD50D/egcWWyM3NS73pMgnYDEGDPu/Ie7r/nGzlixrh63BpAAg== X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM0PR08MB5234 Original-Authentication-Results: spf=none (sender IP is ) smtp.mailfrom=Srinath.Parvathaneni@arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AM5EUR03FT022.eop-EUR03.prod.protection.outlook.com X-Forefront-Antispam-Report: CIP:63.35.35.123; IPV:CAL; SCL:-1; CTRY:IE; EFV:NLI; SFV:NSPM; SFS:(10009020)(4636009)(39860400002)(376002)(136003)(396003)(346002)(199004)(46966005)(9686003)(2906002)(66616009)(6512007)(478600001)(70586007)(235185007)(86362001)(36906005)(316002)(4326008)(81166006)(8936002)(26826003)(30864003)(966005)(47076004)(5660300002)(52536014)(6486002)(956004)(336012)(33656002)(44832011)(70206006)(16526019)(356004)(186003)(26005)(6916009)(8676002)(81156014)(33964004)(6666004); DIR:OUT; SFP:1101; SCL:1; SRVR:HE1PR08MB2779; H:64aa7808-outbound-1.mta.getcheckrecipient.com; FPR:; SPF:Pass; LANG:en; PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com; A:1; X-MS-Office365-Filtering-Correlation-Id-Prvs: 24df0f5f-24b8-483d-f41e-08d7cf522f39 X-Forefront-PRVS: 0351D213B3 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: CORscTDoHm8omMvvzpkoNrs3F/KWWPU67kprkU/L6JMou11WMTD2iTlrmYuVosvbmXCyxD+FQTdDUzw0O5YU4NNel5HFj9ZJiOJHgCJsz6MCq81fO2Nlkpl0+fZwbWAf16gyQ9fH1PB69XtMgF1CSIuD7IaAhJtEStuxZRRKu+pZ/l27LDg+hGRVM4HZiYxrnz+StDVXcyEX9WULs1pjnmJiHZNzyaywjHDDYhqXJKlT29iEY9xhk8E6SgeNmt9NDLRonK+qqzv9SS//7yfq7RDyPgDAfXHl0S+fSXUaTbFvLJ9LHybMCsB4ZcBMm1IkJUCw0qxcLC4btfolVQ2NrenTJYhIhfLwOTG3lPmldnp8Sz34cMdEKny42iu7IgBo2IQvI5shiIbsjKuwTh+KheU4xHE6MMeYYJM+o6wXdsofQ1JcD9CDpU+fp27LZ+hjqS7XzV0b6L0fV9/s6tkUnJml/6kkokawJ3AKCjcgiqpyUFRrCjrFLy4PV16g/A87j02pVEjsJLYalGM8Wv9hOjLRMP/PgfR/pwnVfdN2Xxyb+hOimy7jNtyL4m3n8RoCYppVkw6+TTz5l1DnXtU95w== X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 23 Mar 2020 17:47:05.5325 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 19e5f39e-ad01-4b73-ab6a-08d7cf523398 X-MS-Exchange-CrossTenant-Id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-CrossTenant-OriginalAttributedTenantConnectingIp: TenantId=f34e5979-57d9-4aaa-ad4d-b122a662184d; Ip=[63.35.35.123]; Helo=[64aa7808-outbound-1.mta.getcheckrecipient.com] X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR08MB2779 X-Spam-Status: No, score=-37.6 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LOTSOFHASH, KAM_SHORT, MSGID_FROM_MTA_HEADER, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_PASS, TXREP, UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces@gcc.gnu.org Sender: "Gcc-patches" Hello Kyrill, Following patch is the rebased version of v1. (version v1) https://gcc.gnu.org/pipermail/gcc-patches/2019-November/534350.html #### Hello, This patch supports following MVE ACLE scalar shift intrinsics. sqrshr, sqrshrl, sqrshrl_sat48, sqshl, sqshll, srshr, srshrl, uqrshl, uqrshll, uqrshll_sat48, uqshl, uqshll, urshr, urshrl, lsll, asrl. Please refer to M-profile Vector Extension (MVE) intrinsics [1] for more details. [1] https://developer.arm.com/architectures/instruction-sets/simd-isas/helium/mve-intrinsics Regression tested on arm-none-eabi and found no regressions. Ok for trunk? Thanks, Srinath. gcc/ChangeLog: 2019-11-08 Srinath Parvathaneni * config/arm/arm-builtins.c (LSLL_QUALIFIERS): Define builtin qualifier. (UQSHL_QUALIFIERS): Likewise. (ASRL_QUALIFIERS): Likewise. (SQSHL_QUALIFIERS): Likewise. * config/arm/arm_mve.h (__ARM_BIG_ENDIAN): Check to not support MVE in Big-Endian Mode. (sqrshr): Define macro. (sqrshrl): Likewise. (sqrshrl_sat48): Likewise. (sqshl): Likewise. (sqshll): Likewise. (srshr): Likewise. (srshrl): Likewise. (uqrshl): Likewise. (uqrshll): Likewise. (uqrshll_sat48): Likewise. (uqshl): Likewise. (uqshll): Likewise. (urshr): Likewise. (urshrl): Likewise. (lsll): Likewise. (asrl): Likewise. (__arm_lsll): Define intrinsic. (__arm_asrl): Likewise. (__arm_uqrshll): Likewise. (__arm_uqrshll_sat48): Likewise. (__arm_sqrshrl): Likewise. (__arm_sqrshrl_sat48): Likewise. (__arm_uqshll): Likewise. (__arm_urshrl): Likewise. (__arm_srshrl): Likewise. (__arm_sqshll): Likewise. (__arm_uqrshl): Likewise. (__arm_sqrshr): Likewise. (__arm_uqshl): Likewise. (__arm_urshr): Likewise. (__arm_sqshl): Likewise. (__arm_srshr): Likewise. * config/arm/arm_mve_builtins.def (LSLL_QUALIFIERS): Use builtin qualifier. (UQSHL_QUALIFIERS): Likewise. (ASRL_QUALIFIERS): Likewise. (SQSHL_QUALIFIERS): Likewise. * config/arm/mve.md (mve_uqrshll_sat_di): Define RTL pattern. (mve_sqrshrl_sat_di): Likewise (mve_uqrshl_si): Likewise (mve_sqrshr_si): Likewise (mve_uqshll_di): Likewise (mve_urshrl_di): Likewise (mve_uqshl_si): Likewise (mve_urshr_si): Likewise (mve_sqshl_si): Likewise (mve_srshr_si): Likewise (mve_srshrl_di): Likewise (mve_sqshll_di): Likewise gcc/testsuite/ChangeLog: 2019-11-08 Srinath Parvathaneni * gcc.target/arm/mve/intrinsics/asrl.c: New test. * gcc.target/arm/mve/intrinsics/lsll.c: Likewise. * gcc.target/arm/mve/intrinsics/sqrshr.c: Likewise. * gcc.target/arm/mve/intrinsics/sqrshrl_sat48.c: Likewise. * gcc.target/arm/mve/intrinsics/sqrshrl_sat64.c: Likewise. * gcc.target/arm/mve/intrinsics/sqshl.c: Likewise. * gcc.target/arm/mve/intrinsics/sqshll.c: Likewise. * gcc.target/arm/mve/intrinsics/srshr.c: Likewise. * gcc.target/arm/mve/intrinsics/srshrl.c: Likewise. * gcc.target/arm/mve/intrinsics/uqrshl.c: Likewise. * gcc.target/arm/mve/intrinsics/uqrshll_sat48.c: Likewise. * gcc.target/arm/mve/intrinsics/uqrshll_sat64.c: Likewise. * gcc.target/arm/mve/intrinsics/uqshl.c: Likewise. * gcc.target/arm/mve/intrinsics/uqshll.c: Likewise. * gcc.target/arm/mve/intrinsics/urshr.c: Likewise. * gcc.target/arm/mve/intrinsics/urshrl.c: Likewise. * lib/target-supports.exp: (check_effective_target_arm_v8_1m_mve_fp_ok_nocache): Modify to not support MVE floating point in Big Endian mode. (check_effective_target_arm_v8_1m_mve_ok_nocache): Modify to not support MVE integer in Big Endian mode. ############### Attachment also inlined for ease of reply ############### diff --git a/gcc/config/arm/arm-builtins.c b/gcc/config/arm/arm-builtins.c index 96d8adcd37eb3caf51c71d66af0331f9d1924b92..56f0db21ea95dcd738877daba27f1cb60f0d5a32 100644 --- a/gcc/config/arm/arm-builtins.c +++ b/gcc/config/arm/arm-builtins.c @@ -762,6 +762,26 @@ arm_strsbwbu_p_qualifiers[SIMD_MAX_BUILTIN_ARGS] qualifier_unsigned, qualifier_unsigned}; #define STRSBWBU_P_QUALIFIERS (arm_strsbwbu_p_qualifiers) +static enum arm_type_qualifiers +arm_lsll_qualifiers[SIMD_MAX_BUILTIN_ARGS] + = { qualifier_unsigned, qualifier_unsigned, qualifier_none}; +#define LSLL_QUALIFIERS (arm_lsll_qualifiers) + +static enum arm_type_qualifiers +arm_uqshl_qualifiers[SIMD_MAX_BUILTIN_ARGS] + = { qualifier_unsigned, qualifier_unsigned, qualifier_const}; +#define UQSHL_QUALIFIERS (arm_uqshl_qualifiers) + +static enum arm_type_qualifiers +arm_asrl_qualifiers[SIMD_MAX_BUILTIN_ARGS] + = { qualifier_none, qualifier_none, qualifier_none}; +#define ASRL_QUALIFIERS (arm_asrl_qualifiers) + +static enum arm_type_qualifiers +arm_sqshl_qualifiers[SIMD_MAX_BUILTIN_ARGS] + = { qualifier_unsigned, qualifier_unsigned, qualifier_const}; +#define SQSHL_QUALIFIERS (arm_sqshl_qualifiers) + /* End of Qualifier for MVE builtins. */ /* void ([T element type] *, T, immediate). */ diff --git a/gcc/config/arm/arm_mve.h b/gcc/config/arm/arm_mve.h index 43520ee78e19f074912a6d965731465f1226986d..f2d80ee636003ac58f70ddc25db15e129e228906 100644 --- a/gcc/config/arm/arm_mve.h +++ b/gcc/config/arm/arm_mve.h @@ -22,6 +22,10 @@ #ifndef _GCC_ARM_MVE_H #define _GCC_ARM_MVE_H +#if __ARM_BIG_ENDIAN +#error "MVE intrinsics are not supported in Big-Endian mode." +#endif + #if !__ARM_FEATURE_MVE #error "MVE feature not supported" #endif @@ -2526,6 +2530,22 @@ typedef struct { uint8x16_t val[4]; } uint8x16x4_t; #define vgetq_lane_u16(__a, __idx) __arm_vgetq_lane_u16(__a, __idx) #define vgetq_lane_u32(__a, __idx) __arm_vgetq_lane_u32(__a, __idx) #define vgetq_lane_u64(__a, __idx) __arm_vgetq_lane_u64(__a, __idx) +#define sqrshr(__p0, __p1) __arm_sqrshr(__p0, __p1) +#define sqrshrl(__p0, __p1) __arm_sqrshrl(__p0, __p1) +#define sqrshrl_sat48(__p0, __p1) __arm_sqrshrl_sat48(__p0, __p1) +#define sqshl(__p0, __p1) __arm_sqshl(__p0, __p1) +#define sqshll(__p0, __p1) __arm_sqshll(__p0, __p1) +#define srshr(__p0, __p1) __arm_srshr(__p0, __p1) +#define srshrl(__p0, __p1) __arm_srshrl(__p0, __p1) +#define uqrshl(__p0, __p1) __arm_uqrshl(__p0, __p1) +#define uqrshll(__p0, __p1) __arm_uqrshll(__p0, __p1) +#define uqrshll_sat48(__p0, __p1) __arm_uqrshll_sat48(__p0, __p1) +#define uqshl(__p0, __p1) __arm_uqshl(__p0, __p1) +#define uqshll(__p0, __p1) __arm_uqshll(__p0, __p1) +#define urshr(__p0, __p1) __arm_urshr(__p0, __p1) +#define urshrl(__p0, __p1) __arm_urshrl(__p0, __p1) +#define lsll(__p0, __p1) __arm_lsll(__p0, __p1) +#define asrl(__p0, __p1) __arm_asrl(__p0, __p1) #endif /* For big-endian, GCC's vector indices are reversed within each 64 bits @@ -16539,6 +16559,118 @@ __arm_vgetq_lane_u64 (uint64x2_t __a, const int __idx) return __a[__ARM_LANEQ(__a,__idx)]; } +__extension__ extern __inline uint64_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_lsll (uint64_t value, int32_t shift) +{ + return (value << shift); +} + +__extension__ extern __inline int64_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_asrl (int64_t value, int32_t shift) +{ + return (value >> shift); +} + +__extension__ extern __inline uint64_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_uqrshll (uint64_t value, int32_t shift) +{ + return __builtin_mve_uqrshll_sat64_di (value, shift); +} + +__extension__ extern __inline uint64_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_uqrshll_sat48 (uint64_t value, int32_t shift) +{ + return __builtin_mve_uqrshll_sat48_di (value, shift); +} + +__extension__ extern __inline int64_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_sqrshrl (int64_t value, int32_t shift) +{ + return __builtin_mve_sqrshrl_sat64_di (value, shift); +} + +__extension__ extern __inline int64_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_sqrshrl_sat48 (int64_t value, int32_t shift) +{ + return __builtin_mve_sqrshrl_sat48_di (value, shift); +} + +__extension__ extern __inline uint64_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_uqshll (uint64_t value, const int shift) +{ + return __builtin_mve_uqshll_di (value, shift); +} + +__extension__ extern __inline uint64_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_urshrl (uint64_t value, const int shift) +{ + return __builtin_mve_urshrl_di (value, shift); +} + +__extension__ extern __inline int64_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_srshrl (int64_t value, const int shift) +{ + return __builtin_mve_srshrl_di (value, shift); +} + +__extension__ extern __inline int64_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_sqshll (int64_t value, const int shift) +{ + return __builtin_mve_sqshll_di (value, shift); +} + +__extension__ extern __inline uint32_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_uqrshl (uint32_t value, int32_t shift) +{ + return __builtin_mve_uqrshl_si (value, shift); +} + +__extension__ extern __inline int32_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_sqrshr (int32_t value, int32_t shift) +{ + return __builtin_mve_sqrshr_si (value, shift); +} + +__extension__ extern __inline uint32_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_uqshl (uint32_t value, const int shift) +{ + return __builtin_mve_uqshl_si (value, shift); +} + +__extension__ extern __inline uint32_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_urshr (uint32_t value, const int shift) +{ + return __builtin_mve_urshr_si (value, shift); +} + +__extension__ extern __inline int32_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_sqshl (int32_t value, const int shift) +{ + return __builtin_mve_sqshl_si (value, shift); +} + +__extension__ extern __inline int32_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_srshr (int32_t value, const int shift) +{ + return __builtin_mve_srshr_si (value, shift); +} + #if (__ARM_FEATURE_MVE & 2) /* MVE Floating point. */ __extension__ extern __inline void diff --git a/gcc/config/arm/arm_mve_builtins.def b/gcc/config/arm/arm_mve_builtins.def index a60650cb7b1fe4e52ab1c7bf3c1215ff083a106f..9379927ae509c1b4fb70e7cbbad40bf645284714 100644 --- a/gcc/config/arm/arm_mve_builtins.def +++ b/gcc/config/arm/arm_mve_builtins.def @@ -876,3 +876,17 @@ VAR1 (QUADOP_UNONE_UNONE_UNONE_UNONE_UNONE, vsbcq_m_u, v4si) VAR5 (STORE1, vst2q, v16qi, v8hi, v4si, v8hf, v4sf) VAR5 (LOAD1, vld4q, v16qi, v8hi, v4si, v8hf, v4sf) VAR5 (LOAD1, vld2q, v16qi, v8hi, v4si, v8hf, v4sf) +VAR1 (ASRL, sqrshr_,si) +VAR1 (ASRL, sqrshrl_sat64_,di) +VAR1 (ASRL, sqrshrl_sat48_,di) +VAR1 (LSLL, uqrshl_, si) +VAR1 (LSLL, uqrshll_sat64_, di) +VAR1 (LSLL, uqrshll_sat48_, di) +VAR1 (SQSHL,srshr_,si) +VAR1 (SQSHL,srshrl_,di) +VAR1 (SQSHL,sqshl_,si) +VAR1 (SQSHL,sqshll_,di) +VAR1 (UQSHL, urshr_, si) +VAR1 (UQSHL, urshrl_, di) +VAR1 (UQSHL, uqshl_, si) +VAR1 (UQSHL, uqshll_, di) diff --git a/gcc/config/arm/mve.md b/gcc/config/arm/mve.md index 2b59d5a58171cddea1155610ddbb3c7f96105d24..ce98e35763107844a70377fbc3e9921bf055b0cb 100644 --- a/gcc/config/arm/mve.md +++ b/gcc/config/arm/mve.md @@ -214,7 +214,9 @@ VLDRDQGBWB_S VLDRDQGBWB_U VADCQ_U VADCQ_M_U VADCQ_S VADCQ_M_S VSBCIQ_U VSBCIQ_S VSBCIQ_M_U VSBCIQ_M_S VSBCQ_U VSBCQ_S VSBCQ_M_U VSBCQ_M_S VADCIQ_U VADCIQ_M_U - VADCIQ_S VADCIQ_M_S VLD2Q VLD4Q VST2Q]) + VADCIQ_S VADCIQ_M_S VLD2Q VLD4Q VST2Q SRSHRL SRSHR + URSHR URSHRL SQRSHR UQRSHL UQRSHLL_64 + UQRSHLL_48 SQRSHRL_64 SQRSHRL_48]) (define_mode_attr MVE_CNVT [(V8HI "V8HF") (V4SI "V4SF") (V8HF "V8HI") (V4SF "V4SI")]) @@ -391,7 +393,8 @@ (VSBCIQ_M_U "u") (VSBCIQ_S "s") (VSBCIQ_M_S "s") (VADCQ_U "u") (VADCQ_M_U "u") (VADCQ_S "s") (VADCIQ_U "u") (VADCIQ_M_U "u") (VADCIQ_S "s") - (VADCIQ_M_S "s")]) + (VADCIQ_M_S "s") (SQRSHRL_64 "64") (SQRSHRL_48 "48") + (UQRSHLL_64 "64") (UQRSHLL_48 "48")]) (define_int_attr mode1 [(VCTP8Q "8") (VCTP16Q "16") (VCTP32Q "32") (VCTP64Q "64") (VCTP8Q_M "8") (VCTP16Q_M "16") @@ -654,7 +657,8 @@ (define_int_iterator VSBCIQ_M [VSBCIQ_M_U VSBCIQ_M_S]) (define_int_iterator VADCQ [VADCQ_U VADCQ_S]) (define_int_iterator VADCQ_M [VADCQ_M_U VADCQ_M_S]) - +(define_int_iterator UQRSHLLQ [UQRSHLL_64 UQRSHLL_48]) +(define_int_iterator SQRSHRLQ [SQRSHRL_64 SQRSHRL_48]) (define_insn "*mve_mov" [(set (match_operand:MVE_types 0 "nonimmediate_operand" "=w,w,r,w,w,r,w,Us") @@ -11005,3 +11009,143 @@ return "vmov\t%f0, %J1, %K1"; } [(set_attr "type" "mve_move")]) + +;; +;; [uqrshll_di] +;; +(define_insn "mve_uqrshll_sat_di" + [(set (match_operand:DI 0 "arm_general_register_operand" "+r") + (unspec:DI [(match_operand:DI 1 "arm_general_register_operand" "r") + (match_operand:SI 2 "s_register_operand" "r")] + UQRSHLLQ))] + "TARGET_HAVE_MVE" + "uqrshll%?\\t%Q1, %R1, #, %2" + [(set_attr "predicable" "yes")]) + +;; +;; [sqrshrl_di] +;; +(define_insn "mve_sqrshrl_sat_di" + [(set (match_operand:DI 0 "arm_general_register_operand" "+r") + (unspec:DI [(match_operand:DI 1 "arm_general_register_operand" "r") + (match_operand:SI 2 "s_register_operand" "r")] + SQRSHRLQ))] + "TARGET_HAVE_MVE" + "sqrshrl%?\\t%Q1, %R1, #, %2" + [(set_attr "predicable" "yes")]) + +;; +;; [uqrshl_si] +;; +(define_insn "mve_uqrshl_si" + [(set (match_operand:SI 0 "arm_general_register_operand" "+r") + (unspec:SI [(match_operand:SI 1 "arm_general_register_operand" "r") + (match_operand:SI 2 "s_register_operand" "r")] + UQRSHL))] + "TARGET_HAVE_MVE" + "uqrshl%?\\t%1, %2" + [(set_attr "predicable" "yes")]) + +;; +;; [sqrshr_si] +;; +(define_insn "mve_sqrshr_si" + [(set (match_operand:SI 0 "arm_general_register_operand" "+r") + (unspec:SI [(match_operand:SI 1 "arm_general_register_operand" "r") + (match_operand:SI 2 "s_register_operand" "r")] + SQRSHR))] + "TARGET_HAVE_MVE" + "sqrshr%?\\t%1, %2" + [(set_attr "predicable" "yes")]) + +;; +;; [uqshll_di] +;; +(define_insn "mve_uqshll_di" + [(set (match_operand:DI 0 "arm_general_register_operand" "+r") + (us_ashift:DI (match_operand:DI 1 "arm_general_register_operand" "r") + (match_operand:SI 2 "arm_reg_or_long_shift_imm" "rPg")))] + "TARGET_HAVE_MVE" + "uqshll%?\\t%Q1, %R1, %2" + [(set_attr "predicable" "yes")]) + +;; +;; [urshrl_di] +;; +(define_insn "mve_urshrl_di" + [(set (match_operand:DI 0 "arm_general_register_operand" "+r") + (unspec:DI [(match_operand:DI 1 "arm_general_register_operand" "r") + (match_operand:SI 2 "arm_reg_or_long_shift_imm" "rPg")] + URSHRL))] + "TARGET_HAVE_MVE" + "urshrl%?\\t%Q1, %R1, %2" + [(set_attr "predicable" "yes")]) + +;; +;; [uqshl_si] +;; +(define_insn "mve_uqshl_si" + [(set (match_operand:SI 0 "arm_general_register_operand" "+r") + (us_ashift:SI (match_operand:SI 1 "arm_general_register_operand" "r") + (match_operand:SI 2 "arm_reg_or_long_shift_imm" "rPg")))] + "TARGET_HAVE_MVE" + "uqshl%?\\t%1, %2" + [(set_attr "predicable" "yes")]) + +;; +;; [urshr_si] +;; +(define_insn "mve_urshr_si" + [(set (match_operand:SI 0 "arm_general_register_operand" "+r") + (unspec:SI [(match_operand:SI 1 "arm_general_register_operand" "r") + (match_operand:SI 2 "arm_reg_or_long_shift_imm" "rPg")] + URSHR))] + "TARGET_HAVE_MVE" + "urshr%?\\t%1, %2" + [(set_attr "predicable" "yes")]) + +;; +;; [sqshl_si] +;; +(define_insn "mve_sqshl_si" + [(set (match_operand:SI 0 "arm_general_register_operand" "+r") + (ss_ashift:SI (match_operand:DI 1 "arm_general_register_operand" "r") + (match_operand:SI 2 "arm_reg_or_long_shift_imm" "rPg")))] + "TARGET_HAVE_MVE" + "sqshl%?\\t%1, %2" + [(set_attr "predicable" "yes")]) + +;; +;; [srshr_si] +;; +(define_insn "mve_srshr_si" + [(set (match_operand:SI 0 "arm_general_register_operand" "+r") + (unspec:SI [(match_operand:DI 1 "arm_general_register_operand" "r") + (match_operand:SI 2 "arm_reg_or_long_shift_imm" "rPg")] + SRSHR))] + "TARGET_HAVE_MVE" + "srshr%?\\t%1, %2" + [(set_attr "predicable" "yes")]) + +;; +;; [srshrl_di] +;; +(define_insn "mve_srshrl_di" + [(set (match_operand:DI 0 "arm_general_register_operand" "+r") + (unspec:DI [(match_operand:DI 1 "arm_general_register_operand" "r") + (match_operand:SI 2 "arm_reg_or_long_shift_imm" "rPg")] + SRSHRL))] + "TARGET_HAVE_MVE" + "srshrl%?\\t%Q1, %R1, %2" + [(set_attr "predicable" "yes")]) + +;; +;; [sqshll_di] +;; +(define_insn "mve_sqshll_di" + [(set (match_operand:DI 0 "arm_general_register_operand" "+r") + (ss_ashift:DI (match_operand:DI 1 "arm_general_register_operand" "r") + (match_operand:SI 2 "arm_reg_or_long_shift_imm" "rPg")))] + "TARGET_HAVE_MVE" + "sqshll%?\\t%Q1, %R1, %2" + [(set_attr "predicable" "yes")]) diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/asrl.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/asrl.c new file mode 100644 index 0000000000000000000000000000000000000000..a2d5160e518b482f80eb26fae61f1d4b63e5e63f --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/asrl.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +int64_t +asrl_reg (int64_t longval3, int32_t x) +{ + return asrl (longval3, x); +} + +/* { dg-final { scan-assembler "asrl\\tr\[0-9\]+, r\[0-9\]+, r\[0-9\]+" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/lsll.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/lsll.c new file mode 100644 index 0000000000000000000000000000000000000000..9c1b62fb9f27a0c90a9bea43ea0bc0234e7b2721 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/lsll.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +uint64_t +lsll_reg (uint64_t longval3, int32_t x) +{ + return lsll (longval3, x); +} + +/* { dg-final { scan-assembler "lsll\\tr\[0-9\]+, r\[0-9\]+, r\[0-9\]+" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqrshr.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqrshr.c new file mode 100644 index 0000000000000000000000000000000000000000..1f0a228e4b49595939d4cbff6cf18d6d7c53b52e --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqrshr.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +int32_t +sqrshr_reg (int32_t longval3, int32_t x) +{ + return sqrshr (longval3, x); +} + +/* { dg-final { scan-assembler "sqrshr\\tr\[0-9\]+, r\[0-9\]+" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqrshrl_sat48.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqrshrl_sat48.c new file mode 100644 index 0000000000000000000000000000000000000000..2f1612cde77ba62a48a83a3f5ef6ba35e5034b1b --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqrshrl_sat48.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +int64_t +sqrshrl_reg (int64_t longval3, int32_t x) +{ + return sqrshrl_sat48 (longval3, x); +} + +/* { dg-final { scan-assembler "sqrshrl\\tr\[0-9\]+, r\[0-9\]+, #48, r\[0-9\]+" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqrshrl_sat64.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqrshrl_sat64.c new file mode 100644 index 0000000000000000000000000000000000000000..5d0a4bd155ac65b0724cf67fe916105e4db39b5c --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqrshrl_sat64.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +int64_t +sqrshrl_reg (int64_t longval3, int32_t x) +{ + return sqrshrl (longval3, x); +} + +/* { dg-final { scan-assembler "sqrshrl\\tr\[0-9\]+, r\[0-9\]+, #64, r\[0-9\]+" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqshl.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqshl.c new file mode 100644 index 0000000000000000000000000000000000000000..8cb8c74b2686ef3c0e68fa949fa96944b8b1d799 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqshl.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +int32_t +sqshl_imm (int32_t longval3) +{ + return sqshl (longval3, 25); +} + +/* { dg-final { scan-assembler "sqshl\\tr\[0-9\]+, #25" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqshll.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqshll.c new file mode 100644 index 0000000000000000000000000000000000000000..016ef2a336ed9e5d2539f927435932ab14687f3a --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqshll.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +int64_t +sqshll_imm(int64_t value) +{ + return sqshll (value, 21); +} + +/* { dg-final { scan-assembler "sqshll\\tr\[0-9\]+, r\[0-9\]+, #21" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/srshr.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/srshr.c new file mode 100644 index 0000000000000000000000000000000000000000..264f0bf09ce1684966ade2fdba62b70261e8f438 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/srshr.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +int32_t +srshr_imm (int32_t longval3) +{ + return srshr (longval3, 25); +} + +/* { dg-final { scan-assembler "srshr\\tr\[0-9\]+, #25" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/srshrl.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/srshrl.c new file mode 100644 index 0000000000000000000000000000000000000000..ab12d0da63596c7c4fb3bcb5bfc8f20fc5b0de31 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/srshrl.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +int64_t +srshrl_imm(int64_t value) +{ + return srshrl (value, 21); +} + +/* { dg-final { scan-assembler "srshrl\\tr\[0-9\]+, r\[0-9\]+, #21" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqrshl.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqrshl.c new file mode 100644 index 0000000000000000000000000000000000000000..0064aa19fbc55a5b759f3aa8df2d9329eeee868d --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqrshl.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +uint32_t +uqrshl_reg (uint32_t longval3, int32_t x) +{ + return uqrshl (longval3, x); +} + +/* { dg-final { scan-assembler "uqrshl\\tr\[0-9\]+, r\[0-9\]+" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqrshll_sat48.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqrshll_sat48.c new file mode 100644 index 0000000000000000000000000000000000000000..24cd232441306721e067fd441e803a5352477921 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqrshll_sat48.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +uint64_t +uqrshll_reg (uint64_t longval3, int32_t x) +{ + return uqrshll_sat48 (longval3, x); +} + +/* { dg-final { scan-assembler "uqrshll\\tr\[0-9\]+, r\[0-9\]+, #48, r\[0-9\]+" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqrshll_sat64.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqrshll_sat64.c new file mode 100644 index 0000000000000000000000000000000000000000..22aaafdb919747721a408a8d6d2f18b770184f79 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqrshll_sat64.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +uint64_t +uqrshll_reg (uint64_t longval3, int32_t x) +{ + return uqrshll (longval3, x); +} + +/* { dg-final { scan-assembler "uqrshll\\tr\[0-9\]+, r\[0-9\]+, #64, r\[0-9\]+" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqshl.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqshl.c new file mode 100644 index 0000000000000000000000000000000000000000..9e6ff649805acfca497bbcbe78f7538a2df0da30 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqshl.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +uint32_t +uqshl_imm (uint32_t longval3) +{ + return uqshl (longval3, 21); +} + +/* { dg-final { scan-assembler "uqshl\\tr\[0-9\]+, #21" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqshll.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqshll.c new file mode 100644 index 0000000000000000000000000000000000000000..52560721d6ff405c2bec64fdf833601c877d41be --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqshll.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +uint64_t +uqshll_imm(uint64_t value) +{ + return uqshll (value, 21); +} + +/* { dg-final { scan-assembler "uqshll\\tr\[0-9\]+, r\[0-9\]+, #21" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/urshr.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/urshr.c new file mode 100644 index 0000000000000000000000000000000000000000..ec5d84bb0099de9f6b28bbb3bd6765c731d24ae8 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/urshr.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +uint64_t +urshr_imm (uint32_t longval3) +{ + return urshr (longval3, 21); +} + +/* { dg-final { scan-assembler "urshr\\tr\[0-9\]+, #21" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/urshrl.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/urshrl.c new file mode 100644 index 0000000000000000000000000000000000000000..ea29412ab7a6438bab7ca84a98810f99b95dbecf --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/urshrl.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +uint64_t +urshrl_imm(uint64_t value) +{ + return urshrl (value, 21); +} + +/* { dg-final { scan-assembler "urshrl\\tr\[0-9\]+, r\[0-9\]+, #21" } } */ diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index 58919a31a009f8202d746a654093d32de1bdf987..53524e11d52763a9db7459db50cf410ad6ff63ca 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -4712,6 +4712,9 @@ proc check_effective_target_arm_v8_1m_mve_fp_ok_nocache { } { #if !(__ARM_FEATURE_MVE & 2) #error "__ARM_FEATURE_MVE for floating point not defined" #endif + #if __ARM_BIG_ENDIAN + #error "MVE intrinsics are not supported in Big-Endian mode." + #endif } "$flags -mthumb"] } { set et_arm_v8_1m_mve_fp_flags "$flags -mthumb" return 1 @@ -4891,6 +4894,9 @@ proc check_effective_target_arm_v8_1m_mve_ok_nocache { } { #if !defined (__ARM_FEATURE_MVE) #error "__ARM_FEATURE_MVE not defined" #endif + #if __ARM_BIG_ENDIAN + #error "MVE intrinsics are not supported in Big-Endian mode." + #endif } "$flags -mthumb"] } { set et_arm_v8_1m_mve_flags "$flags -mthumb" return 1 diff --git a/gcc/config/arm/arm-builtins.c b/gcc/config/arm/arm-builtins.c index 96d8adcd37eb3caf51c71d66af0331f9d1924b92..56f0db21ea95dcd738877daba27f1cb60f0d5a32 100644 --- a/gcc/config/arm/arm-builtins.c +++ b/gcc/config/arm/arm-builtins.c @@ -762,6 +762,26 @@ arm_strsbwbu_p_qualifiers[SIMD_MAX_BUILTIN_ARGS] qualifier_unsigned, qualifier_unsigned}; #define STRSBWBU_P_QUALIFIERS (arm_strsbwbu_p_qualifiers) +static enum arm_type_qualifiers +arm_lsll_qualifiers[SIMD_MAX_BUILTIN_ARGS] + = { qualifier_unsigned, qualifier_unsigned, qualifier_none}; +#define LSLL_QUALIFIERS (arm_lsll_qualifiers) + +static enum arm_type_qualifiers +arm_uqshl_qualifiers[SIMD_MAX_BUILTIN_ARGS] + = { qualifier_unsigned, qualifier_unsigned, qualifier_const}; +#define UQSHL_QUALIFIERS (arm_uqshl_qualifiers) + +static enum arm_type_qualifiers +arm_asrl_qualifiers[SIMD_MAX_BUILTIN_ARGS] + = { qualifier_none, qualifier_none, qualifier_none}; +#define ASRL_QUALIFIERS (arm_asrl_qualifiers) + +static enum arm_type_qualifiers +arm_sqshl_qualifiers[SIMD_MAX_BUILTIN_ARGS] + = { qualifier_unsigned, qualifier_unsigned, qualifier_const}; +#define SQSHL_QUALIFIERS (arm_sqshl_qualifiers) + /* End of Qualifier for MVE builtins. */ /* void ([T element type] *, T, immediate). */ diff --git a/gcc/config/arm/arm_mve.h b/gcc/config/arm/arm_mve.h index 43520ee78e19f074912a6d965731465f1226986d..f2d80ee636003ac58f70ddc25db15e129e228906 100644 --- a/gcc/config/arm/arm_mve.h +++ b/gcc/config/arm/arm_mve.h @@ -22,6 +22,10 @@ #ifndef _GCC_ARM_MVE_H #define _GCC_ARM_MVE_H +#if __ARM_BIG_ENDIAN +#error "MVE intrinsics are not supported in Big-Endian mode." +#endif + #if !__ARM_FEATURE_MVE #error "MVE feature not supported" #endif @@ -2526,6 +2530,22 @@ typedef struct { uint8x16_t val[4]; } uint8x16x4_t; #define vgetq_lane_u16(__a, __idx) __arm_vgetq_lane_u16(__a, __idx) #define vgetq_lane_u32(__a, __idx) __arm_vgetq_lane_u32(__a, __idx) #define vgetq_lane_u64(__a, __idx) __arm_vgetq_lane_u64(__a, __idx) +#define sqrshr(__p0, __p1) __arm_sqrshr(__p0, __p1) +#define sqrshrl(__p0, __p1) __arm_sqrshrl(__p0, __p1) +#define sqrshrl_sat48(__p0, __p1) __arm_sqrshrl_sat48(__p0, __p1) +#define sqshl(__p0, __p1) __arm_sqshl(__p0, __p1) +#define sqshll(__p0, __p1) __arm_sqshll(__p0, __p1) +#define srshr(__p0, __p1) __arm_srshr(__p0, __p1) +#define srshrl(__p0, __p1) __arm_srshrl(__p0, __p1) +#define uqrshl(__p0, __p1) __arm_uqrshl(__p0, __p1) +#define uqrshll(__p0, __p1) __arm_uqrshll(__p0, __p1) +#define uqrshll_sat48(__p0, __p1) __arm_uqrshll_sat48(__p0, __p1) +#define uqshl(__p0, __p1) __arm_uqshl(__p0, __p1) +#define uqshll(__p0, __p1) __arm_uqshll(__p0, __p1) +#define urshr(__p0, __p1) __arm_urshr(__p0, __p1) +#define urshrl(__p0, __p1) __arm_urshrl(__p0, __p1) +#define lsll(__p0, __p1) __arm_lsll(__p0, __p1) +#define asrl(__p0, __p1) __arm_asrl(__p0, __p1) #endif /* For big-endian, GCC's vector indices are reversed within each 64 bits @@ -16539,6 +16559,118 @@ __arm_vgetq_lane_u64 (uint64x2_t __a, const int __idx) return __a[__ARM_LANEQ(__a,__idx)]; } +__extension__ extern __inline uint64_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_lsll (uint64_t value, int32_t shift) +{ + return (value << shift); +} + +__extension__ extern __inline int64_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_asrl (int64_t value, int32_t shift) +{ + return (value >> shift); +} + +__extension__ extern __inline uint64_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_uqrshll (uint64_t value, int32_t shift) +{ + return __builtin_mve_uqrshll_sat64_di (value, shift); +} + +__extension__ extern __inline uint64_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_uqrshll_sat48 (uint64_t value, int32_t shift) +{ + return __builtin_mve_uqrshll_sat48_di (value, shift); +} + +__extension__ extern __inline int64_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_sqrshrl (int64_t value, int32_t shift) +{ + return __builtin_mve_sqrshrl_sat64_di (value, shift); +} + +__extension__ extern __inline int64_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_sqrshrl_sat48 (int64_t value, int32_t shift) +{ + return __builtin_mve_sqrshrl_sat48_di (value, shift); +} + +__extension__ extern __inline uint64_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_uqshll (uint64_t value, const int shift) +{ + return __builtin_mve_uqshll_di (value, shift); +} + +__extension__ extern __inline uint64_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_urshrl (uint64_t value, const int shift) +{ + return __builtin_mve_urshrl_di (value, shift); +} + +__extension__ extern __inline int64_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_srshrl (int64_t value, const int shift) +{ + return __builtin_mve_srshrl_di (value, shift); +} + +__extension__ extern __inline int64_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_sqshll (int64_t value, const int shift) +{ + return __builtin_mve_sqshll_di (value, shift); +} + +__extension__ extern __inline uint32_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_uqrshl (uint32_t value, int32_t shift) +{ + return __builtin_mve_uqrshl_si (value, shift); +} + +__extension__ extern __inline int32_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_sqrshr (int32_t value, int32_t shift) +{ + return __builtin_mve_sqrshr_si (value, shift); +} + +__extension__ extern __inline uint32_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_uqshl (uint32_t value, const int shift) +{ + return __builtin_mve_uqshl_si (value, shift); +} + +__extension__ extern __inline uint32_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_urshr (uint32_t value, const int shift) +{ + return __builtin_mve_urshr_si (value, shift); +} + +__extension__ extern __inline int32_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_sqshl (int32_t value, const int shift) +{ + return __builtin_mve_sqshl_si (value, shift); +} + +__extension__ extern __inline int32_t +__attribute__ ((__always_inline__, __gnu_inline__, __artificial__)) +__arm_srshr (int32_t value, const int shift) +{ + return __builtin_mve_srshr_si (value, shift); +} + #if (__ARM_FEATURE_MVE & 2) /* MVE Floating point. */ __extension__ extern __inline void diff --git a/gcc/config/arm/arm_mve_builtins.def b/gcc/config/arm/arm_mve_builtins.def index a60650cb7b1fe4e52ab1c7bf3c1215ff083a106f..9379927ae509c1b4fb70e7cbbad40bf645284714 100644 --- a/gcc/config/arm/arm_mve_builtins.def +++ b/gcc/config/arm/arm_mve_builtins.def @@ -876,3 +876,17 @@ VAR1 (QUADOP_UNONE_UNONE_UNONE_UNONE_UNONE, vsbcq_m_u, v4si) VAR5 (STORE1, vst2q, v16qi, v8hi, v4si, v8hf, v4sf) VAR5 (LOAD1, vld4q, v16qi, v8hi, v4si, v8hf, v4sf) VAR5 (LOAD1, vld2q, v16qi, v8hi, v4si, v8hf, v4sf) +VAR1 (ASRL, sqrshr_,si) +VAR1 (ASRL, sqrshrl_sat64_,di) +VAR1 (ASRL, sqrshrl_sat48_,di) +VAR1 (LSLL, uqrshl_, si) +VAR1 (LSLL, uqrshll_sat64_, di) +VAR1 (LSLL, uqrshll_sat48_, di) +VAR1 (SQSHL,srshr_,si) +VAR1 (SQSHL,srshrl_,di) +VAR1 (SQSHL,sqshl_,si) +VAR1 (SQSHL,sqshll_,di) +VAR1 (UQSHL, urshr_, si) +VAR1 (UQSHL, urshrl_, di) +VAR1 (UQSHL, uqshl_, si) +VAR1 (UQSHL, uqshll_, di) diff --git a/gcc/config/arm/mve.md b/gcc/config/arm/mve.md index 2b59d5a58171cddea1155610ddbb3c7f96105d24..ce98e35763107844a70377fbc3e9921bf055b0cb 100644 --- a/gcc/config/arm/mve.md +++ b/gcc/config/arm/mve.md @@ -214,7 +214,9 @@ VLDRDQGBWB_S VLDRDQGBWB_U VADCQ_U VADCQ_M_U VADCQ_S VADCQ_M_S VSBCIQ_U VSBCIQ_S VSBCIQ_M_U VSBCIQ_M_S VSBCQ_U VSBCQ_S VSBCQ_M_U VSBCQ_M_S VADCIQ_U VADCIQ_M_U - VADCIQ_S VADCIQ_M_S VLD2Q VLD4Q VST2Q]) + VADCIQ_S VADCIQ_M_S VLD2Q VLD4Q VST2Q SRSHRL SRSHR + URSHR URSHRL SQRSHR UQRSHL UQRSHLL_64 + UQRSHLL_48 SQRSHRL_64 SQRSHRL_48]) (define_mode_attr MVE_CNVT [(V8HI "V8HF") (V4SI "V4SF") (V8HF "V8HI") (V4SF "V4SI")]) @@ -391,7 +393,8 @@ (VSBCIQ_M_U "u") (VSBCIQ_S "s") (VSBCIQ_M_S "s") (VADCQ_U "u") (VADCQ_M_U "u") (VADCQ_S "s") (VADCIQ_U "u") (VADCIQ_M_U "u") (VADCIQ_S "s") - (VADCIQ_M_S "s")]) + (VADCIQ_M_S "s") (SQRSHRL_64 "64") (SQRSHRL_48 "48") + (UQRSHLL_64 "64") (UQRSHLL_48 "48")]) (define_int_attr mode1 [(VCTP8Q "8") (VCTP16Q "16") (VCTP32Q "32") (VCTP64Q "64") (VCTP8Q_M "8") (VCTP16Q_M "16") @@ -654,7 +657,8 @@ (define_int_iterator VSBCIQ_M [VSBCIQ_M_U VSBCIQ_M_S]) (define_int_iterator VADCQ [VADCQ_U VADCQ_S]) (define_int_iterator VADCQ_M [VADCQ_M_U VADCQ_M_S]) - +(define_int_iterator UQRSHLLQ [UQRSHLL_64 UQRSHLL_48]) +(define_int_iterator SQRSHRLQ [SQRSHRL_64 SQRSHRL_48]) (define_insn "*mve_mov" [(set (match_operand:MVE_types 0 "nonimmediate_operand" "=w,w,r,w,w,r,w,Us") @@ -11005,3 +11009,143 @@ return "vmov\t%f0, %J1, %K1"; } [(set_attr "type" "mve_move")]) + +;; +;; [uqrshll_di] +;; +(define_insn "mve_uqrshll_sat_di" + [(set (match_operand:DI 0 "arm_general_register_operand" "+r") + (unspec:DI [(match_operand:DI 1 "arm_general_register_operand" "r") + (match_operand:SI 2 "s_register_operand" "r")] + UQRSHLLQ))] + "TARGET_HAVE_MVE" + "uqrshll%?\\t%Q1, %R1, #, %2" + [(set_attr "predicable" "yes")]) + +;; +;; [sqrshrl_di] +;; +(define_insn "mve_sqrshrl_sat_di" + [(set (match_operand:DI 0 "arm_general_register_operand" "+r") + (unspec:DI [(match_operand:DI 1 "arm_general_register_operand" "r") + (match_operand:SI 2 "s_register_operand" "r")] + SQRSHRLQ))] + "TARGET_HAVE_MVE" + "sqrshrl%?\\t%Q1, %R1, #, %2" + [(set_attr "predicable" "yes")]) + +;; +;; [uqrshl_si] +;; +(define_insn "mve_uqrshl_si" + [(set (match_operand:SI 0 "arm_general_register_operand" "+r") + (unspec:SI [(match_operand:SI 1 "arm_general_register_operand" "r") + (match_operand:SI 2 "s_register_operand" "r")] + UQRSHL))] + "TARGET_HAVE_MVE" + "uqrshl%?\\t%1, %2" + [(set_attr "predicable" "yes")]) + +;; +;; [sqrshr_si] +;; +(define_insn "mve_sqrshr_si" + [(set (match_operand:SI 0 "arm_general_register_operand" "+r") + (unspec:SI [(match_operand:SI 1 "arm_general_register_operand" "r") + (match_operand:SI 2 "s_register_operand" "r")] + SQRSHR))] + "TARGET_HAVE_MVE" + "sqrshr%?\\t%1, %2" + [(set_attr "predicable" "yes")]) + +;; +;; [uqshll_di] +;; +(define_insn "mve_uqshll_di" + [(set (match_operand:DI 0 "arm_general_register_operand" "+r") + (us_ashift:DI (match_operand:DI 1 "arm_general_register_operand" "r") + (match_operand:SI 2 "arm_reg_or_long_shift_imm" "rPg")))] + "TARGET_HAVE_MVE" + "uqshll%?\\t%Q1, %R1, %2" + [(set_attr "predicable" "yes")]) + +;; +;; [urshrl_di] +;; +(define_insn "mve_urshrl_di" + [(set (match_operand:DI 0 "arm_general_register_operand" "+r") + (unspec:DI [(match_operand:DI 1 "arm_general_register_operand" "r") + (match_operand:SI 2 "arm_reg_or_long_shift_imm" "rPg")] + URSHRL))] + "TARGET_HAVE_MVE" + "urshrl%?\\t%Q1, %R1, %2" + [(set_attr "predicable" "yes")]) + +;; +;; [uqshl_si] +;; +(define_insn "mve_uqshl_si" + [(set (match_operand:SI 0 "arm_general_register_operand" "+r") + (us_ashift:SI (match_operand:SI 1 "arm_general_register_operand" "r") + (match_operand:SI 2 "arm_reg_or_long_shift_imm" "rPg")))] + "TARGET_HAVE_MVE" + "uqshl%?\\t%1, %2" + [(set_attr "predicable" "yes")]) + +;; +;; [urshr_si] +;; +(define_insn "mve_urshr_si" + [(set (match_operand:SI 0 "arm_general_register_operand" "+r") + (unspec:SI [(match_operand:SI 1 "arm_general_register_operand" "r") + (match_operand:SI 2 "arm_reg_or_long_shift_imm" "rPg")] + URSHR))] + "TARGET_HAVE_MVE" + "urshr%?\\t%1, %2" + [(set_attr "predicable" "yes")]) + +;; +;; [sqshl_si] +;; +(define_insn "mve_sqshl_si" + [(set (match_operand:SI 0 "arm_general_register_operand" "+r") + (ss_ashift:SI (match_operand:DI 1 "arm_general_register_operand" "r") + (match_operand:SI 2 "arm_reg_or_long_shift_imm" "rPg")))] + "TARGET_HAVE_MVE" + "sqshl%?\\t%1, %2" + [(set_attr "predicable" "yes")]) + +;; +;; [srshr_si] +;; +(define_insn "mve_srshr_si" + [(set (match_operand:SI 0 "arm_general_register_operand" "+r") + (unspec:SI [(match_operand:DI 1 "arm_general_register_operand" "r") + (match_operand:SI 2 "arm_reg_or_long_shift_imm" "rPg")] + SRSHR))] + "TARGET_HAVE_MVE" + "srshr%?\\t%1, %2" + [(set_attr "predicable" "yes")]) + +;; +;; [srshrl_di] +;; +(define_insn "mve_srshrl_di" + [(set (match_operand:DI 0 "arm_general_register_operand" "+r") + (unspec:DI [(match_operand:DI 1 "arm_general_register_operand" "r") + (match_operand:SI 2 "arm_reg_or_long_shift_imm" "rPg")] + SRSHRL))] + "TARGET_HAVE_MVE" + "srshrl%?\\t%Q1, %R1, %2" + [(set_attr "predicable" "yes")]) + +;; +;; [sqshll_di] +;; +(define_insn "mve_sqshll_di" + [(set (match_operand:DI 0 "arm_general_register_operand" "+r") + (ss_ashift:DI (match_operand:DI 1 "arm_general_register_operand" "r") + (match_operand:SI 2 "arm_reg_or_long_shift_imm" "rPg")))] + "TARGET_HAVE_MVE" + "sqshll%?\\t%Q1, %R1, %2" + [(set_attr "predicable" "yes")]) diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/asrl.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/asrl.c new file mode 100644 index 0000000000000000000000000000000000000000..a2d5160e518b482f80eb26fae61f1d4b63e5e63f --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/asrl.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +int64_t +asrl_reg (int64_t longval3, int32_t x) +{ + return asrl (longval3, x); +} + +/* { dg-final { scan-assembler "asrl\\tr\[0-9\]+, r\[0-9\]+, r\[0-9\]+" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/lsll.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/lsll.c new file mode 100644 index 0000000000000000000000000000000000000000..9c1b62fb9f27a0c90a9bea43ea0bc0234e7b2721 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/lsll.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +uint64_t +lsll_reg (uint64_t longval3, int32_t x) +{ + return lsll (longval3, x); +} + +/* { dg-final { scan-assembler "lsll\\tr\[0-9\]+, r\[0-9\]+, r\[0-9\]+" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqrshr.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqrshr.c new file mode 100644 index 0000000000000000000000000000000000000000..1f0a228e4b49595939d4cbff6cf18d6d7c53b52e --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqrshr.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +int32_t +sqrshr_reg (int32_t longval3, int32_t x) +{ + return sqrshr (longval3, x); +} + +/* { dg-final { scan-assembler "sqrshr\\tr\[0-9\]+, r\[0-9\]+" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqrshrl_sat48.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqrshrl_sat48.c new file mode 100644 index 0000000000000000000000000000000000000000..2f1612cde77ba62a48a83a3f5ef6ba35e5034b1b --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqrshrl_sat48.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +int64_t +sqrshrl_reg (int64_t longval3, int32_t x) +{ + return sqrshrl_sat48 (longval3, x); +} + +/* { dg-final { scan-assembler "sqrshrl\\tr\[0-9\]+, r\[0-9\]+, #48, r\[0-9\]+" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqrshrl_sat64.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqrshrl_sat64.c new file mode 100644 index 0000000000000000000000000000000000000000..5d0a4bd155ac65b0724cf67fe916105e4db39b5c --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqrshrl_sat64.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +int64_t +sqrshrl_reg (int64_t longval3, int32_t x) +{ + return sqrshrl (longval3, x); +} + +/* { dg-final { scan-assembler "sqrshrl\\tr\[0-9\]+, r\[0-9\]+, #64, r\[0-9\]+" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqshl.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqshl.c new file mode 100644 index 0000000000000000000000000000000000000000..8cb8c74b2686ef3c0e68fa949fa96944b8b1d799 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqshl.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +int32_t +sqshl_imm (int32_t longval3) +{ + return sqshl (longval3, 25); +} + +/* { dg-final { scan-assembler "sqshl\\tr\[0-9\]+, #25" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqshll.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqshll.c new file mode 100644 index 0000000000000000000000000000000000000000..016ef2a336ed9e5d2539f927435932ab14687f3a --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/sqshll.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +int64_t +sqshll_imm(int64_t value) +{ + return sqshll (value, 21); +} + +/* { dg-final { scan-assembler "sqshll\\tr\[0-9\]+, r\[0-9\]+, #21" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/srshr.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/srshr.c new file mode 100644 index 0000000000000000000000000000000000000000..264f0bf09ce1684966ade2fdba62b70261e8f438 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/srshr.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +int32_t +srshr_imm (int32_t longval3) +{ + return srshr (longval3, 25); +} + +/* { dg-final { scan-assembler "srshr\\tr\[0-9\]+, #25" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/srshrl.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/srshrl.c new file mode 100644 index 0000000000000000000000000000000000000000..ab12d0da63596c7c4fb3bcb5bfc8f20fc5b0de31 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/srshrl.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +int64_t +srshrl_imm(int64_t value) +{ + return srshrl (value, 21); +} + +/* { dg-final { scan-assembler "srshrl\\tr\[0-9\]+, r\[0-9\]+, #21" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqrshl.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqrshl.c new file mode 100644 index 0000000000000000000000000000000000000000..0064aa19fbc55a5b759f3aa8df2d9329eeee868d --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqrshl.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +uint32_t +uqrshl_reg (uint32_t longval3, int32_t x) +{ + return uqrshl (longval3, x); +} + +/* { dg-final { scan-assembler "uqrshl\\tr\[0-9\]+, r\[0-9\]+" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqrshll_sat48.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqrshll_sat48.c new file mode 100644 index 0000000000000000000000000000000000000000..24cd232441306721e067fd441e803a5352477921 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqrshll_sat48.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +uint64_t +uqrshll_reg (uint64_t longval3, int32_t x) +{ + return uqrshll_sat48 (longval3, x); +} + +/* { dg-final { scan-assembler "uqrshll\\tr\[0-9\]+, r\[0-9\]+, #48, r\[0-9\]+" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqrshll_sat64.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqrshll_sat64.c new file mode 100644 index 0000000000000000000000000000000000000000..22aaafdb919747721a408a8d6d2f18b770184f79 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqrshll_sat64.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +uint64_t +uqrshll_reg (uint64_t longval3, int32_t x) +{ + return uqrshll (longval3, x); +} + +/* { dg-final { scan-assembler "uqrshll\\tr\[0-9\]+, r\[0-9\]+, #64, r\[0-9\]+" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqshl.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqshl.c new file mode 100644 index 0000000000000000000000000000000000000000..9e6ff649805acfca497bbcbe78f7538a2df0da30 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqshl.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +uint32_t +uqshl_imm (uint32_t longval3) +{ + return uqshl (longval3, 21); +} + +/* { dg-final { scan-assembler "uqshl\\tr\[0-9\]+, #21" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqshll.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqshll.c new file mode 100644 index 0000000000000000000000000000000000000000..52560721d6ff405c2bec64fdf833601c877d41be --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/uqshll.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +uint64_t +uqshll_imm(uint64_t value) +{ + return uqshll (value, 21); +} + +/* { dg-final { scan-assembler "uqshll\\tr\[0-9\]+, r\[0-9\]+, #21" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/urshr.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/urshr.c new file mode 100644 index 0000000000000000000000000000000000000000..ec5d84bb0099de9f6b28bbb3bd6765c731d24ae8 --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/urshr.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +uint64_t +urshr_imm (uint32_t longval3) +{ + return urshr (longval3, 21); +} + +/* { dg-final { scan-assembler "urshr\\tr\[0-9\]+, #21" } } */ diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/urshrl.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/urshrl.c new file mode 100644 index 0000000000000000000000000000000000000000..ea29412ab7a6438bab7ca84a98810f99b95dbecf --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/urshrl.c @@ -0,0 +1,13 @@ +/* { dg-require-effective-target arm_v8_1m_mve_ok } */ +/* { dg-add-options arm_v8_1m_mve } */ +/* { dg-additional-options "-O2" } */ + +#include "arm_mve.h" + +uint64_t +urshrl_imm(uint64_t value) +{ + return urshrl (value, 21); +} + +/* { dg-final { scan-assembler "urshrl\\tr\[0-9\]+, r\[0-9\]+, #21" } } */ diff --git a/gcc/testsuite/lib/target-supports.exp b/gcc/testsuite/lib/target-supports.exp index 58919a31a009f8202d746a654093d32de1bdf987..53524e11d52763a9db7459db50cf410ad6ff63ca 100644 --- a/gcc/testsuite/lib/target-supports.exp +++ b/gcc/testsuite/lib/target-supports.exp @@ -4712,6 +4712,9 @@ proc check_effective_target_arm_v8_1m_mve_fp_ok_nocache { } { #if !(__ARM_FEATURE_MVE & 2) #error "__ARM_FEATURE_MVE for floating point not defined" #endif + #if __ARM_BIG_ENDIAN + #error "MVE intrinsics are not supported in Big-Endian mode." + #endif } "$flags -mthumb"] } { set et_arm_v8_1m_mve_fp_flags "$flags -mthumb" return 1 @@ -4891,6 +4894,9 @@ proc check_effective_target_arm_v8_1m_mve_ok_nocache { } { #if !defined (__ARM_FEATURE_MVE) #error "__ARM_FEATURE_MVE not defined" #endif + #if __ARM_BIG_ENDIAN + #error "MVE intrinsics are not supported in Big-Endian mode." + #endif } "$flags -mthumb"] } { set et_arm_v8_1m_mve_flags "$flags -mthumb" return 1