From patchwork Fri Aug 16 17:06:56 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Peter Bergner X-Patchwork-Id: 267713 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 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "localhost", Issuer "www.qmailtoaster.com" (not verified)) by ozlabs.org (Postfix) with ESMTPS id 8D6AA2C027B for ; Sat, 17 Aug 2013 03:07:19 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender :subject:from:to:cc:content-type:date:message-id:mime-version :content-transfer-encoding; q=dns; s=default; b=GIypIOnp7ESq0CHt c5b7tMNI0FdnAbMRgWRPh8gYzvdMw2v9zwWCKL5hzIsnqF7rvgo4rQH7LDvoNJWF lJzHmLfmb06TD8qn1yJ6lOLW9qnlzD23l+EvNoT/TLbNCSIQpHBD/5uOodU6XaMp IGRLqjykwum3lT+Z65vLf8x65aY= 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 :subject:from:to:cc:content-type:date:message-id:mime-version :content-transfer-encoding; s=default; bh=/1MxsOT837etum2bhg834e I8XhE=; b=HVRPpE/U36S4N9zEAb4FXa8yDqVsXiGl65Luy8/9gl61euTNyEDmKb vdS4j1eB5qSxpm6zVy9LhXsT4RrxUR+VkJ4cQCAf+hxcTJP7wCGNZQW10uSCt5ss OzFctgqPzBmxW7TQRohoSQ4lCa5ssHzhAwqRgwZ1k4TQFj7CD7APU= Received: (qmail 14071 invoked by alias); 16 Aug 2013 17:07:10 -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 14057 invoked by uid 89); 16 Aug 2013 17:07:09 -0000 X-Spam-SWARE-Status: No, score=-4.3 required=5.0 tests=AWL, BAYES_00, RCVD_IN_DNSWL_MED, RCVD_IN_HOSTKARMA_W, RP_MATCHES_RCVD, SPF_PASS autolearn=ham version=3.3.2 Received: from e28smtp06.in.ibm.com (HELO e28smtp06.in.ibm.com) (122.248.162.6) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Fri, 16 Aug 2013 17:07:07 +0000 Received: from /spool/local by e28smtp06.in.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Fri, 16 Aug 2013 22:27:42 +0530 Received: from d28dlp02.in.ibm.com (9.184.220.127) by e28smtp06.in.ibm.com (192.168.1.136) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Fri, 16 Aug 2013 22:27:39 +0530 Received: from d28relay05.in.ibm.com (d28relay05.in.ibm.com [9.184.220.62]) by d28dlp02.in.ibm.com (Postfix) with ESMTP id B24F33940053 for ; Fri, 16 Aug 2013 22:36:51 +0530 (IST) Received: from d28av03.in.ibm.com (d28av03.in.ibm.com [9.184.220.65]) by d28relay05.in.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id r7GH6v8T44761092 for ; Fri, 16 Aug 2013 22:36:57 +0530 Received: from d28av03.in.ibm.com (localhost [127.0.0.1]) by d28av03.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id r7GH701Y002561 for ; Fri, 16 Aug 2013 22:37:00 +0530 Received: from [9.76.40.169] (sig-9-76-40-169.mts.ibm.com [9.76.40.169]) by d28av03.in.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id r7GH6uI3002466; Fri, 16 Aug 2013 22:36:58 +0530 Subject: [PATCH, rs6000, generic builtins] Fix unary TDmode patterns and add DFP ABS builtins From: Peter Bergner To: "gcc-patches@gcc.gnu.org" Cc: David Edelsohn Date: Fri, 16 Aug 2013 12:06:56 -0500 Message-ID: <1376672816.5807.8.camel@otta> Mime-Version: 1.0 X-TM-AS-MML: No X-Content-Scanned: Fidelis XPS MAILER x-cbid: 13081616-9574-0000-0000-000009368B3A The following patch fixes a bug in the rs6000 DFP handling of some _Decimal128 patterns, namely the unary patterns neg, abs and nabs. These patterns use the legacy binary floating point instructions fneg, fabs and fnabs to twiddle the signbit. However, these instructions only operate on the first register in the even/odd register pair, so for destiniation and source operands that do not overlap, the destination's odd register will be left uninitialized. This patch fixes that. I also noticed there is no current way for the ABS and NABS patterns to be generated, so I created some generic builtins so they can be. I have also created testcases to verify we generate correct code. This bootstrapped and regtested with no regressions. Is this ok for trunk? David, since this is a bad code generation bug, is it ok to backport just the *negtd2_fpr portion of the patch to the open release branches? Peter gcc/ * builtins.def (BUILT_IN_FABSD32): New DFP ABS builtin. (BUILT_IN_FABSD64): Likewise. (BUILT_IN_FABSD128): Likewise. * builtins.c (expand_builtin): Add support for new DFP ABS builtins. (fold_builtin_1): Likewise. * config/rs6000/dfp.md (*negtd2_fpr): Handle non-overlapping destination and source operands. (*abstd2_fpr): Likewise. (*nabstd2_fpr): Likewise. gcc/testsuite/ * gcc.target/powerpc/dfp-dd-2.c: New test. * gcc.target/powerpc/dfp-td-2.c: Likewise. Index: gcc/builtins.c =================================================================== --- gcc/builtins.c (revision 201779) +++ gcc/builtins.c (working copy) @@ -5865,6 +5865,9 @@ expand_builtin (tree exp, rtx target, rt switch (fcode) { CASE_FLT_FN (BUILT_IN_FABS): + case BUILT_IN_FABSD32: + case BUILT_IN_FABSD64: + case BUILT_IN_FABSD128: target = expand_builtin_fabs (exp, target, subtarget); if (target) return target; @@ -10314,6 +10317,9 @@ fold_builtin_1 (location_t loc, tree fnd return fold_builtin_strlen (loc, type, arg0); CASE_FLT_FN (BUILT_IN_FABS): + case BUILT_IN_FABSD32: + case BUILT_IN_FABSD64: + case BUILT_IN_FABSD128: return fold_builtin_fabs (loc, arg0, type); case BUILT_IN_ABS: Index: gcc/builtins.def =================================================================== --- gcc/builtins.def (revision 201779) +++ gcc/builtins.def (working copy) @@ -257,6 +257,9 @@ DEF_C99_BUILTIN (BUILT_IN_EXPM1L, DEF_LIB_BUILTIN (BUILT_IN_FABS, "fabs", BT_FN_DOUBLE_DOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST) DEF_C99_C90RES_BUILTIN (BUILT_IN_FABSF, "fabsf", BT_FN_FLOAT_FLOAT, ATTR_CONST_NOTHROW_LEAF_LIST) DEF_C99_C90RES_BUILTIN (BUILT_IN_FABSL, "fabsl", BT_FN_LONGDOUBLE_LONGDOUBLE, ATTR_CONST_NOTHROW_LEAF_LIST) +DEF_GCC_BUILTIN (BUILT_IN_FABSD32, "fabsd32", BT_FN_DFLOAT32_DFLOAT32, ATTR_CONST_NOTHROW_LEAF_LIST) +DEF_GCC_BUILTIN (BUILT_IN_FABSD64, "fabsd64", BT_FN_DFLOAT64_DFLOAT64, ATTR_CONST_NOTHROW_LEAF_LIST) +DEF_GCC_BUILTIN (BUILT_IN_FABSD128, "fabsd128", BT_FN_DFLOAT128_DFLOAT128, ATTR_CONST_NOTHROW_LEAF_LIST) DEF_C99_BUILTIN (BUILT_IN_FDIM, "fdim", BT_FN_DOUBLE_DOUBLE_DOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO) DEF_C99_BUILTIN (BUILT_IN_FDIMF, "fdimf", BT_FN_FLOAT_FLOAT_FLOAT, ATTR_MATHFN_FPROUNDING_ERRNO) DEF_C99_BUILTIN (BUILT_IN_FDIML, "fdiml", BT_FN_LONGDOUBLE_LONGDOUBLE_LONGDOUBLE, ATTR_MATHFN_FPROUNDING_ERRNO) Index: gcc/config/rs6000/dfp.md =================================================================== --- gcc/config/rs6000/dfp.md (revision 201779) +++ gcc/config/rs6000/dfp.md (working copy) @@ -135,8 +135,15 @@ (define_insn "*negtd2_fpr" [(set (match_operand:TD 0 "gpc_reg_operand" "=d") (neg:TD (match_operand:TD 1 "gpc_reg_operand" "d")))] "TARGET_HARD_FLOAT && TARGET_FPRS" - "fneg %0,%1" - [(set_attr "type" "fp")]) + "* +{ + if (REGNO (operands[0]) == REGNO (operands[1])) + return \"fneg %0,%1\"; + else + return \"fneg %0,%1\;fmr %L0,%L1\"; +}" + [(set_attr "type" "fp") + (set_attr "length" "8")]) (define_expand "abstd2" [(set (match_operand:TD 0 "gpc_reg_operand" "") @@ -148,15 +155,29 @@ (define_insn "*abstd2_fpr" [(set (match_operand:TD 0 "gpc_reg_operand" "=d") (abs:TD (match_operand:TD 1 "gpc_reg_operand" "d")))] "TARGET_HARD_FLOAT && TARGET_FPRS" - "fabs %0,%1" - [(set_attr "type" "fp")]) + "* +{ + if (REGNO (operands[0]) == REGNO (operands[1])) + return \"fabs %0,%1\"; + else + return \"fabs %0,%1\;fmr %L0,%L1\"; +}" + [(set_attr "type" "fp") + (set_attr "length" "8")]) (define_insn "*nabstd2_fpr" [(set (match_operand:TD 0 "gpc_reg_operand" "=d") (neg:TD (abs:TD (match_operand:TD 1 "gpc_reg_operand" "d"))))] "TARGET_HARD_FLOAT && TARGET_FPRS" - "fnabs %0,%1" - [(set_attr "type" "fp")]) + "* +{ + if (REGNO (operands[0]) == REGNO (operands[1])) + return \"fnabs %0,%1\"; + else + return \"fnabs %0,%1\;fmr %L0,%L1\"; +}" + [(set_attr "type" "fp") + (set_attr "length" "8")]) ;; Hardware support for decimal floating point operations. Index: gcc/testsuite/gcc.target/powerpc/dfp-dd-2.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/dfp-dd-2.c (revision 0) +++ gcc/testsuite/gcc.target/powerpc/dfp-dd-2.c (revision 0) @@ -0,0 +1,26 @@ +/* Test generation of DFP instructions for POWER6. */ +/* { dg-do compile { target { powerpc*-*-linux* && powerpc_fprs } } } */ +/* { dg-options "-std=gnu99 -O1 -mcpu=power6" } */ + +/* { dg-final { scan-assembler-times "fneg" 1 } } */ +/* { dg-final { scan-assembler-times "fabs" 1 } } */ +/* { dg-final { scan-assembler-times "fnabs" 1 } } */ +/* { dg-final { scan-assembler-times "fmr" 0 } } */ + +_Decimal64 +func1 (_Decimal64 a, _Decimal64 b) +{ + return -b; +} + +_Decimal64 +func2 (_Decimal64 a, _Decimal64 b) +{ + return __builtin_fabsd64 (b); +} + +_Decimal64 +func3 (_Decimal64 a, _Decimal64 b) +{ + return - __builtin_fabsd64 (b); +} Index: gcc/testsuite/gcc.target/powerpc/dfp-td-2.c =================================================================== --- gcc/testsuite/gcc.target/powerpc/dfp-td-2.c (revision 0) +++ gcc/testsuite/gcc.target/powerpc/dfp-td-2.c (revision 0) @@ -0,0 +1,26 @@ +/* Test generation of DFP instructions for POWER6. */ +/* { dg-do compile { target { powerpc*-*-linux* && powerpc_fprs } } } */ +/* { dg-options "-std=gnu99 -O1 -mcpu=power6" } */ + +/* { dg-final { scan-assembler-times "fneg" 1 } } */ +/* { dg-final { scan-assembler-times "fabs" 1 } } */ +/* { dg-final { scan-assembler-times "fnabs" 1 } } */ +/* { dg-final { scan-assembler-times "fmr" 3 } } */ + +_Decimal128 +func1 (_Decimal128 a, _Decimal128 b) +{ + return -b; +} + +_Decimal128 +func2 (_Decimal128 a, _Decimal128 b) +{ + return __builtin_fabsd128 (b); +} + +_Decimal128 +func3 (_Decimal128 a, _Decimal128 b) +{ + return - __builtin_fabsd128 (b); +}