From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 43378 invoked by alias); 24 Jul 2015 11:27:08 -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 43367 invoked by uid 89); 24 Jul 2015 11:27:07 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.7 required=5.0 tests=AWL,BAYES_00,SPF_PASS autolearn=ham version=3.3.2 X-HELO: eu-smtp-delivery-143.mimecast.com Received: from eu-smtp-delivery-143.mimecast.com (HELO eu-smtp-delivery-143.mimecast.com) (146.101.78.143) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 24 Jul 2015 11:27:05 +0000 Received: from cam-owa1.Emea.Arm.com (fw-tnat.cambridge.arm.com [217.140.96.140]) by eu-smtp-1.mimecast.com with ESMTP id uk-mta-17-iN6KnI8TTgK6mj63J9ACtQ-1; Fri, 24 Jul 2015 12:27:01 +0100 Received: from [10.2.207.50] ([10.1.2.79]) by cam-owa1.Emea.Arm.com with Microsoft SMTPSVC(6.0.3790.3959); Fri, 24 Jul 2015 12:27:00 +0100 Message-ID: <55B22104.4050409@arm.com> Date: Fri, 24 Jul 2015 11:35:00 -0000 From: Kyrill Tkachov User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.2.0 MIME-Version: 1.0 To: Szabolcs Nagy , "gcc-patches@gcc.gnu.org" CC: Marcus Shawcroft , Ramana Radhakrishnan Subject: Re: [PATCH][ARM] PR target/66731 Fix vnmul insn with -frounding-math References: <55B21D31.5020607@arm.com> In-Reply-To: <55B21D31.5020607@arm.com> X-MC-Unique: iN6KnI8TTgK6mj63J9ACtQ-1 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: quoted-printable X-IsSubscribed: yes X-SW-Source: 2015-07/txt/msg02044.txt.bz2 Hi Szabolcs, On 24/07/15 12:10, Szabolcs Nagy wrote: > (-a)*b should not be compiled to vnmul a,b with -frounding-math. > Added a new -(a*b) pattern for vnmul and the old one is only > used if !flag_rounding_math. Updated the costs too. > > This is the ARM version of > https://gcc.gnu.org/ml/gcc-patches/2015-07/msg00300.html > > Tested with arm-none-linux-gnueabihf cross compiler. > is this OK? > > gcc/Changelog: > > 2015-07-20 Szabolcs Nagy > > PR target/66731 > * config/arm/arm.md (muldf3negdf_vfp): Handle -frounding-math. > (mulsf3negsf_vfp): Likewise. This entry is misleading. You disable two existing patterns for flag_rounding_math and you add two new patterns. The entry should reflect that. > * config/arm/arm.c (arm_new_rtx_costs): Fix NEG cost for VNMUL, > fix MULT cost with -frounding-math. > > gcc/testsuite/Changelog: > > 2015-07-20 Szabolcs Nagy > > PR target/66731 > * gcc.target/arm/vnmul-1.c: New. > * gcc.target/arm/vnmul-2.c: New. > * gcc.target/arm/vnmul-3.c: New. > * gcc.target/arm/vnmul-4.c: New. diff --git a/gcc/config/arm/vfp.md b/gcc/config/arm/vfp.md index f62ff79..214c48c 100644 --- a/gcc/config/arm/vfp.md +++ b/gcc/config/arm/vfp.md @@ -770,6 +770,17 @@ [(set (match_operand:SF 0 "s_register_operand" "=3Dt") (mult:SF (neg:SF (match_operand:SF 1 "s_register_operand" "t")) (match_operand:SF 2 "s_register_operand" "t")))] + "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP && !flag_rounding_math" + "vnmul%?.f32\\t%0, %1, %2" + [(set_attr "predicable" "yes") + (set_attr "predicable_short_it" "no") + (set_attr "type" "fmuls")] +) + +(define_insn "*mulsf3negsf_vfp" + [(set (match_operand:SF 0 "s_register_operand" "=3Dt") + (neg:SF (mult:SF (match_operand:SF 1 "s_register_operand" "t") + (match_operand:SF 2 "s_register_operand" "t"))))] "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP" "vnmul%?.f32\\t%0, %1, %2" [(set_attr "predicable" "yes") Can you give the new pattern a different name to reflect that the neg is on the outside? Something like *negmulsf3_vfp. diff --git a/gcc/testsuite/gcc.target/arm/vnmul-1.c b/gcc/testsuite/gcc.tar= get/arm/vnmul-1.c new file mode 100644 index 0000000..0b4ca2c --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/vnmul-1.c @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target arm_vfp_ok } */ +/* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=3Dsoft" } = { "" } } */ +/* { dg-options "-O2 -mfpu=3Dvfp -mfloat-abi=3Dhard" } */ Can you please add an explicit -fno-rounding-math here? That way we get a h= int as to why these tests exist. Alternatively, you can rename the tests to be pr6673= 1_1.c, pr66731_2.c etc. That way in the future we'll know what issue they're testi= ng for. diff --git a/gcc/testsuite/gcc.target/arm/vnmul-2.c b/gcc/testsuite/gcc.tar= get/arm/vnmul-2.c new file mode 100644 index 0000000..f9a8a5c --- /dev/null +++ b/gcc/testsuite/gcc.target/arm/vnmul-2.c @@ -0,0 +1,20 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target arm_vfp_ok } */ +/* { dg-skip-if "need fp instructions" { *-*-* } { "-mfloat-abi=3Dsoft" } = { "" } } */ +/* { dg-options "-O2 -frounding-math -mfpu=3Dvfp -mfloat-abi=3Dhard" } */ + +double +foo_d (double a, double b) +{ + /* { dg-final { scan-assembler "vneg\.f64" } } */ + /* { dg-final { scan-assembler "vmul\.f64" } } */ + return -a * b; +} + +float +foo_s (float a, float b) +{ + /* { dg-final { scan-assembler "vneg\.f32" } } */ + /* { dg-final { scan-assembler "vmul\.f32" } } */ + return -a * b; +} I'd prefer if you just do a scan-assembler not "vnmul", which is what this patch really fixes. Whether the midend decides to use a pair of vneg+vmul is tangential to this patch, it's the vnmul that we're trying to avoid. Thanks, Kyrill