From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 70281 invoked by alias); 20 Dec 2018 23:44:23 -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 70121 invoked by uid 89); 20 Dec 2018 23:44:13 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-1.9 required=5.0 tests=BAYES_00,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.2 spammy= X-HELO: gate.crashing.org Received: from gate.crashing.org (HELO gate.crashing.org) (63.228.1.57) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Thu, 20 Dec 2018 23:44:12 +0000 Received: from gate.crashing.org (localhost.localdomain [127.0.0.1]) by gate.crashing.org (8.14.1/8.14.1) with ESMTP id wBKNi5Xw029738; Thu, 20 Dec 2018 17:44:06 -0600 Received: (from segher@localhost) by gate.crashing.org (8.14.1/8.14.1/Submit) id wBKNi4dL029737; Thu, 20 Dec 2018 17:44:04 -0600 Date: Thu, 20 Dec 2018 23:46:00 -0000 From: Segher Boessenkool To: Aaron Sawdey Cc: GCC Patches , David Edelsohn , Bill Schmidt Subject: Re: [PATCH][rs6000] avoid using unaligned vsx or lxvd2x/stxvd2x for memcpy/memmove inline expansion Message-ID: <20181220234402.GX3803@gate.crashing.org> References: <0a17416b-57a0-99e7-2e7e-90a63da66fe6@linux.ibm.com> <20181220095119.GP3803@gate.crashing.org> <30fd466c-43c7-86aa-81f2-181a9d9ca7fc@linux.ibm.com> Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <30fd466c-43c7-86aa-81f2-181a9d9ca7fc@linux.ibm.com> User-Agent: Mutt/1.4.2.3i X-IsSubscribed: yes X-SW-Source: 2018-12/txt/msg01520.txt.bz2 On Thu, Dec 20, 2018 at 05:34:54PM -0600, Aaron Sawdey wrote: > On 12/20/18 3:51 AM, Segher Boessenkool wrote: > > On Wed, Dec 19, 2018 at 01:53:05PM -0600, Aaron Sawdey wrote: > >> Because of POWER9 dd2.1 issues with certain unaligned vsx instructions > >> to cache inhibited memory, here is a patch that keeps memmove (and memcpy) > >> inline expansion from doing unaligned vector or using vector load/store > >> other than lvx/stvx. More description of the issue is here: > >> > >> https://patchwork.ozlabs.org/patch/814059/ > >> > >> OK for trunk if bootstrap/regtest ok? > > > > Okay, but see below. > > > [snip] > > > > This is extraordinarily clumsy :-) Maybe something like: > > > > static rtx > > gen_lvx_v4si_move (rtx dest, rtx src) > > { > > gcc_assert (!(MEM_P (dest) && MEM_P (src)); > > gcc_assert (GET_MODE (dest) == V4SImode && GET_MODE (src) == V4SImode); > > if (MEM_P (dest)) > > return gen_altivec_stvx_v4si_internal (dest, src); > > else if (MEM_P (src)) > > return gen_altivec_lvx_v4si_internal (dest, src); > > else > > gcc_unreachable (); > > } > > > > (Or do you allow VOIDmode for src as well?) Anyway, at least get rid of > > the useless extra variable. > > I think this should be better: The gcc_unreachable at the end catches the non-mem to non-mem case. > static rtx > gen_lvx_v4si_move (rtx dest, rtx src) > { > gcc_assert ((MEM_P (dest) && !MEM_P (src)) || (MEM_P (src) && !MEM_P(dest))); But if you prefer this, how about { gcc_assert (MEM_P (dest) ^ MEM_P (src)); gcc_assert (GET_MODE (dest) == V4SImode && GET_MODE (src) == V4SImode); if (MEM_P (dest)) return gen_altivec_stvx_v4si_internal (dest, src); else return gen_altivec_lvx_v4si_internal (dest, src); } :-) Segher