From patchwork Thu Apr 20 15:58:56 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Wilco Dijkstra X-Patchwork-Id: 752863 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 3w83TG4Zl7z9s4s for ; Fri, 21 Apr 2017 01:59:12 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b="ZVwjbriE"; dkim-atps=neutral DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id:references:in-reply-to :content-type:content-transfer-encoding:mime-version; q=dns; s= default; b=x+k8d4PM8NuYc6a4KXR4IoJ4BiTgmmkG3LA2pdmdivDxvXH1aF6gL O8Cutx2ROg1vBxkuI84onJhLYAU85nomKCzhFX/VHgEuyO9W6fKTlmvlUpPpbw6L Ok7CejXBIGYJH0rafJkrjyySoMNUtGN/5d2qVEFC6XFCNyzImP1va4= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id:references:in-reply-to :content-type:content-transfer-encoding:mime-version; s=default; bh=0wZQegEsTMZNe12j4ZZUofFQuWI=; b=ZVwjbriEFYZdSjJhKVIP9GMV1mKt xZs8ZMRznFZT2QGOSf/h6avRsjHUCm3eAlyeAFQ1ACA8Ip67dgGk00o4Fj4oW1cv tBX6jdMkbb2iNAnyHhzY2Q+N3adfCTedOG1ontCGxaAqJfh4JsOaYnu9IdINYoxQ fpyqCKoXCDjnDPk= Received: (qmail 114507 invoked by alias); 20 Apr 2017 15:59:02 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 114456 invoked by uid 89); 20 Apr 2017 15:59:01 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-24.5 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_LOTSOFHASH, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, SPF_PASS autolearn=ham version=3.3.2 spammy=rarely, asl, Earnshaw, earnshaw X-HELO: EUR02-HE1-obe.outbound.protection.outlook.com Received: from mail-eopbgr10068.outbound.protection.outlook.com (HELO EUR02-HE1-obe.outbound.protection.outlook.com) (40.107.1.68) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 20 Apr 2017 15:58:59 +0000 Received: from AM5PR0802MB2610.eurprd08.prod.outlook.com (10.175.46.18) by AM5PR0802MB2388.eurprd08.prod.outlook.com (10.175.43.150) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.1047.13; Thu, 20 Apr 2017 15:58:56 +0000 Received: from AM5PR0802MB2610.eurprd08.prod.outlook.com ([10.175.46.18]) by AM5PR0802MB2610.eurprd08.prod.outlook.com ([10.175.46.18]) with mapi id 15.01.1047.013; Thu, 20 Apr 2017 15:58:56 +0000 From: Wilco Dijkstra To: GCC Patches , Kyrill Tkachov CC: nd , Richard Earnshaw Subject: Re: [PATCH][ARM] Remove DImode expansions for 1-bit shifts Date: Thu, 20 Apr 2017 15:58:56 +0000 Message-ID: References: In-Reply-To: authentication-results: arm.com; dkim=none (message not signed) header.d=none; arm.com; dmarc=none action=none header.from=arm.com; x-microsoft-exchange-diagnostics: 1; AM5PR0802MB2388; 7:3bSFit4LxAapSmPCqHbpihANOIlJV+jZhoALiXRqn48ZNm9pGgy6ptrnYZGXiV/MqcshvlEA8JSttf3KWiMwnOu+ktY1CKRObSBFVtQBzhDqqh4LoQQCgGk+24CJTpScxsUgSy/O+/x5veeRI2eCo+iRw/YX3sc5EAiEAZvactHoyL6zr74bvS8RdmphN0m410JHNg1cYCVcirBRii3ooV3RmcfNSEKLgbBhmMyHGdTdQMRKIaF3i7YttiLCdpKd2vdZuNnshR43WMGpgaT2tZC2VZelaobclIwBmflNBC5kofPh8rg77ZX91rQnpTh7hBojp8VI1BHZ+S+al7G9tA== x-ms-office365-filtering-correlation-id: f3aed102-c5ca-4486-dfc1-08d4880626c4 x-ms-office365-filtering-ht: Tenant x-microsoft-antispam: UriScan:; BCL:0; PCL:0; RULEID:(22001)(2017030254075)(48565401081)(201703131423075)(201703031133081)(201702281549075); SRVR:AM5PR0802MB2388; nodisclaimer: True x-microsoft-antispam-prvs: x-exchange-antispam-report-test: UriScan:(180628864354917); x-exchange-antispam-report-cfa-test: BCL:0; PCL:0; RULEID:(6040450)(601004)(2401047)(8121501046)(5005006)(93006095)(93001095)(3002001)(10201501046)(6055026)(6041248)(20161123562025)(20161123560025)(201703131423075)(201702281528075)(201703061421075)(20161123564025)(20161123555025)(6072148); SRVR:AM5PR0802MB2388; BCL:0; PCL:0; RULEID:; SRVR:AM5PR0802MB2388; x-forefront-prvs: 02830F0362 x-forefront-antispam-report: SFV:NSPM; SFS:(10009020)(6009001)(39400400002)(39840400002)(39410400002)(39850400002)(39450400003)(39860400002)(377424004)(77096006)(2900100001)(8936002)(50986999)(8676002)(74316002)(81166006)(33656002)(76176999)(102836003)(4326008)(3846002)(6116002)(54356999)(7736002)(38730400002)(3280700002)(122556002)(53546009)(305945005)(25786009)(3660700001)(2906002)(6506006)(66066001)(6246003)(575784001)(229853002)(54906002)(7696004)(99286003)(55016002)(86362001)(9686003)(5660300001)(2950100002)(189998001)(53936002); DIR:OUT; SFP:1101; SCL:1; SRVR:AM5PR0802MB2388; H:AM5PR0802MB2610.eurprd08.prod.outlook.com; FPR:; SPF:None; MLV:sfv; LANG:en; spamdiagnosticoutput: 1:99 spamdiagnosticmetadata: NSPM MIME-Version: 1.0 X-OriginatorOrg: arm.com X-MS-Exchange-CrossTenant-originalarrivaltime: 20 Apr 2017 15:58:56.6579 (UTC) X-MS-Exchange-CrossTenant-fromentityheader: Hosted X-MS-Exchange-CrossTenant-id: f34e5979-57d9-4aaa-ad4d-b122a662184d X-MS-Exchange-Transport-CrossTenantHeadersStamped: AM5PR0802MB2388 ping From: Wilco Dijkstra Sent: 17 January 2017 19:23 To: GCC Patches Cc: nd; Kyrill Tkachov; Richard Earnshaw Subject: [PATCH][ARM] Remove DImode expansions for 1-bit shifts   A left shift of 1 can always be done using an add, so slightly adjust rtx cost for DImode left shift by 1 so that adddi3 is preferred in all cases, and the arm_ashldi3_1bit is redundant. DImode right shifts of 1 are rarely used (6 in total in the GCC binary), so there is little benefit of the arm_ashrdi3_1bit and arm_lshrdi3_1bit patterns. Bootstrap OK on arm-linux-gnueabihf. ChangeLog: 2017-01-17  Wilco Dijkstra          * config/arm/arm.md (ashldi3): Remove shift by 1 expansion.         (arm_ashldi3_1bit): Remove pattern.         (ashrdi3): Remove shift by 1 expansion.         (arm_ashrdi3_1bit): Remove pattern.         (lshrdi3): Remove shift by 1 expansion.         (arm_lshrdi3_1bit): Remove pattern.         * config/arm/arm.c (arm_rtx_costs_internal): Slightly increase         cost of ashldi3 by 1.         * config/arm/neon.md (ashldi3_neon): Remove shift by 1 expansion.         (di3_neon): Likewise. diff --git a/gcc/config/arm/arm.c b/gcc/config/arm/arm.c index 7d82ba358306189535bf7eee08a54e2f84569307..d47f4005446ff3e81968d7888c6573c0360cfdbd 100644 --- a/gcc/config/arm/arm.c +++ b/gcc/config/arm/arm.c @@ -9254,6 +9254,9 @@ arm_rtx_costs_internal (rtx x, enum rtx_code code, enum rtx_code outer_code,                     + rtx_cost (XEXP (x, 0), mode, code, 0, speed_p));            if (speed_p)              *cost += 2 * extra_cost->alu.shift; +         /* Slightly disparage left shift by 1 at so we prefer adddi3.  */ +         if (code == ASHIFT && XEXP (x, 1) == CONST1_RTX (SImode)) +           *cost += 1;            return true;          }        else if (mode == SImode) diff --git a/gcc/config/arm/arm.md b/gcc/config/arm/arm.md index 0d69c8be9a2f98971c23c3b6f1659049f369920e..92b734ca277079f5f7343c7cc21a343f48d234c5 100644 --- a/gcc/config/arm/arm.md +++ b/gcc/config/arm/arm.md @@ -4061,12 +4061,6 @@      {        rtx scratch1, scratch2;   -      if (operands[2] == CONST1_RTX (SImode)) -        { -          emit_insn (gen_arm_ashldi3_1bit (operands[0], operands[1])); -          DONE; -        } -        /* Ideally we should use iwmmxt here if we could know that operands[1]           ends up already living in an iwmmxt register. Otherwise it's           cheaper to have the alternate code being generated than moving @@ -4083,18 +4077,6 @@    "  )   -(define_insn "arm_ashldi3_1bit" -  [(set (match_operand:DI            0 "s_register_operand" "=r,&r") -        (ashift:DI (match_operand:DI 1 "s_register_operand" "0,r") -                   (const_int 1))) -   (clobber (reg:CC CC_REGNUM))] -  "TARGET_32BIT" -  "movs\\t%Q0, %Q1, asl #1\;adc\\t%R0, %R1, %R1" -  [(set_attr "conds" "clob") -   (set_attr "length" "8") -   (set_attr "type" "multiple")] -) -  (define_expand "ashlsi3"    [(set (match_operand:SI            0 "s_register_operand" "")          (ashift:SI (match_operand:SI 1 "s_register_operand" "") @@ -4130,12 +4112,6 @@      {        rtx scratch1, scratch2;   -      if (operands[2] == CONST1_RTX (SImode)) -        { -          emit_insn (gen_arm_ashrdi3_1bit (operands[0], operands[1])); -          DONE; -        } -        /* Ideally we should use iwmmxt here if we could know that operands[1]           ends up already living in an iwmmxt register. Otherwise it's           cheaper to have the alternate code being generated than moving @@ -4152,18 +4128,6 @@    "  )   -(define_insn "arm_ashrdi3_1bit" -  [(set (match_operand:DI              0 "s_register_operand" "=r,&r") -        (ashiftrt:DI (match_operand:DI 1 "s_register_operand" "0,r") -                     (const_int 1))) -   (clobber (reg:CC CC_REGNUM))] -  "TARGET_32BIT" -  "movs\\t%R0, %R1, asr #1\;mov\\t%Q0, %Q1, rrx" -  [(set_attr "conds" "clob") -   (set_attr "length" "8") -   (set_attr "type" "multiple")] -) -  (define_expand "ashrsi3"    [(set (match_operand:SI              0 "s_register_operand" "")          (ashiftrt:SI (match_operand:SI 1 "s_register_operand" "") @@ -4196,12 +4160,6 @@      {        rtx scratch1, scratch2;   -      if (operands[2] == CONST1_RTX (SImode)) -        { -          emit_insn (gen_arm_lshrdi3_1bit (operands[0], operands[1])); -          DONE; -        } -        /* Ideally we should use iwmmxt here if we could know that operands[1]           ends up already living in an iwmmxt register. Otherwise it's           cheaper to have the alternate code being generated than moving @@ -4218,18 +4176,6 @@    "  )   -(define_insn "arm_lshrdi3_1bit" -  [(set (match_operand:DI              0 "s_register_operand" "=r,&r") -        (lshiftrt:DI (match_operand:DI 1 "s_register_operand" "0,r") -                     (const_int 1))) -   (clobber (reg:CC CC_REGNUM))] -  "TARGET_32BIT" -  "movs\\t%R0, %R1, lsr #1\;mov\\t%Q0, %Q1, rrx" -  [(set_attr "conds" "clob") -   (set_attr "length" "8") -   (set_attr "type" "multiple")] -) -  (define_expand "lshrsi3"    [(set (match_operand:SI              0 "s_register_operand" "")          (lshiftrt:SI (match_operand:SI 1 "s_register_operand" "") diff --git a/gcc/config/arm/neon.md b/gcc/config/arm/neon.md index cf281df0292d0f511d7d63e828886d860a3a8201..ebac36db8db3a74a16cc4ef7f76b1edd90e28fc9 100644 --- a/gcc/config/arm/neon.md +++ b/gcc/config/arm/neon.md @@ -1184,12 +1184,8 @@          gcc_assert (!reg_overlap_mentioned_p (operands[0], operands[1])                      || REGNO (operands[0]) == REGNO (operands[1]));   -       if (operands[2] == CONST1_RTX (SImode)) -         /* This clobbers CC.  */ -         emit_insn (gen_arm_ashldi3_1bit (operands[0], operands[1])); -       else -         arm_emit_coreregs_64bit_shift (ASHIFT, operands[0], operands[1], -                                        operands[2], operands[3], operands[4]); +       arm_emit_coreregs_64bit_shift (ASHIFT, operands[0], operands[1], +                                      operands[2], operands[3], operands[4]);        }      DONE;    }" @@ -1288,13 +1284,9 @@          gcc_assert (!reg_overlap_mentioned_p (operands[0], operands[1])                      || REGNO (operands[0]) == REGNO (operands[1]));   -       if (operands[2] == CONST1_RTX (SImode)) -         /* This clobbers CC.  */ -         emit_insn (gen_arm_di3_1bit (operands[0], operands[1])); -       else -         /* This clobbers CC (ASHIFTRT by register only).  */ -         arm_emit_coreregs_64bit_shift (, operands[0], operands[1], -                                  operands[2], operands[3], operands[4]); +       /* This clobbers CC (ASHIFTRT by register only).  */ +       arm_emit_coreregs_64bit_shift (, operands[0], operands[1], +                                      operands[2], operands[3], operands[4]);        }        DONE;