From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from gate.crashing.org (gate.crashing.org [63.228.1.57]) by sourceware.org (Postfix) with ESMTP id AE4193971806 for ; Mon, 25 Jan 2021 22:52:45 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org AE4193971806 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=kernel.crashing.org Authentication-Results: sourceware.org; spf=fail smtp.mailfrom=segher@kernel.crashing.org Received: from gate.crashing.org (localhost.localdomain [127.0.0.1]) by gate.crashing.org (8.14.1/8.14.1) with ESMTP id 10PMpjNv024778; Mon, 25 Jan 2021 16:51:45 -0600 Received: (from segher@localhost) by gate.crashing.org (8.14.1/8.14.1/Submit) id 10PMpijQ024776; Mon, 25 Jan 2021 16:51:44 -0600 X-Authentication-Warning: gate.crashing.org: segher set sender to segher@kernel.crashing.org using -f Date: Mon, 25 Jan 2021 16:51:43 -0600 From: Segher Boessenkool To: Alan Modra Cc: gcc-patches@gcc.gnu.org Subject: Re: [PATCH 5/8] [RS6000] rs6000_rtx_costs cost IOR Message-ID: <20210125225143.GC30983@gate.crashing.org> References: <20201007225800.9536-1-amodra@gmail.com> <20201007225800.9536-6-amodra@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <20201007225800.9536-6-amodra@gmail.com> User-Agent: Mutt/1.4.2.3i X-Spam-Status: No, score=-13.1 required=5.0 tests=BAYES_00, GIT_PATCH_0, JMQ_SPF_NEUTRAL, KAM_DMARC_STATUS, TXREP, T_SPF_HELO_PERMERROR, T_SPF_PERMERROR 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: , X-List-Received-Date: Mon, 25 Jan 2021 22:52:47 -0000 Hi! On Thu, Oct 08, 2020 at 09:27:57AM +1030, Alan Modra wrote: > * config/rs6000/rs6000.c (rotate_insert_cost): New function. > (rs6000_rtx_costs): Cost IOR. > > diff --git a/gcc/config/rs6000/rs6000.c b/gcc/config/rs6000/rs6000.c > index 383d2901c9f..15a806fe307 100644 > --- a/gcc/config/rs6000/rs6000.c > +++ b/gcc/config/rs6000/rs6000.c > @@ -21206,6 +21206,91 @@ rs6000_cannot_copy_insn_p (rtx_insn *insn) > && get_attr_cannot_copy (insn); > } > > +/* Handle rtx_costs for scalar integer rotate and insert insns. */ You need to document here what the return value means, and what the preconditions for "left" (and "right") are. > +static bool > +rotate_insert_cost (rtx left, rtx right, machine_mode mode, bool speed, > + int *total) > +{ > + if (GET_CODE (right) == AND ... because you never check the CODE of "left". > + && CONST_INT_P (XEXP (right, 1)) > + && UINTVAL (XEXP (left, 1)) + UINTVAL (XEXP (right, 1)) + 1 == 0) HOST_WIDE_INT is always exactly 64 bits now, so you could do "== -1". > + { > + rtx leftop = XEXP (left, 0); > + rtx rightop = XEXP (right, 0); > + > + /* rotlsi3_insert_5. */ > + if (REG_P (leftop) > + && REG_P (rightop) > + && mode == SImode > + && UINTVAL (XEXP (left, 1)) != 0 > + && UINTVAL (XEXP (right, 1)) != 0 > + && rs6000_is_valid_mask (XEXP (left, 1), NULL, NULL, mode)) > + return true; Empty line after return please. > + /* rotldi3_insert_6. */ > + if (REG_P (leftop) > + && REG_P (rightop) > + && mode == DImode > + && exact_log2 (-UINTVAL (XEXP (left, 1))) > 0) > + return true; > + /* rotldi3_insert_7. */ > + if (REG_P (leftop) > + && REG_P (rightop) > + && mode == DImode > + && exact_log2 (-UINTVAL (XEXP (right, 1))) > 0) > + return true; Those could just use rs6000_is_valid_mask as well? > + rtx mask = 0; > + rtx shift = leftop; > + rtx_code shift_code = GET_CODE (shift); > + /* rotl3_insert. */ > + if (shift_code == ROTATE > + || shift_code == ASHIFT > + || shift_code == LSHIFTRT) > + mask = right; > + else > + { > + shift = rightop; > + shift_code = GET_CODE (shift); > + /* rotl3_insert_2. */ > + if (shift_code == ROTATE > + || shift_code == ASHIFT > + || shift_code == LSHIFTRT) > + mask = left; > + } > + if (mask > + && CONST_INT_P (XEXP (shift, 1)) > + && rs6000_is_valid_insert_mask (XEXP (mask, 1), shift, mode)) > + { > + *total += rtx_cost (XEXP (shift, 0), mode, shift_code, 0, speed); > + *total += rtx_cost (XEXP (mask, 0), mode, AND, 0, speed); > + return true; > + } > + } > + /* rotl3_insert_3. */ > + if (GET_CODE (right) == ASHIFT > + && CONST_INT_P (XEXP (right, 1)) > + && (INTVAL (XEXP (right, 1)) > + == exact_log2 (UINTVAL (XEXP (left, 1)) + 1))) > + { > + *total += rtx_cost (XEXP (left, 0), mode, AND, 0, speed); > + *total += rtx_cost (XEXP (right, 0), mode, ASHIFT, 0, speed); > + return true; > + } > + /* rotl3_insert_4. */ > + if (GET_CODE (right) == LSHIFTRT > + && CONST_INT_P (XEXP (right, 1)) > + && mode == SImode > + && (INTVAL (XEXP (right, 1)) > + + exact_log2 (-UINTVAL (XEXP (left, 1)))) == 32) > + { > + *total += rtx_cost (XEXP (left, 0), mode, AND, 0, speed); > + *total += rtx_cost (XEXP (right, 0), mode, LSHIFTRT, 0, speed); > + return true; > + } > + return false; > +} > + > /* Compute a (partial) cost for rtx X. Return true if the complete > cost has been computed, and false if subexpressions should be > scanned. In either case, *TOTAL contains the cost result. > @@ -21253,7 +21338,7 @@ static bool > rs6000_rtx_costs (rtx x, machine_mode mode, int outer_code, > int opno ATTRIBUTE_UNUSED, int *total, bool speed) > { > - rtx right; > + rtx left, right; > int code = GET_CODE (x); > > switch (code) > @@ -21435,7 +21520,7 @@ rs6000_rtx_costs (rtx x, machine_mode mode, int outer_code, > right = XEXP (x, 1); > if (CONST_INT_P (right)) > { > - rtx left = XEXP (x, 0); > + left = XEXP (x, 0); > rtx_code left_code = GET_CODE (left); > > /* rotate-and-mask: 1 insn. */ > @@ -21452,9 +21537,16 @@ rs6000_rtx_costs (rtx x, machine_mode mode, int outer_code, > return false; > > case IOR: > - /* FIXME */ > *total = COSTS_N_INSNS (1); > - return true; > + left = XEXP (x, 0); > + if (GET_CODE (left) == AND > + && CONST_INT_P (XEXP (left, 1))) > + { > + right = XEXP (x, 1); > + if (rotate_insert_cost (left, right, mode, speed, total)) > + return true; > + } > + return false; > > case CLZ: > case XOR: Please wait this until stage 1. Sorry. Segher