From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 101227 invoked by alias); 20 Jun 2016 13:22:19 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Received: (qmail 101203 invoked by uid 89); 20 Jun 2016 13:22:18 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-3.3 required=5.0 tests=BAYES_00,RP_MATCHES_RCVD,SPF_PASS autolearn=ham version=3.3.2 spammy=div X-HELO: foss.arm.com Received: from foss.arm.com (HELO foss.arm.com) (217.140.101.70) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Mon, 20 Jun 2016 13:22:08 +0000 Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.72.51.249]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id 4AD183B0; Mon, 20 Jun 2016 06:22:51 -0700 (PDT) Received: from e105689-lin.cambridge.arm.com (e105689-lin.cambridge.arm.com [10.2.207.32]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 117303F445; Mon, 20 Jun 2016 06:22:04 -0700 (PDT) Subject: Re: [AArch64] Give some new costs for Cortex-A57 floating-point operations To: James Greenhalgh , gcc-patches@gcc.gnu.org References: <1464942950-29272-1-git-send-email-james.greenhalgh@arm.com> Cc: nd@arm.com, marcus.shawcroft@arm.com From: "Richard Earnshaw (lists)" Message-ID: <5767EDFB.3030304@arm.com> Date: Mon, 20 Jun 2016 13:22:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:38.0) Gecko/20100101 Thunderbird/38.8.0 MIME-Version: 1.0 In-Reply-To: <1464942950-29272-1-git-send-email-james.greenhalgh@arm.com> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-SW-Source: 2016-06/txt/msg01409.txt.bz2 On 03/06/16 09:35, James Greenhalgh wrote: > > Hi, > > This patch rebases the floating-point cost table for Cortex-A57 to be > relative to the cost of a floating-point move. This in response to this > feedback from Richard Sandiford [2] on Ramana's patch to calls.c [1] from > 2014: > > I think this is really a bug in the backend. The backend is assigning a > cost of COSTS_N_INSNS (3) to a floating-point constant not because the > constant itself is expensive -- it's actually as cheap as a register > in this context -- but because the backend considers floating-point > moves to be 3 times more expensive than cheap integer moves. > > The argument is that a move in mode X should be treated with cost > COSTS_N_INSNS (1), and other instructions should have a cost relative to > that move. For example, in this patch we say that instructions building a > floating-point constant are the same cost as a floating-point register to > register move. Fixing this fixes the issue Ramana was seeing, in a way > consistent with what other back-ends do. > > This patch gives a small improvement to Spec2000FP on a Cortex-A57 > platform. > > Bootstrapped on aarch64-none-linux-gnu with no issues. > > OK? > OK. R. > Thanks, > James > > --- > 2016-06-03 James Greenhalgh > > * config/arm/aarch-cost-tables.h (cortexa57_extra_costs): Make FP > costs relative to the cost of a register move. > > [1] https://gcc.gnu.org/ml/gcc-patches/2014-10/msg00136.html > [2] https://gcc.gnu.org/ml/gcc-patches/2014-10/msg00391.html > > > 0001-AArch64-Give-some-new-costs-for-Cortex-A57-floating-.patch > > > diff --git a/gcc/config/arm/aarch-cost-tables.h b/gcc/config/arm/aarch-cost-tables.h > index c971b30..5f42253 100644 > --- a/gcc/config/arm/aarch-cost-tables.h > +++ b/gcc/config/arm/aarch-cost-tables.h > @@ -294,35 +294,35 @@ const struct cpu_cost_table cortexa57_extra_costs = > { > /* FP SFmode */ > { > - COSTS_N_INSNS (17), /* div. */ > - COSTS_N_INSNS (5), /* mult. */ > - COSTS_N_INSNS (9), /* mult_addsub. */ > - COSTS_N_INSNS (9), /* fma. */ > - COSTS_N_INSNS (4), /* addsub. */ > - COSTS_N_INSNS (2), /* fpconst. */ > - COSTS_N_INSNS (2), /* neg. */ > - COSTS_N_INSNS (2), /* compare. */ > - COSTS_N_INSNS (4), /* widen. */ > - COSTS_N_INSNS (4), /* narrow. */ > - COSTS_N_INSNS (4), /* toint. */ > - COSTS_N_INSNS (4), /* fromint. */ > - COSTS_N_INSNS (4) /* roundint. */ > + COSTS_N_INSNS (6), /* div. */ > + COSTS_N_INSNS (1), /* mult. */ > + COSTS_N_INSNS (2), /* mult_addsub. */ > + COSTS_N_INSNS (2), /* fma. */ > + COSTS_N_INSNS (1), /* addsub. */ > + 0, /* fpconst. */ > + 0, /* neg. */ > + 0, /* compare. */ > + COSTS_N_INSNS (1), /* widen. */ > + COSTS_N_INSNS (1), /* narrow. */ > + COSTS_N_INSNS (1), /* toint. */ > + COSTS_N_INSNS (1), /* fromint. */ > + COSTS_N_INSNS (1) /* roundint. */ > }, > /* FP DFmode */ > { > - COSTS_N_INSNS (31), /* div. */ > - COSTS_N_INSNS (5), /* mult. */ > - COSTS_N_INSNS (9), /* mult_addsub. */ > - COSTS_N_INSNS (9), /* fma. */ > - COSTS_N_INSNS (4), /* addsub. */ > - COSTS_N_INSNS (2), /* fpconst. */ > - COSTS_N_INSNS (2), /* neg. */ > - COSTS_N_INSNS (2), /* compare. */ > - COSTS_N_INSNS (4), /* widen. */ > - COSTS_N_INSNS (4), /* narrow. */ > - COSTS_N_INSNS (4), /* toint. */ > - COSTS_N_INSNS (4), /* fromint. */ > - COSTS_N_INSNS (4) /* roundint. */ > + COSTS_N_INSNS (11), /* div. */ > + COSTS_N_INSNS (1), /* mult. */ > + COSTS_N_INSNS (2), /* mult_addsub. */ > + COSTS_N_INSNS (2), /* fma. */ > + COSTS_N_INSNS (1), /* addsub. */ > + 0, /* fpconst. */ > + 0, /* neg. */ > + 0, /* compare. */ > + COSTS_N_INSNS (1), /* widen. */ > + COSTS_N_INSNS (1), /* narrow. */ > + COSTS_N_INSNS (1), /* toint. */ > + COSTS_N_INSNS (1), /* fromint. */ > + COSTS_N_INSNS (1) /* roundint. */ > } > }, > /* Vector */ >