From patchwork Mon Dec 8 14:18:06 2014 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Segher Boessenkool X-Patchwork-Id: 418710 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.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id EB41E1400DD for ; Tue, 9 Dec 2014 01:48:01 +1100 (AEDT) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:from :to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; q=dns; s=default; b=Z1Yd2hZIoHoT48wKHlK FgcgOPNMterU9gxbgkFp3++4OWtCRBQRc110KO7M8nNRV1VlKck/W2kcdl0DE5m0 qEiDqQNJQ+/6mh54WzCe/aT1cnEEgbbBHQjxXMoicbc6QNmZEASZxoSEUtf5uhJq RhWXVuUG1Zti2tSPqfTF+rro= 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:from :to:cc:subject:date:message-id:in-reply-to:references :in-reply-to:references; s=default; bh=Nl2iIUTjr9DLn0Fc5lPi020oM p0=; b=XQkdnu7JZYQUDqo76wgfWk4j5iCkbxXEIJawBAPEQaKGQpV4SwTqyF+bJ EI0QTpu60WDjq+VHvlHYViUn3CpmAvjnYN+IjcmaHITRh1JN6NrVx5daXof1evFC AC4bUvXD0twGSU3DgtYXPY2mzcyqmWNaUK3Qg4F6QIPaglcZ54= Received: (qmail 25064 invoked by alias); 8 Dec 2014 14:47:21 -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 24974 invoked by uid 89); 8 Dec 2014 14:47:20 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL, BAYES_00, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-HELO: gcc1-power7.osuosl.org Received: from gcc1-power7.osuosl.org (HELO gcc1-power7.osuosl.org) (140.211.15.137) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Mon, 08 Dec 2014 14:47:18 +0000 Received: from gcc1-power7.osuosl.org (localhost [127.0.0.1]) by gcc1-power7.osuosl.org (8.14.6/8.14.6) with ESMTP id sB8EIMaB032952; Mon, 8 Dec 2014 06:18:22 -0800 Received: (from segher@localhost) by gcc1-power7.osuosl.org (8.14.6/8.14.6/Submit) id sB8EIM67032936; Mon, 8 Dec 2014 06:18:22 -0800 From: Segher Boessenkool To: gcc-patches@gcc.gnu.org Cc: dje.gcc@gmail.com, Segher Boessenkool Subject: [PATCH 05/10] rs6000: Merge and split add and addic Date: Mon, 8 Dec 2014 06:18:06 -0800 Message-Id: <5040a30a8ebf2c1a11fb69e5467478c44fa069c3.1418024189.git.segher@kernel.crashing.org> In-Reply-To: References: In-Reply-To: References: X-IsSubscribed: yes This splits the addic patterns from the add/addi patterns, and merges the insns and splitters. Also change type "compare" to "add" for "addic." (the dot form). 2014-12-08 Segher Boessenkool gcc/ PR target/64180 * config/rs6000/rs6000.md (*add3_internal1): Rename to "*add3". (*add3_internal2, *add3_internal3, and (their splitters): Delete. (*add3_dot, *add3_dot2): New. (*add3_imm_dot, *add3_imm_dot2): New. --- gcc/config/rs6000/rs6000.md | 119 +++++++++++++++++++++++++++----------------- 1 file changed, 74 insertions(+), 45 deletions(-) diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index 1647f8b..dcdb7c1 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -1491,7 +1491,7 @@ (define_expand "add3" } }) -(define_insn "*add3_internal1" +(define_insn "*add3" [(set (match_operand:GPR 0 "gpc_reg_operand" "=r,r,r") (plus:GPR (match_operand:GPR 1 "gpc_reg_operand" "%r,b,b") (match_operand:GPR 2 "add_operand" "r,I,L")))] @@ -1510,70 +1510,99 @@ (define_insn "addsi3_high" "addis %0,%1,ha16(%2)" [(set_attr "type" "add")]) -(define_insn "*add3_internal2" - [(set (match_operand:CC 0 "cc_reg_operand" "=x,x,?y,?y") - (compare:CC (plus:P (match_operand:P 1 "gpc_reg_operand" "%r,r,r,r") - (match_operand:P 2 "reg_or_short_operand" "r,I,r,I")) +(define_insn_and_split "*add3_dot" + [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y") + (compare:CC (plus:GPR (match_operand:GPR 1 "gpc_reg_operand" "r,r") + (match_operand:GPR 2 "gpc_reg_operand" "r,r")) (const_int 0))) - (clobber (match_scratch:P 3 "=r,r,r,r"))] - "" + (clobber (match_scratch:GPR 0 "=r,r"))] + "mode == Pmode" "@ - add. %3,%1,%2 - addic. %3,%1,%2 - # + add. %0,%1,%2 #" - [(set_attr "type" "add,compare,compare,compare") + "&& reload_completed && cc_reg_not_cr0_operand (operands[3], CCmode)" + [(set (match_dup 0) + (plus:GPR (match_dup 1) + (match_dup 2))) + (set (match_dup 3) + (compare:CC (match_dup 0) + (const_int 0)))] + "" + [(set_attr "type" "add") (set_attr "dot" "yes") - (set_attr "length" "4,4,8,8")]) + (set_attr "length" "4,8")]) -(define_split - [(set (match_operand:CC 0 "cc_reg_not_cr0_operand" "") - (compare:CC (plus:GPR (match_operand:GPR 1 "gpc_reg_operand" "") - (match_operand:GPR 2 "reg_or_short_operand" "")) +(define_insn_and_split "*add3_dot2" + [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y") + (compare:CC (plus:GPR (match_operand:GPR 1 "gpc_reg_operand" "r,r") + (match_operand:GPR 2 "gpc_reg_operand" "r,r")) (const_int 0))) - (clobber (match_scratch:GPR 3 ""))] - "reload_completed" - [(set (match_dup 3) + (set (match_operand:GPR 0 "gpc_reg_operand" "=r,r") (plus:GPR (match_dup 1) - (match_dup 2))) - (set (match_dup 0) - (compare:CC (match_dup 3) + (match_dup 2)))] + "mode == Pmode" + "@ + add. %0,%1,%2 + #" + "&& reload_completed && cc_reg_not_cr0_operand (operands[3], CCmode)" + [(set (match_dup 0) + (plus:GPR (match_dup 1) + (match_dup 2))) + (set (match_dup 3) + (compare:CC (match_dup 0) (const_int 0)))] - "") + "" + [(set_attr "type" "add") + (set_attr "dot" "yes") + (set_attr "length" "4,8")]) -(define_insn "*add3_internal3" - [(set (match_operand:CC 3 "cc_reg_operand" "=x,x,?y,?y") - (compare:CC (plus:P (match_operand:P 1 "gpc_reg_operand" "%r,r,r,r") - (match_operand:P 2 "reg_or_short_operand" "r,I,r,I")) +(define_insn_and_split "*add3_imm_dot" + [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y") + (compare:CC (plus:GPR (match_operand:GPR 1 "gpc_reg_operand" "%r,r") + (match_operand:GPR 2 "short_cint_operand" "I,I")) (const_int 0))) - (set (match_operand:P 0 "gpc_reg_operand" "=r,r,r,r") - (plus:P (match_dup 1) - (match_dup 2)))] - "" + (clobber (match_scratch:GPR 0 "=r,r")) + (clobber (reg:GPR CA_REGNO))] + "mode == Pmode" "@ - add. %0,%1,%2 addic. %0,%1,%2 - # #" - [(set_attr "type" "add,compare,compare,compare") + "&& reload_completed && cc_reg_not_cr0_operand (operands[3], CCmode)" + [(set (match_dup 0) + (plus:GPR (match_dup 1) + (match_dup 2))) + (set (match_dup 3) + (compare:CC (match_dup 0) + (const_int 0)))] + "" + [(set_attr "type" "add") (set_attr "dot" "yes") - (set_attr "length" "4,4,8,8")]) + (set_attr "length" "4,8")]) -(define_split - [(set (match_operand:CC 3 "cc_reg_not_cr0_operand" "") - (compare:CC (plus:P (match_operand:P 1 "gpc_reg_operand" "") - (match_operand:P 2 "reg_or_short_operand" "")) +(define_insn_and_split "*add3_imm_dot2" + [(set (match_operand:CC 3 "cc_reg_operand" "=x,?y") + (compare:CC (plus:GPR (match_operand:GPR 1 "gpc_reg_operand" "%r,r") + (match_operand:GPR 2 "short_cint_operand" "I,I")) (const_int 0))) - (set (match_operand:P 0 "gpc_reg_operand" "") - (plus:P (match_dup 1) (match_dup 2)))] - "reload_completed" + (set (match_operand:GPR 0 "gpc_reg_operand" "=r,r") + (plus:GPR (match_dup 1) + (match_dup 2))) + (clobber (reg:GPR CA_REGNO))] + "mode == Pmode" + "@ + addic. %0,%1,%2 + #" + "&& reload_completed && cc_reg_not_cr0_operand (operands[3], CCmode)" [(set (match_dup 0) - (plus:P (match_dup 1) - (match_dup 2))) + (plus:GPR (match_dup 1) + (match_dup 2))) (set (match_dup 3) (compare:CC (match_dup 0) (const_int 0)))] - "") + "" + [(set_attr "type" "add") + (set_attr "dot" "yes") + (set_attr "length" "4,8")]) ;; Split an add that we can't do in one insn into two insns, each of which ;; does one 16-bit part. This is used by combine. Note that the low-order