From patchwork Wed Dec 8 16:44:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Wilco Dijkstra X-Patchwork-Id: 48640 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 909E5385841B for ; Wed, 8 Dec 2021 16:45:04 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 909E5385841B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1638981904; bh=nMhJUCZbxeJzkOmMFU0/rssaCPfMH0jEci4/nDU+aBM=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:Cc:From; b=ClpFwT4jqJQIRQsPqz5fat+VoEQRubaXkAjgj+JxyAUmppzZ37KkQ1kiO2M8+rX/A POhLrXhM0poJVICFlKjnDYh7ayD7mZZsmQTWlnz9UlV4gQrJlUmnw+dt2GuyyIpdFN MZLTbO6Uv6PBjODd0jagw3KRN9SOvsU35O99JiH4= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from EUR05-AM6-obe.outbound.protection.outlook.com (mail-am6eur05on2057.outbound.protection.outlook.com [40.107.22.57]) by sourceware.org (Postfix) with ESMTPS id 685E23858D3C for ; Wed, 8 Dec 2021 16:44:30 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 685E23858D3C Received: from AS8PR07CA0053.eurprd07.prod.outlook.com (2603:10a6:20b:459::20) by HE1PR0801MB1625.eurprd08.prod.outlook.com (2603:10a6:3:7f::21) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4778.12; Wed, 8 Dec 2021 16:44:26 +0000 Received: from AM5EUR03FT034.eop-EUR03.prod.protection.outlook.com (2603:10a6:20b:459:cafe::79) by AS8PR07CA0053.outlook.office365.com (2603:10a6:20b:459::20) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4778.10 via Frontend Transport; Wed, 8 Dec 2021 16:44:26 +0000 X-MS-Exchange-Authentication-Results: spf=pass (sender IP is 63.35.35.123) smtp.mailfrom=arm.com; dkim=pass (signature was verified) header.d=armh.onmicrosoft.com;dmarc=pass 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 AM5EUR03FT034.mail.protection.outlook.com (10.152.16.81) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4755.13 via Frontend Transport; Wed, 8 Dec 2021 16:44:26 +0000 Received: ("Tessian outbound a33f292be81b:v110"); Wed, 08 Dec 2021 16:44:26 +0000 X-CheckRecipientChecked: true X-CR-MTA-CID: 138551d97fba4368 X-CR-MTA-TID: 64aa7808 Received: from c79ef7989827.2 by 64aa7808-outbound-1.mta.getcheckrecipient.com id BC14188C-4B0E-48F7-A145-E0AA619B2086.1; Wed, 08 Dec 2021 16:44:07 +0000 Received: from EUR04-VI1-obe.outbound.protection.outlook.com by 64aa7808-outbound-1.mta.getcheckrecipient.com with ESMTPS id c79ef7989827.2 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384); Wed, 08 Dec 2021 16:44:07 +0000 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=QsHNRVx1cLOxfprB+vADzI2UJQDJTw3fDN86fj5MZIoF9N2rjEbIX0CamGY5lmme/eMVJT03c7pnTj5vJDjZ4/NkR/AdCjz84V7Uc1DCiBrJA/1/0BGKvefydFWocckbOYE8WIfoO5sbydE0DxN3xPnfkO2r383j7vDvSgAh8hGFzLKZehE7Qd/Qjwt/GUj9Z6d0dZkeOe+iXV+GHj7dBfe1GzRlPKMKuSUwrvSdrQh6PUjW16i3urqzY9rm6hXVO+g54vxyphHmdb7yp7YwcHgheYlJpkdynijojkvovryNLY/ASFAF3/3b1ir6MsO9+M703LYT0yjozS9jkDLKvQ== 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=nMhJUCZbxeJzkOmMFU0/rssaCPfMH0jEci4/nDU+aBM=; b=MwCVNG3JuN5u2neZOha+Z3fRYJWjqEauslkNdIYQfqzKZliU6k1FYS2tvvvWTtmiZEIS+gLlUpNEuuiwaWM2PmG+XdiEqKvOig9gUjoNgRwWygZ7nUmHYe1YgshkFYjNHWQIA3wteQdgZAgNOPT99SGupIiY4mXARjmKLY3r7RFv7vl5HjTu8goZMfh52xpEQzjeRfnXeM8IHs3U+tDOyCV0I7lOxO/uk2e5aBFCxTB1e7AP1JnTsRTJJHTCxDb6xeLbQH3mU41dATW3rwFPagAJvINufK3s3VuWj/tTPf8B2WAptGcQvhWwuH+S5Ld21I19/hzcM/8G4fHa5pGnuQ== 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 Received: from VE1PR08MB5599.eurprd08.prod.outlook.com (2603:10a6:800:1a1::12) by VI1PR0802MB2159.eurprd08.prod.outlook.com (2603:10a6:800:a3::15) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4755.11; Wed, 8 Dec 2021 16:44:06 +0000 Received: from VE1PR08MB5599.eurprd08.prod.outlook.com ([fe80::f5b6:af99:142b:7a12]) by VE1PR08MB5599.eurprd08.prod.outlook.com ([fe80::f5b6:af99:142b:7a12%5]) with mapi id 15.20.4755.024; Wed, 8 Dec 2021 16:44:06 +0000 To: GCC Patches Subject: [PATCH] AArch64: Improve rotate patterns Thread-Topic: [PATCH] AArch64: Improve rotate patterns Thread-Index: AQHX7FJVuOnoosZyGkWRWMSY7LSz1w== Date: Wed, 8 Dec 2021 16:44:05 +0000 Message-ID: Accept-Language: en-GB, en-US Content-Language: en-GB X-MS-Has-Attach: X-MS-TNEF-Correlator: suggested_attachment_session_id: aa3ce2de-1264-5e07-918f-668c25955976 Authentication-Results-Original: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; X-MS-Office365-Filtering-Correlation-Id: 82359bae-8c28-490b-1114-08d9ba69ff30 x-ms-traffictypediagnostic: VI1PR0802MB2159:EE_|AM5EUR03FT034:EE_|HE1PR0801MB1625:EE_ X-Microsoft-Antispam-PRVS: x-checkrecipientrouted: true nodisclaimer: true x-ms-oob-tlc-oobclassifiers: OLM:326;OLM:326; X-MS-Exchange-SenderADCheck: 1 X-MS-Exchange-AntiSpam-Relay: 0 X-Microsoft-Antispam-Untrusted: BCL:0; X-Microsoft-Antispam-Message-Info-Original: xkjz8GvweTnXpFKLKcXinVEa1tM18+4L2DxkeKN4HCGlUq/iiB7hfhGM1DSoQX5vxv/dd8bIVbPp5EKUAhV2mgjwhapV8tcNhmR29BI3LQ1Xw8KNZwUcQPnrDSEbOF1gAbhqc/xU7nvN7DzB0xLDs7JrDJZOpH8UPExVGD+aMmNzsGd14kVFAUlQjVBVdVrEIR7RFdCS9YeNzfafQzAr5NDn1j8FdXKtwqJLwc7ZDD1Bu5+KcndiSt9EcS2z/cpTKCye1wQ/aBW08lmKujow48LqiScxQL8qCdpkX45csd2seXcnUZ/p11XELxV76JFr5g2loK3vDJWkSckVh8oid1+4KV/lLOwqVFtjdjP3ria0CElCFVI5HQprbUPHCTi4GrVtIsGsd2vGvj+zIFErCLHgAeGhuz/lCkRG2fiuQ/zIVyB/jVAPRiJo0rgjsWhsOFpGU5ReMQZARmheZP44w5E59hD9140iIkGqZDpFhWEFoBgaYlx/5oGE1qWOsfeqGNjOPRfDZ+wYEgrEXikIxR+Pm6s2N3FHb94fKDCopOjZN5FdTrkK693/tmUtN4p7nzBS2gnr3WoRoXSngGe3m/ZSgwsz6NpBeGEGhP1qNx0ZmOTjHYs4GkoC1or6AtS3GLN8Nc2POjTOnHDe+DX+Kds9P/LmfUMiQhPgpg2GYqix+LbcFzqSM2nngLNfqiMWuuvgi99kWpvu1MDtCFSKEbuQSccWe0DGz3b5eYobqCfvEtxjHEGj3QaFz7mKzcvysLIC34rcfuYS16FrNLylj1svzPK8XAX+ehp1Ix3Ah+rMd6HNAL1gfsgB4CtR1F718Z9jLg2sFmBxvKOeYwISMA== X-Forefront-Antispam-Report-Untrusted: CIP:255.255.255.255; CTRY:; LANG:en; SCL:1; SRV:; IPV:NLI; SFV:NSPM; H:VE1PR08MB5599.eurprd08.prod.outlook.com; PTR:; CAT:NONE; SFS:(4636009)(366004)(38100700002)(54906003)(26005)(9686003)(30864003)(6506007)(508600001)(122000001)(52536014)(4326008)(186003)(71200400001)(84970400001)(76116006)(8676002)(38070700005)(33656002)(66946007)(86362001)(316002)(2906002)(6916009)(55016003)(64756008)(66476007)(7696005)(66556008)(5660300002)(8936002)(66446008)(579004); DIR:OUT; SFP:1101; MIME-Version: 1.0 X-MS-Exchange-Transport-CrossTenantHeadersStamped: VI1PR0802MB2159 Original-Authentication-Results: dkim=none (message not signed) header.d=none;dmarc=none action=none header.from=arm.com; X-EOPAttributedMessage: 0 X-MS-Exchange-Transport-CrossTenantHeadersStripped: AM5EUR03FT034.eop-EUR03.prod.protection.outlook.com X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id-Prvs: 4f35ab06-e04e-4dd8-3078-08d9ba69f2f7 X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: od7dFwL4AXTW2k9Tyvy6TeAg5TFVBbGYLhkod2ZPV2d4m9ACvcQEeaSb5AUMzNwiN7qVdpjvFqpV4ubiTZFk2q3VZZZKaST6rUyBruVuDDzLbvEgHWOCAC3/pveK5BZuhznbDc3OebSsyT26KCfe16eUWxthd6t1WE00y0lmHBTn4LVYx7OcyL7y4J+EUnKCHRv2qise7iVWg3yDPnFMX/2sPBsmaWNSY/tNX/nI5WRU3L6nAh07wlKaWxy8ixiR5m27Vbm68C4G4W584rnxx2qnAbFnFN8G0mvbVSc5Jl7t3Gqtr5DBo6EgQbS1Rg2dkvF2y7PFmqCFvEWdwiYeGMyet0NCB5l94dy7SYdgDbyqZdjO8LSTOeeQWDiwaLhMuAfZA7K6f7IAnc+ulOKepk8psAhffd5JY3GW8rt5Ed/rT2tKWHzXWpdzKFUCHRhrC2+y5jNQs2B1lOk8x2yB0TGy1RlCy1JDIK3WprTZuGdx0nkUZ2SgOvT/75aTCz5QgUMZudQ6R8WhAexNDV8uP+yXYewPme8ysWq/NTod0yljBLbNMBWVUbs6N3mrFouc6Cg8Qs86nE3wtJYMgh2wEQkoaRCF/bg6pOW5penMPJIrCqTBDptYzcZSh6wECtvlcqgBW0fBfaCa/VDN2sHMoZ4mKU65DtL7/NqcM/97FELktIBU7Wnx+GboaidW8cjyzxVGbNZSilSfNjhEFqj11Ue6SFyTnWD7yeJ63Ta75OOtvtPj2pLlTLsisMCBln1Yosx1LyAOwOimWQAMal1Rv1ijhE/1/VRvScZMnJgNIywyVo3HNcm4FIn3EpsrNKz5Dx+bJBlwH5oVGLggML6vQsW6oTDWM+IH9lsJDh9hB16EArnLCBQSJqJWKA/9C7l8XEl9lCidXHYdVv7nrMwWoA== 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; SFS:(4636009)(36840700001)(46966006)(40470700001)(508600001)(9686003)(8676002)(2906002)(47076005)(336012)(36860700001)(8936002)(70206006)(70586007)(4326008)(5660300002)(316002)(33656002)(54906003)(6916009)(52536014)(30864003)(86362001)(81166007)(7696005)(6506007)(26005)(356005)(55016003)(40460700001)(82310400004)(186003)(84970400001); DIR:OUT; SFP:1101; X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-OriginalArrivalTime: 08 Dec 2021 16:44:26.4527 (UTC) X-MS-Exchange-CrossTenant-Network-Message-Id: 82359bae-8c28-490b-1114-08d9ba69ff30 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: AM5EUR03FT034.eop-EUR03.prod.protection.outlook.com X-MS-Exchange-CrossTenant-AuthAs: Anonymous X-MS-Exchange-CrossTenant-FromEntityHeader: HybridOnPrem X-MS-Exchange-Transport-CrossTenantHeadersStamped: HE1PR0801MB1625 X-Spam-Status: No, score=-11.9 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, GIT_PATCH_0, KAM_LOTSOFHASH, KAM_SHORT, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_PASS, TXREP, UNPARSEABLE_RELAY autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) 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: , X-Patchwork-Original-From: Wilco Dijkstra via Gcc-patches From: Wilco Dijkstra Reply-To: Wilco Dijkstra Cc: Richard Sandiford Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Sender: "Gcc-patches" Improve and generalize rotate patterns. Rotates by more than half the bitwidth of a register are canonicalized to rotate left. Many existing shift patterns don't handle this case correctly, so add rotate left to the shift iterator and convert rotate left into ror during assembly output. Add missing zero_extend patterns for shifted BIC, ORN and EON. Passes bootstrap and regress. OK for commit? ChangeLog: 2021-12-07 Wilco Dijkstra * config/aarch64/aarch64.md (and_3_compare0): Support rotate left. (and_si3_compare0_uxtw): Likewise. (_3): Likewise. (_si3_uxtw): Likewise. (one_cmpl_2): Likewise. (_one_cmpl_3): Likewise. (_one_cmpl_sidi_uxtw): New pattern. (eor_one_cmpl_3_alt): Support rotate left. (eor_one_cmpl_sidi3_alt_ze): Likewise. (and_one_cmpl_3_compare0): Likewise. (and_one_cmpl_si3_compare0_uxtw): Likewise. (and_one_cmpl_3_compare0_no_reuse): Likewise. (and_3nr_compare0): Likewise. (*si3_insn_uxtw): Use SHIFT_no_rotate. (rolsi3_insn_uxtw): New pattern. * config/aarch64/iterators.md (SHIFT): Add rotate left. (SHIFT_no_rotate): Add new iterator. (SHIFT:shift): Print rotate left as ror. (is_rotl): Add test for left rotate. * gcc.target/aarch64/ror_2.c: New test. * gcc.target/aarch64/ror_3.c: New test. diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md index 5297b2d3f95744ac72e36814c6676cc97478d48b..f80679bcb34ea07918b1a0304b32be436568095d 100644 --- a/gcc/config/aarch64/aarch64.md +++ b/gcc/config/aarch64/aarch64.md @@ -4419,7 +4419,11 @@ (define_insn "*and_3_compare0" (set (match_operand:GPI 0 "register_operand" "=r") (and:GPI (SHIFT:GPI (match_dup 1) (match_dup 2)) (match_dup 3)))] "" - "ands\\t%0, %3, %1, %2" +{ + if () + operands[2] = GEN_INT ( - UINTVAL (operands[2])); + return "ands\\t%0, %3, %1, %2"; +} [(set_attr "type" "logics_shift_imm")] ) @@ -4436,7 +4440,11 @@ (define_insn "*and_si3_compare0_uxtw" (zero_extend:DI (and:SI (SHIFT:SI (match_dup 1) (match_dup 2)) (match_dup 3))))] "" - "ands\\t%w0, %w3, %w1, %2" +{ + if () + operands[2] = GEN_INT (32 - UINTVAL (operands[2])); + return "ands\\t%w0, %w3, %w1, %2"; +} [(set_attr "type" "logics_shift_imm")] ) @@ -4447,7 +4455,11 @@ (define_insn "*_3" (match_operand:QI 2 "aarch64_shift_imm_" "n")) (match_operand:GPI 3 "register_operand" "r")))] "" - "\\t%0, %3, %1, %2" +{ + if () + operands[2] = GEN_INT ( - UINTVAL (operands[2])); + return "\\t%0, %3, %1, %2"; +} [(set_attr "type" "logic_shift_imm")] ) @@ -4504,17 +4516,6 @@ (define_split "operands[3] = gen_reg_rtx (mode);" ) -(define_insn "*_rol3" - [(set (match_operand:GPI 0 "register_operand" "=r") - (LOGICAL:GPI (rotate:GPI - (match_operand:GPI 1 "register_operand" "r") - (match_operand:QI 2 "aarch64_shift_imm_" "n")) - (match_operand:GPI 3 "register_operand" "r")))] - "" - "\\t%0, %3, %1, ror #( - %2)" - [(set_attr "type" "logic_shift_imm")] -) - ;; zero_extend versions of above (define_insn "*_si3_uxtw" [(set (match_operand:DI 0 "register_operand" "=r") @@ -4524,19 +4525,11 @@ (define_insn "*_si3_uxtw" (match_operand:QI 2 "aarch64_shift_imm_si" "n")) (match_operand:SI 3 "register_operand" "r"))))] "" - "\\t%w0, %w3, %w1, %2" - [(set_attr "type" "logic_shift_imm")] -) - -(define_insn "*_rolsi3_uxtw" - [(set (match_operand:DI 0 "register_operand" "=r") - (zero_extend:DI - (LOGICAL:SI (rotate:SI - (match_operand:SI 1 "register_operand" "r") - (match_operand:QI 2 "aarch64_shift_imm_si" "n")) - (match_operand:SI 3 "register_operand" "r"))))] - "" - "\\t%w0, %w3, %w1, ror #(32 - %2)" +{ + if () + operands[2] = GEN_INT (32 - UINTVAL (operands[2])); + return "\\t%w0, %w3, %w1, %2"; +} [(set_attr "type" "logic_shift_imm")] ) @@ -4565,7 +4558,11 @@ (define_insn "*one_cmpl_2" (not:GPI (SHIFT:GPI (match_operand:GPI 1 "register_operand" "r") (match_operand:QI 2 "aarch64_shift_imm_" "n"))))] "" - "mvn\\t%0, %1, %2" +{ + if () + operands[2] = GEN_INT ( - UINTVAL (operands[2])); + return "mvn\\t%0, %1, %2"; +} [(set_attr "type" "logic_shift_imm")] ) @@ -4672,7 +4669,28 @@ (define_insn "_one_cmpl_3" (match_operand:QI 2 "aarch64_shift_imm_" "n"))) (match_operand:GPI 3 "register_operand" "r")))] "" - "\\t%0, %3, %1, %2" +{ + if () + operands[2] = GEN_INT ( - UINTVAL (operands[2])); + return "\\t%0, %3, %1, %2"; +} + [(set_attr "type" "logic_shift_imm")] +) + +;; Zero-extend version of the above. +(define_insn "_one_cmpl_sidi_uxtw" + [(set (match_operand:DI 0 "register_operand" "=r") + (zero_extend:DI (LOGICAL:SI (not:SI + (SHIFT:SI + (match_operand:SI 1 "register_operand" "r") + (match_operand:QI 2 "aarch64_shift_imm_si" "n"))) + (match_operand:SI 3 "register_operand" "r"))))] + "" +{ + if () + operands[2] = GEN_INT (32 - UINTVAL (operands[2])); + return "\\t%w0, %w3, %w1, %2"; +} [(set_attr "type" "logic_shift_imm")] ) @@ -4684,7 +4702,11 @@ (define_insn "*eor_one_cmpl_3_alt" (match_operand:QI 2 "aarch64_shift_imm_" "n")) (match_operand:GPI 3 "register_operand" "r"))))] "" - "eon\\t%0, %3, %1, %2" +{ + if () + operands[2] = GEN_INT ( - UINTVAL (operands[2])); + return "eon\\t%0, %3, %1, %2"; +} [(set_attr "type" "logic_shift_imm")] ) @@ -4698,7 +4720,11 @@ (define_insn "*eor_one_cmpl_sidi3_alt_ze" (match_operand:QI 2 "aarch64_shift_imm_si" "n")) (match_operand:SI 3 "register_operand" "r")))))] "" - "eon\\t%w0, %w3, %w1, %2" +{ + if () + operands[2] = GEN_INT (32 - UINTVAL (operands[2])); + return "eon\\t%w0, %w3, %w1, %2"; +} [(set_attr "type" "logic_shift_imm")] ) @@ -4716,7 +4742,11 @@ (define_insn "*and_one_cmpl_3_compare0" (SHIFT:GPI (match_dup 1) (match_dup 2))) (match_dup 3)))] "" - "bics\\t%0, %3, %1, %2" +{ + if () + operands[2] = GEN_INT ( - UINTVAL (operands[2])); + return "bics\\t%0, %3, %1, %2"; +} [(set_attr "type" "logics_shift_imm")] ) @@ -4735,7 +4765,11 @@ (define_insn "*and_one_cmpl_si3_compare0_uxtw" (not:SI (SHIFT:SI (match_dup 1) (match_dup 2))) (match_dup 3))))] "" - "bics\\t%w0, %w3, %w1, %2" +{ + if () + operands[2] = GEN_INT (32 - UINTVAL (operands[2])); + return "bics\\t%w0, %w3, %w1, %2"; +} [(set_attr "type" "logics_shift_imm")] ) @@ -4749,7 +4783,11 @@ (define_insn "*and_one_cmpl_3_compare0_no_reuse" (match_operand:GPI 2 "register_operand" "r")) (const_int 0)))] "" - "bics\\tzr, %2, %0, %1" +{ + if () + operands[1] = GEN_INT ( - UINTVAL (operands[1])); + return "bics\\tzr, %2, %0, %1"; +} [(set_attr "type" "logics_shift_imm")] ) @@ -4923,7 +4961,11 @@ (define_insn "*and_3nr_compare0" (match_operand:GPI 2 "register_operand" "r")) (const_int 0)))] "" - "tst\\t%2, %0, %1" +{ + if () + operands[1] = GEN_INT ( - UINTVAL (operands[1])); + return "tst\\t%2, %0, %1"; +} [(set_attr "type" "logics_shift_imm")] ) @@ -5324,10 +5366,22 @@ (define_insn "*ror3_insn" [(set_attr "type" "rotate_imm,shift_reg")] ) -;; zero_extend version of above +(define_insn "*rol3_insn" + [(set (match_operand:GPI 0 "register_operand" "=r") + (rotate:GPI (match_operand:GPI 1 "register_operand" "r") + (match_operand 2 "const_int_operand" "n")))] + "UINTVAL (operands[2]) < GET_MODE_BITSIZE (mode)" +{ + operands[3] = GEN_INT ( - UINTVAL (operands[2])); + return "ror\\t%0, %1, %3"; +} + [(set_attr "type" "rotate_imm")] +) + +;; zero_extend version of shifts (define_insn "*si3_insn_uxtw" [(set (match_operand:DI 0 "register_operand" "=r,r") - (zero_extend:DI (SHIFT:SI + (zero_extend:DI (SHIFT_no_rotate:SI (match_operand:SI 1 "register_operand" "r,r") (match_operand:QI 2 "aarch64_reg_or_shift_imm_si" "Uss,r"))))] "" @@ -5337,6 +5391,31 @@ (define_insn "*si3_insn_uxtw" [(set_attr "type" "bfx,shift_reg")] ) +;; zero_extend version of rotate right +(define_insn "*rorsi3_insn_uxtw" + [(set (match_operand:DI 0 "register_operand" "=r") + (zero_extend:DI + (rotatert:SI (match_operand:SI 1 "register_operand" "r") + (match_operand 2 "const_int_operand" "n"))))] + "UINTVAL (operands[2]) < 32" + "ror\\t%w0, %w1, %2" + [(set_attr "type" "rotate_imm")] +) + +;; zero_extend version of rotate left +(define_insn "*rolsi3_insn_uxtw" + [(set (match_operand:DI 0 "register_operand" "=r") + (zero_extend:DI + (rotate:SI (match_operand:SI 1 "register_operand" "r") + (match_operand 2 "const_int_operand" "n"))))] + "UINTVAL (operands[2]) < 32" +{ + operands[2] = GEN_INT (32 - UINTVAL (operands[2])); + return "ror\\t%w0, %w1, %2"; +} + [(set_attr "type" "rotate_imm")] +) + (define_insn "*3_insn" [(set (match_operand:SHORT 0 "register_operand" "=r") (ASHIFT:SHORT (match_operand:SHORT 1 "register_operand" "r") @@ -5419,32 +5498,6 @@ (define_insn "*extrsi5_insn_di" [(set_attr "type" "rotate_imm")] ) -(define_insn "*ror3_insn" - [(set (match_operand:GPI 0 "register_operand" "=r") - (rotate:GPI (match_operand:GPI 1 "register_operand" "r") - (match_operand 2 "const_int_operand" "n")))] - "UINTVAL (operands[2]) < GET_MODE_BITSIZE (mode)" -{ - operands[3] = GEN_INT ( - UINTVAL (operands[2])); - return "ror\\t%0, %1, %3"; -} - [(set_attr "type" "rotate_imm")] -) - -;; zero_extend version of the above -(define_insn "*rorsi3_insn_uxtw" - [(set (match_operand:DI 0 "register_operand" "=r") - (zero_extend:DI - (rotate:SI (match_operand:SI 1 "register_operand" "r") - (match_operand 2 "const_int_operand" "n"))))] - "UINTVAL (operands[2]) < 32" -{ - operands[3] = GEN_INT (32 - UINTVAL (operands[2])); - return "ror\\t%w0, %w1, %3"; -} - [(set_attr "type" "rotate_imm")] -) - (define_insn "*_ashl" [(set (match_operand:GPI 0 "register_operand" "=r") (ANY_EXTEND:GPI diff --git a/gcc/config/aarch64/iterators.md b/gcc/config/aarch64/iterators.md index 0b34e7f7d16c2cc08e69026543e93858eee0f5dd..4bbe8057f406d15019319ab73f6573ee11237a57 100644 --- a/gcc/config/aarch64/iterators.md +++ b/gcc/config/aarch64/iterators.md @@ -2083,7 +2083,10 @@ (define_mode_attr sve_lane_pair_con [(VNx8HF "y") (VNx4SF "x")]) ;; ------------------------------------------------------------------- ;; This code iterator allows the various shifts supported on the core -(define_code_iterator SHIFT [ashift ashiftrt lshiftrt rotatert]) +(define_code_iterator SHIFT [ashift ashiftrt lshiftrt rotatert rotate]) + +;; This code iterator allows all shifts except for rotates. +(define_code_iterator SHIFT_no_rotate [ashift ashiftrt lshiftrt]) ;; This code iterator allows the shifts supported in arithmetic instructions (define_code_iterator ASHIFT [ashift ashiftrt lshiftrt]) @@ -2210,6 +2213,7 @@ (define_code_attr optab [(ashift "ashl") (ashiftrt "ashr") (lshiftrt "lshr") (rotatert "rotr") + (rotate "rotl") (sign_extend "extend") (zero_extend "zero_extend") (sign_extract "extv") @@ -2299,7 +2303,10 @@ (define_code_attr su_optab [(sign_extend "") (zero_extend "u") ;; Similar for the instruction mnemonics (define_code_attr shift [(ashift "lsl") (ashiftrt "asr") - (lshiftrt "lsr") (rotatert "ror")]) + (lshiftrt "lsr") (rotatert "ror") (rotate "ror")]) +;; True if shift is rotate left. +(define_code_attr is_rotl [(ashift "0") (ashiftrt "0") + (lshiftrt "0") (rotatert "0") (rotate "1")]) ;; Op prefix for shift right and accumulate. (define_code_attr sra_op [(ashiftrt "s") (lshiftrt "u")]) diff --git a/gcc/testsuite/gcc.target/aarch64/ror_2.c b/gcc/testsuite/gcc.target/aarch64/ror_2.c new file mode 100644 index 0000000000000000000000000000000000000000..796c1222230e49f81999f3913f483288ff9ff6e8 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/ror_2.c @@ -0,0 +1,205 @@ +/* { dg-options "-O2 --save-temps" } */ +/* { dg-do assemble } */ + + +#define ROR(X,Y) ((X >> Y) | (X << (32 - Y))) + +unsigned +ror1 (unsigned x) +{ + /* { dg-final { scan-assembler "ror\tw\[0-9\]+, w\[0-9\]+, 3\n" } } */ + return ROR (x, 3); +} + +unsigned +ror2 (unsigned x) +{ + /* { dg-final { scan-assembler "ror\tw\[0-9\]+, w\[0-9\]+, 17\n" } } */ + return ROR (x, 17); +} + +unsigned long +ror3 (unsigned x) +{ + /* { dg-final { scan-assembler "ror\tw\[0-9\]+, w\[0-9\]+, 2\n" } } */ + return (unsigned long) ROR (x, 2); +} + +unsigned long +ror4 (unsigned x) +{ + /* { dg-final { scan-assembler "ror\tw\[0-9\]+, w\[0-9\]+, 26\n" } } */ + return (unsigned long) ROR (x, 26); +} + +unsigned +and1 (unsigned x, unsigned y) +{ + /* { dg-final { scan-assembler "and\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, ror 13\n" } } */ + return x & ROR (y, 13); +} + +unsigned +and2 (unsigned x, unsigned y) +{ + /* { dg-final { scan-assembler "and\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, ror 23\n" } } */ + return x & ROR (y, 23); +} + +unsigned long +and3 (unsigned x, unsigned y) +{ + /* { dg-final { scan-assembler "and\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, ror 12\n" } } */ + return x & (unsigned long) ROR (y, 12); +} + +unsigned +bic1 (unsigned x, unsigned y) +{ + /* { dg-final { scan-assembler "bic\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, ror 11\n" } } */ + return x & ~ROR (y, 11); +} + +unsigned +bic2 (unsigned x, unsigned y) +{ + /* { dg-final { scan-assembler "bic\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, ror 17\n" } } */ + return x & ~ROR (y, 17); +} + +unsigned long +bic3 (unsigned x, unsigned y) +{ + /* { dg-final { scan-assembler "bic\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, ror 22\n" } } */ + return (unsigned long) x & ~ROR (y, 22); +} + +unsigned +orr1 (unsigned x, unsigned y) +{ + /* { dg-final { scan-assembler "orr\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, ror 5\n" } } */ + return x | ROR (y, 5); +} + +unsigned +orr2 (unsigned x, unsigned y) +{ + /* { dg-final { scan-assembler "orr\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, ror 25\n" } } */ + return x | ROR (y, 25); +} + +unsigned long +orr3 (unsigned x, unsigned y) +{ + /* { dg-final { scan-assembler "orr\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, ror 24\n" } } */ + return (unsigned long)x | ROR (y, 24); +} + +unsigned +orn1 (unsigned x, unsigned y) +{ + /* { dg-final { scan-assembler "orn\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, ror 3\n" } } */ + return x | ~ROR (y, 3); +} + +unsigned +orn2 (unsigned x, unsigned y) +{ + /* { dg-final { scan-assembler "orn\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, ror 30\n" } } */ + return x | ~ROR (y, 30); +} + +unsigned long +orn3 (unsigned x, unsigned y) +{ + /* { dg-final { scan-assembler "orn\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, ror 9\n" } } */ + return x | (unsigned long) ~ROR (y, 9); +} + +unsigned +eor1 (unsigned x, unsigned y) +{ + /* { dg-final { scan-assembler "eor\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, ror 9\n" } } */ + return x ^ ROR (y, 9); +} + +unsigned +eor2 (unsigned x, unsigned y) +{ + /* { dg-final { scan-assembler "eor\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, ror 31\n" } } */ + return x ^ ROR (y, 31); +} + +unsigned long +eor3 (unsigned x, unsigned y) +{ + /* { dg-final { scan-assembler "eor\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, ror 28\n" } } */ + return (unsigned long) x ^ ROR (y, 28); +} + +unsigned +eon1 (unsigned x, unsigned y) +{ + /* { dg-final { scan-assembler "eon\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, ror 1\n" } } */ + return x ^ ~ROR (y, 1); +} + +unsigned +eon2 (unsigned x, unsigned y) +{ + /* { dg-final { scan-assembler "eon\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, ror 18\n" } } */ + return x ^ ~ROR (y, 18); +} + +unsigned long +eon3 (unsigned x, unsigned y) +{ + /* { dg-final { scan-assembler "eon\tw\[0-9\]+, w\[0-9\]+, w\[0-9\]+, ror 19\n" } } */ + return x ^ (unsigned long) ~ROR (y, 19); +} + +int +tst1 (unsigned x, unsigned y) +{ + /* { dg-final { scan-assembler "tst\tw\[0-9\]+, w\[0-9\]+, ror 8\n" } } */ + return (x & ROR (y, 8)) == 0; +} + +int +tst2 (unsigned x, unsigned y) +{ + /* { dg-final { scan-assembler "tst\tw\[0-9\]+, w\[0-9\]+, ror 20\n" } } */ + return (x & ROR (y, 20)) == 0; +} + +int +tst3 (unsigned x, unsigned y) +{ + /* { dg-final { scan-assembler "tst\tw\[0-9\]+, w\[0-9\]+, ror 20\n" } } */ + return ((unsigned long)x & ROR (y, 20)) == 0; +} + +int +bics1 (unsigned x, unsigned y) +{ + /* { dg-final { scan-assembler "bics\twzr, w\[0-9\]+, w\[0-9\]+, ror 10\n" } } */ + return (x & ~ROR (y, 10)) == 0; +} + +int +bics2 (unsigned x, unsigned y) +{ + /* { dg-final { scan-assembler "bics\twzr, w\[0-9\]+, w\[0-9\]+, ror 21\n" } } */ + return (x & ~ROR (y, 21)) == 0; +} + +int +bics3 (unsigned x, unsigned y) +{ + /* { dg-final { scan-assembler "bics\twzr, w\[0-9\]+, w\[0-9\]+, ror 21\n" } } */ + return (x & (unsigned long)~ROR (y, 21)) == 0; +} + +/* { dg-final { scan-assembler-not "cmp" } } */ +/* { dg-final { scan-assembler-not "mvn" } } */ +/* { dg-final { scan-assembler-not "uxtw" } } */ diff --git a/gcc/testsuite/gcc.target/aarch64/ror_3.c b/gcc/testsuite/gcc.target/aarch64/ror_3.c new file mode 100644 index 0000000000000000000000000000000000000000..484beecf886b6ff94d84b12cfdffe5e7d858f437 --- /dev/null +++ b/gcc/testsuite/gcc.target/aarch64/ror_3.c @@ -0,0 +1,131 @@ +/* { dg-options "-O2 --save-temps" } */ +/* { dg-do assemble } */ + + +#define ROR(X,Y) ((X >> Y) | (X << (64 - Y))) + +unsigned long +ror1 (unsigned long x) +{ + /* { dg-final { scan-assembler "ror\tx\[0-9\]+, x\[0-9\]+, 3\n" } } */ + return ROR (x, 3); +} + +unsigned long +ror2 (unsigned long x) +{ + /* { dg-final { scan-assembler "ror\tx\[0-9\]+, x\[0-9\]+, 37\n" } } */ + return ROR (x, 37); +} + +unsigned long +and1 (unsigned long x, unsigned long y) +{ + /* { dg-final { scan-assembler "and\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, ror 13\n" } } */ + return x & ROR (y, 13); +} + +unsigned long +and2 (unsigned long x, unsigned long y) +{ + /* { dg-final { scan-assembler "and\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, ror 33\n" } } */ + return x & ROR (y, 33); +} + +unsigned long +bic1 (unsigned long x, unsigned long y) +{ + /* { dg-final { scan-assembler "bic\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, ror 11\n" } } */ + return x & ~ROR (y, 11); +} + +unsigned long +bic2 (unsigned long x, unsigned long y) +{ + /* { dg-final { scan-assembler "bic\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, ror 47\n" } } */ + return x & ~ROR (y, 47); +} + +unsigned long +orr1 (unsigned long x, unsigned long y) +{ + /* { dg-final { scan-assembler "orr\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, ror 5\n" } } */ + return x | ROR (y, 5); +} + +unsigned long +orr2 (unsigned long x, unsigned long y) +{ + /* { dg-final { scan-assembler "orr\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, ror 35\n" } } */ + return x | ROR (y, 35); +} + +unsigned long +orn1 (unsigned long x, unsigned long y) +{ + /* { dg-final { scan-assembler "orn\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, ror 3\n" } } */ + return x | ~ROR (y, 3); +} + +unsigned long +orn2 (unsigned long x, unsigned long y) +{ + /* { dg-final { scan-assembler "orn\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, ror 39\n" } } */ + return x | ~ROR (y, 39); +} + +unsigned long +eor1 (unsigned long x, unsigned long y) +{ + /* { dg-final { scan-assembler "eor\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, ror 9\n" } } */ + return x ^ ROR (y, 9); +} + +unsigned long +eor2 (unsigned long x, unsigned long y) +{ + /* { dg-final { scan-assembler "eor\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, ror 41\n" } } */ + return x ^ ROR (y, 41); +} + +unsigned long +eon1 (unsigned long x, unsigned long y) +{ + /* { dg-final { scan-assembler "eon\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, ror 1\n" } } */ + return x ^ ~ROR (y, 1); +} + +unsigned long +eon2 (unsigned long x, unsigned long y) +{ + /* { dg-final { scan-assembler "eon\tx\[0-9\]+, x\[0-9\]+, x\[0-9\]+, ror 38\n" } } */ + return x ^ ~ROR (y, 38); +} + +unsigned long +tst1 (unsigned long x, unsigned long y) +{ + /* { dg-final { scan-assembler "tst\tx\[0-9\]+, x\[0-9\]+, ror 8\n" } } */ + return (x & ROR (y, 8)) == 0; +} + +unsigned long +tst2 (unsigned long x, unsigned long y) +{ + /* { dg-final { scan-assembler "tst\tx\[0-9\]+, x\[0-9\]+, ror 50\n" } } */ + return (x & ROR (y, 50)) == 0; +} + +unsigned long +bics1 (unsigned long x, unsigned long y) +{ + /* { dg-final { scan-assembler "bics\txzr, x\[0-9\]+, x\[0-9\]+, ror 10\n" } } */ + return (x & ~ROR (y, 10)) == 0; +} + +unsigned long +bics2 (unsigned long x, unsigned long y) +{ + /* { dg-final { scan-assembler "bics\txzr, x\[0-9\]+, x\[0-9\]+, ror 62\n" } } */ + return (x & ~ROR (y, 62)) == 0; +}