From patchwork Wed Jul 29 10:45:20 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Joe Ramsay X-Patchwork-Id: 1338251 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=2620:52:3:1:0:246e:9693:128c; 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=aPYm6vQH; 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=aPYm6vQH; dkim-atps=neutral Received: from sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (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 4BGqvV3pyFz9sSd for ; Wed, 29 Jul 2020 20:45:41 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id F0E663850415; Wed, 29 Jul 2020 10:45:37 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from EUR02-AM5-obe.outbound.protection.outlook.com (mail-eopbgr00055.outbound.protection.outlook.com [40.107.0.55]) by sourceware.org (Postfix) with ESMTPS id 8DE2E3858D35 for ; Wed, 29 Jul 2020 10:45:33 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 8DE2E3858D35 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=Joe.Ramsay@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=QT4mQyyPPKoBp0ZN3TTbCYgfoMA6XMZXfOD6dfJe4DU=; b=aPYm6vQHWwEQUnGawcReaJj89dUvBrssHoexgdYJZEsxXHjCZFDiLUw833079qyX3sp/qJIIs/2BxgxwjTcNaC8ibVBfWo37oS8L1p3p8xvx7W6sG8btPJJUaywhu1qY662szjdTh4HPSPeQ+JAfDZ3yondAQ+ybDsPiuDc2Jh0= Received: from AM0PR04CA0112.eurprd04.prod.outlook.com (2603:10a6:208:55::17) by AM6PR08MB4037.eurprd08.prod.outlook.com (2603:10a6:20b:a5::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3216.24; Wed, 29 Jul 2020 10:45:31 +0000 Received: from AM5EUR03FT045.eop-EUR03.prod.protection.outlook.com (2603:10a6:208:55:cafe::2) by AM0PR04CA0112.outlook.office365.com (2603:10a6:208:55::17) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3239.16 via Frontend Transport; Wed, 29 Jul 2020 10:45:31 +0000 X-MS-Exchange-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 AM5EUR03FT045.mail.protection.outlook.com (10.152.17.105) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3216.10 via Frontend Transport; Wed, 29 Jul 2020 10:45:31 +0000 Received: ("Tessian outbound c83312565ef4:v62"); Wed, 29 Jul 2020 10:45:31 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 276375de9cc6ad47 X-CR-MTA-TID: 64aa7808 Received: from 3e82f0f102e2.1 by 64aa7808-outbound-1.mta.getcheckrecipient.com id 1E7A8BEB-42F9-41B8-9B4D-47A67781BE5E.1; Wed, 29 Jul 2020 10:45:22 +0000 Received: from EUR01-DB5-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id 3e82f0f102e2.1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Wed, 29 Jul 2020 10:45:22 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=CCTnMfoRpzrBLeA5qIQMUlqcZimAlDZZNzKSeAJTaX9wTuCExmDrERJReLti8T5i7CVHvIInXJogC/HdwglxIzOobD12nXTGVNAHAbQ3Z2h+0+wpn1ExTVfmZVe/ObTdcs8iYVyKeDYFvY0v9PG/Q7DujWN1Kei4Kdhb+IWwy9juJ+dg/WhHAmjAkyVqikrLP58f2S0bxU7hEituP7zfbaNWs/NRZlUVaCXwcRYdGcNRoPAmKGH7USC8L66dmhp9Tpv+Q5tsRKk4dsQfUuHTxovwN8Ww4ZJFFS3QWnFZKRyrqGl259nqcyTxwihLzmTBJvxNLUz1GKXWV6Fq08mPVg== 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=QT4mQyyPPKoBp0ZN3TTbCYgfoMA6XMZXfOD6dfJe4DU=; b=hwUXYCowmGpwhIBRuLGxAVIM5MKP/JkXzFUNp+TKReLdenWf8l5HvdxppGJxIQVsQszXl/GVEc2e6mZZAiRJZV1BSKLUsaMZeCLrihmgW/Tcrse25eWhCJlBy0Dp/tx6bFAiRrkVUDiUg+0lI37WzLbGW22GPJHssaIioRd6XF/BBQHk7lnRksphFK1ZUToDeQegjpB6AnAhzeBywXMwU4YUjnu/U9iDxS39fwZ3JQkEAPpoZW98VNJ0L+QT2TbtFj1jtFYUJJiWwzOXO5tUVtCT9rMYAAnPctf9KK3tbNnXOT+oNiXt1BX6m7mvYwvN6PfHD6f6DqnJ8iFfn6SQWw== 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=QT4mQyyPPKoBp0ZN3TTbCYgfoMA6XMZXfOD6dfJe4DU=; b=aPYm6vQHWwEQUnGawcReaJj89dUvBrssHoexgdYJZEsxXHjCZFDiLUw833079qyX3sp/qJIIs/2BxgxwjTcNaC8ibVBfWo37oS8L1p3p8xvx7W6sG8btPJJUaywhu1qY662szjdTh4HPSPeQ+JAfDZ3yondAQ+ybDsPiuDc2Jh0= Received: from DB8PR08MB5497.eurprd08.prod.outlook.com (2603:10a6:10:11a::14) by DB7PR08MB3659.eurprd08.prod.outlook.com (2603:10a6:10:4a::25) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.3216.24; Wed, 29 Jul 2020 10:45:21 +0000 Received: from DB8PR08MB5497.eurprd08.prod.outlook.com ([fe80::8509:bad:35f1:da7f]) by DB8PR08MB5497.eurprd08.prod.outlook.com ([fe80::8509:bad:35f1:da7f%6]) with mapi id 15.20.3239.017; Wed, 29 Jul 2020 10:45:21 +0000 From: Joe Ramsay To: =?utf-8?q?Fran=C3=A7ois_Dumont_via_Gcc-patches?= Subject: [PATCH v2][GCC] arm: Enable no-writeback vldr.16/vstr.16. Thread-Topic: [PATCH v2][GCC] arm: Enable no-writeback vldr.16/vstr.16. Thread-Index: AQHWZZVbGJTt3OlRb0eg7oruIgD1MQ== Date: Wed, 29 Jul 2020 10:45:20 +0000 Message-ID: <3E326E61-FC32-445A-95F8-0DFBDD382DA3@arm.com> Accept-Language: en-GB, en-US Content-Language: en-GB X-MS-Has-Attach: X-MS-TNEF-Correlator: user-agent: Microsoft-MacOutlook/16.39.20071300 Authentication-Results-Original: gcc.gnu.org; dkim=none (message not signed) header.d=none;gcc.gnu.org; dmarc=none action=none header.from=arm.com; x-originating-ip: [209.93.241.210] x-ms-publictraffictype: Email X-MS-Office365-Filtering-HT: Tenant X-MS-Office365-Filtering-Correlation-Id: 2079cbd9-7c3d-4f36-6693-08d833ac8412 x-ms-traffictypediagnostic: DB7PR08MB3659:|AM6PR08MB4037: X-Microsoft-Antispam-PRVS: x-checkrecipientrouted: true nodisclaimer: true x-ms-oob-tlc-oobclassifiers: OLM:4714;OLM:4714; X-MS-Exchange-SenderADCheck: 1 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: rAPAmPWzGuUyghC1ZA5k0bcoTibiJ+ByB8m3DQ7DHS98lscocF7AjRTvwzX0WizAWEb0gXFWLwTPgpYEqT84dYPm+/cbbu51hbMT0IYqRLnu4lFRnvQe1nkCEYdxAWbrldXobKHjytv4K/cP/E7atQ3h4ZXylRrt1e77PEk9FwcBQYfpsrVcdtXkgtlO95DXVYfyd7F4eKvfX+Uw5XBAkBebpCR/YCa9TumYyr62/Q9YFKC7ZLHeoHH8Lrsvfl5r7ZuAYRAlSij/lAa9ibmVfsRLCU7fQu4Fu318rWVww/yjxEKWGEmUMcSYdXlEcvaQ X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:DB8PR08MB5497.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFTY:; SFS:(4636009)(39860400002)(396003)(366004)(346002)(376002)(136003)(76116006)(91956017)(5660300002)(26005)(83380400001)(2906002)(66946007)(478600001)(36756003)(66556008)(66476007)(8936002)(64756008)(66446008)(33656002)(86362001)(8676002)(186003)(2616005)(316002)(6486002)(6506007)(6512007)(71200400001)(6916009); DIR:OUT; SFP:1101; x-ms-exchange-antispam-messagedata: rj4UAT4p3Rodv1PEZnRTMxYBa0lbSI/4ft3Au/ZvGAQ6stb+z8ETIUVpPP7c1bOZu9x4IazbRKcq8HsDiuFL5Aibr5QAS+FVWF30FQAaf4B5J8wP17Zj/7JxP3Ore5LZz67updZ/9ovuUjyY32pUHK5RYLAPvh0mtxqXEnueV7XhgG0GU3IX6hjoS/6LExTvxPOnPY9n2TEfo2Uj7C3ddZmrq5dQmkcwK7ZmtebgGuSBlb/+lhNy2nhE6QJfw/QDbdA1ex+hsbyuNYDhjxeWYqh+ghonpP2b9lHCnYvopOdQHexsexdaiIrOehv622HuZ2DVceYf7onNGI8LX3JyNTm1wjZdvnLCrLhSetMyEGFuFb9MDrHK2BxZgTdKfJTFg7WUAe8PJJMAa+osXozkUGa6KP9apFaScCO5UQT6ldU2KRfa/eLoy3EaICCzVPVZguTqXNyacoNQOLf7Y086nEjMB30MJHb3ZK/40Tm0S0Mc3sv4xfmYJkMRPSkiwJr8 x-ms-exchange-transport-forked: True Content-ID: MIME-Version: 1.0 X-MS-Exchange-Transport-CrossTenantHeadersStamped: DB7PR08MB3659 Original-Authentication-Results: gcc.gnu.org; dkim=none (message not signed) header.d=none;gcc.gnu.org; dmarc=none action=none header.from=arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AM5EUR03FT045.eop-EUR03.prod.protection.outlook.com X-MS-Office365-Filtering-Correlation-Id-Prvs: e0a6a6b9-6216-4918-63d0-08d833ac7dd0 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ovAD36TmJ4sKjE8ma82rtoz+hKHcJ0zaZwMFj4X+8XeL6zMTLGVQVxnmaR/7+C7pTb6f2IJ/F/lArH5Rh5WFlYiLZRtcUj9EHfaQ+rlXy0RPIaqzF51D7Dx8wJsCSA2NWWqrHXW6QBwY900AHYfwN/otWxs+DBovBUIFwefy7xXiHJcsbsLk5jiJU5SmlKm55paMjhzdrHD+FinWsk+2sKVNwJJxE8+IHIkR/oZ933JRyU6X4DykjlSqbB2QeGbnKAzQk7itKULyREK7A1V/gTH96j+bwXi+96z1k7IwRUKp0x0fZ75VwpkJNHPzfT7Cr7kI3EDkKxR6Uto1p6Zfmx24ChhYeCssBc2LPW6JGwGN4PWN+LfGQtnHvKJmWkVKMi9ijfyFNVCIR6pxHHLXDg== X-Forefront-Antispam-Report: CIP:63.35.35.123; CTRY:IE; LANG:en; SCL:1; SRV:; IPV:CAL; SFV:NSPM; H:64aa7808-outbound-1.mta.getcheckrecipient.com; PTR:ec2-63-35-35-123.eu-west-1.compute.amazonaws.com; CAT:NONE; SFTY:; SFS:(4636009)(396003)(346002)(376002)(39860400002)(136003)(46966005)(47076004)(82740400003)(356005)(316002)(8676002)(36906005)(6486002)(6506007)(82310400002)(5660300002)(2616005)(478600001)(81166007)(8936002)(186003)(36756003)(70206006)(70586007)(2906002)(6916009)(33656002)(86362001)(6512007)(26005)(336012)(83380400001); DIR:OUT; SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 29 Jul 2020 10:45:31.5295 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 2079cbd9-7c3d-4f36-6693-08d833ac8412 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-AuthSource: AM5EUR03FT045.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM6PR08MB4037 X-Spam-Status: No, score=-15.1 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, RCVD_IN_DNSWL_LOW, RCVD_IN_MSPIKE_H2, 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" Hi, There was previously no way to specify that a register operand cannot have any writeback modifiers, and as a result the argument to vldr.16 and vstr.16 could be erroneously output with post-increment. This change adds a constraint which forbids all writeback, and selects it in the relevant case for vldr.16 and vstr.16 Bootstrapped on arm-linux, gcc and CMSIS-DSP testsuites are clean. Is this patch OK for trunk? If yes, please commit on my behalf as I don't have commit rights. Thanks, Joe gcc/ChangeLog: 2020-05-20 Joe Ramsay * config/arm/arm-protos.h (arm_coproc_mem_operand_no_writeback): Declare prototype. (arm_mve_mode_and_operands_type_check): Declare prototype. * config/arm/arm.c (arm_coproc_mem_operand): Refactor to use _arm_coproc_mem_operand. (arm_coproc_mem_operand_wb): New function to cover full, limited and no writeback. (arm_coproc_mem_operand_no_writeback): New constraint for memory operand with no writeback. (arm_print_operand): Extend 'E' specifier for memory operand that does not support writeback. (arm_mve_mode_and_operands_type_check): New constraint check for MVE memory operands. * config/arm/constraints.md: Add Uj constraint for VFP vldr.16 and vstr.16. * config/arm/vfp.md (*mov_load_vfp_hf16): New pattern for vldr.16. (*mov_store_vfp_hf16): New pattern for vstr.16. (*mov_vfp_16): Remove MVE moves. gcc/testsuite/ChangeLog: 2020-05-20 Joe Ramsay * gcc.target/arm/mve/intrinsics/mve-vldstr16-no-writeback.c: New test. --- gcc/config/arm/arm-protos.h | 3 + gcc/config/arm/arm.c | 74 ++++++++++++++++++---- gcc/config/arm/constraints.md | 7 ++ gcc/config/arm/vfp.md | 26 +++++--- .../arm/mve/intrinsics/mve-vldstr16-no-writeback.c | 17 +++++ 5 files changed, 105 insertions(+), 22 deletions(-) create mode 100644 gcc/testsuite/gcc.target/arm/mve/intrinsics/mve-vldstr16-no-writeback.c diff --git a/gcc/config/arm/arm-protos.h b/gcc/config/arm/arm-protos.h index 33d162c..e811da4 100644 --- a/gcc/config/arm/arm-protos.h +++ b/gcc/config/arm/arm-protos.h @@ -115,8 +115,11 @@ extern enum reg_class coproc_secondary_reload_class (machine_mode, rtx, extern bool arm_tls_referenced_p (rtx); extern int arm_coproc_mem_operand (rtx, bool); +extern int arm_coproc_mem_operand_no_writeback (rtx); +extern int arm_coproc_mem_operand_wb (rtx, int); extern int neon_vector_mem_operand (rtx, int, bool); extern int mve_vector_mem_operand (machine_mode, rtx, bool); +bool arm_mve_mode_and_operands_type_check (machine_mode, rtx, rtx); extern int neon_struct_mem_operand (rtx); extern rtx *neon_vcmla_lane_prepare_operands (rtx *); diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 6b7ca82..63e052f 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -13217,13 +13217,14 @@ neon_element_bits (machine_mode mode) /* Predicates for `match_operand' and `match_operator'. */ /* Return TRUE if OP is a valid coprocessor memory address pattern. - WB is true if full writeback address modes are allowed and is false + WB level is 2 if full writeback address modes are allowed, 1 if limited writeback address modes (POST_INC and PRE_DEC) are - allowed. */ + allowed and 0 if no writeback at all is supported. */ int -arm_coproc_mem_operand (rtx op, bool wb) +arm_coproc_mem_operand_wb (rtx op, int wb_level) { + gcc_assert (wb_level == 0 || wb_level == 1 || wb_level == 2); rtx ind; /* Reject eliminable registers. */ @@ -13256,16 +13257,18 @@ arm_coproc_mem_operand (rtx op, bool wb) /* Autoincremment addressing modes. POST_INC and PRE_DEC are acceptable in any case (subject to verification by - arm_address_register_rtx_p). We need WB to be true to accept + arm_address_register_rtx_p). We need full writeback to accept + PRE_INC and POST_DEC, and at least restricted writeback for PRE_INC and POST_DEC. */ - if (GET_CODE (ind) == POST_INC - || GET_CODE (ind) == PRE_DEC - || (wb - && (GET_CODE (ind) == PRE_INC - || GET_CODE (ind) == POST_DEC))) + if (wb_level > 0 + && (GET_CODE (ind) == POST_INC + || GET_CODE (ind) == PRE_DEC + || (wb_level > 1 + && (GET_CODE (ind) == PRE_INC + || GET_CODE (ind) == POST_DEC)))) return arm_address_register_rtx_p (XEXP (ind, 0), 0); - if (wb + if (wb_level > 1 && (GET_CODE (ind) == POST_MODIFY || GET_CODE (ind) == PRE_MODIFY) && arm_address_register_rtx_p (XEXP (ind, 0), 0) && GET_CODE (XEXP (ind, 1)) == PLUS @@ -13287,6 +13290,25 @@ arm_coproc_mem_operand (rtx op, bool wb) return FALSE; } +/* Return TRUE if OP is a valid coprocessor memory address pattern. + WB is true if full writeback address modes are allowed and is false + if limited writeback address modes (POST_INC and PRE_DEC) are + allowed. */ + +int arm_coproc_mem_operand (rtx op, bool wb) +{ + return arm_coproc_mem_operand_wb (op, wb ? 2 : 1); +} + +/* Return TRUE if OP is a valid coprocessor memory address pattern in a + context in which no writeback address modes are allowed. */ + +int +arm_coproc_mem_operand_no_writeback (rtx op) +{ + return arm_coproc_mem_operand_wb (op, 0); +} + /* This function returns TRUE on matching mode and op. 1. For given modes, check for [Rn], return TRUE for Rn <= LO_REGS. 2. For other modes, check for [Rn], return TRUE for Rn < R15 (expect R13). */ @@ -23550,7 +23572,7 @@ arm_print_condition (FILE *stream) /* Globally reserved letters: acln Puncutation letters currently used: @_|?().!# Lower case letters currently used: bcdefhimpqtvwxyz - Upper case letters currently used: ABCDFGHJKLMNOPQRSTU + Upper case letters currently used: ABCDEFGHIJKLMNOPQRSTU Letters previously used, but now deprecated/obsolete: sVWXYZ. Note that the global reservation for 'c' is only for CONSTANT_ADDRESS_P. @@ -24116,11 +24138,12 @@ arm_print_operand (FILE *stream, rtx x, int code) } return; - /* To print the memory operand with "Ux" constraint. Based on the rtx_code - the memory operands output looks like following. + /* To print the memory operand with "Ux" or "Uj" constraint. Based on the + rtx_code the memory operands output looks like following. 1. [Rn], #+/- 2. [Rn, #+/-]! - 3. [Rn]. */ + 3. [Rn, #+/-] + 4. [Rn]. */ case 'E': { rtx addr; @@ -24155,6 +24178,16 @@ arm_print_operand (FILE *stream, rtx x, int code) asm_fprintf (stream, ", #%wd]!",INTVAL (postinc_reg)); } } + else if (code == PLUS) + { + rtx base = XEXP (addr, 0); + rtx index = XEXP (addr, 1); + + gcc_assert (REG_P (base) && CONST_INT_P (index)); + + HOST_WIDE_INT offset = INTVAL (index); + asm_fprintf (stream, "[%r, #%wd]", REGNO (base), offset); + } else { gcc_assert (REG_P (addr)); @@ -33496,4 +33529,17 @@ arm_mode_base_reg_class (machine_mode mode) struct gcc_target targetm = TARGET_INITIALIZER; +bool +arm_mve_mode_and_operands_type_check (machine_mode mode, rtx op0, rtx op1) +{ + if (!(TARGET_HAVE_MVE || TARGET_HAVE_MVE_FLOAT)) + return true; + else if (mode == E_BFmode) + return false; + else if ((s_register_operand (op0, mode) && MEM_P (op1)) + || (s_register_operand (op1, mode) && MEM_P (op0))) + return false; + return true; +} + #include "gt-arm.h" diff --git a/gcc/config/arm/constraints.md b/gcc/config/arm/constraints.md index 011badc..ff229aa 100644 --- a/gcc/config/arm/constraints.md +++ b/gcc/config/arm/constraints.md @@ -452,6 +452,13 @@ (and (match_code "mem") (match_test "TARGET_32BIT && arm_coproc_mem_operand (op, FALSE)"))) +(define_memory_constraint "Uj" + "@internal + In ARM/Thumb-2 state an VFP load/store address which does not support + writeback at all (eg vldr.16)." + (and (match_code "mem") + (match_test "TARGET_32BIT && arm_coproc_mem_operand_no_writeback (op)"))) + (define_memory_constraint "Uy" "@internal In ARM/Thumb-2 state a valid iWMMX load/store address." diff --git a/gcc/config/arm/vfp.md b/gcc/config/arm/vfp.md index 3470679..6a2bc5a 100644 --- a/gcc/config/arm/vfp.md +++ b/gcc/config/arm/vfp.md @@ -387,6 +387,20 @@ (set_attr "arch" "t2,any,any,any,a,t2,any,any,any,any,any,any")] ) +(define_insn "*mov_load_vfp_hf16" + [(set (match_operand:HF 0 "s_register_operand" "=t") + (match_operand:HF 1 "memory_operand" "Uj"))] + "TARGET_HAVE_MVE_FLOAT" + "vldr.16\\t%0, %E1" +) + +(define_insn "*mov_store_vfp_hf16" + [(set (match_operand:HF 0 "memory_operand" "=Uj") + (match_operand:HF 1 "s_register_operand" "t"))] + "TARGET_HAVE_MVE_FLOAT" + "vstr.16\\t%1, %E0" +) + ;; HFmode and BFmode moves (define_insn "*mov_vfp_16" @@ -396,6 +410,8 @@ " m,r,t,r,r,t,Dv,Um,t, F"))] "TARGET_32BIT && TARGET_VFP_FP16INST + && arm_mve_mode_and_operands_type_check (mode, operands[0], + operands[1]) && (s_register_operand (operands[0], mode) || s_register_operand (operands[1], mode))" { @@ -414,15 +430,9 @@ case 6: /* S register from immediate. */ return \"vmov.f16\\t%0, %1\t%@ __\"; case 7: /* S register from memory. */ - if (TARGET_HAVE_MVE) - return \"vldr.16\\t%0, %A1\"; - else - return \"vld1.16\\t{%z0}, %A1\"; + return \"vld1.16\\t{%z0}, %A1\"; case 8: /* Memory from S register. */ - if (TARGET_HAVE_MVE) - return \"vstr.16\\t%1, %A0\"; - else - return \"vst1.16\\t{%z1}, %A0\"; + return \"vst1.16\\t{%z1}, %A0\"; case 9: /* ARM register from constant. */ { long bits; diff --git a/gcc/testsuite/gcc.target/arm/mve/intrinsics/mve-vldstr16-no-writeback.c b/gcc/testsuite/gcc.target/arm/mve/intrinsics/mve-vldstr16-no-writeback.c new file mode 100644 index 0000000..0a69ace --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/mve/intrinsics/mve-vldstr16-no-writeback.c @@ -0,0 +1,17 @@ +/* { dg-require-effective-target arm_v8_1m_mve_fp_ok } */ +/* { dg-add-options arm_v8_1m_mve_fp } */ +/* { dg-additional-options "-O2" } */ + +void +fn1 (__fp16 *pSrc) +{ + __fp16 high; + __fp16 *pDst = 0; + unsigned i; + for (i = 0;; i++) + if (pSrc[i]) + pDst[i] = high; +} + +/* { dg-final { scan-assembler {vldr\.16\ts[0-9]+, \[r[0-9]+\]\n} } } */ +/* { dg-final { scan-assembler {vstr\.16\ts[0-9]+, \[r[0-9]+\]\n} } } */