From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by sourceware.org (Postfix) with ESMTP id 6CD2C385DC01 for ; Tue, 31 Mar 2020 18:34:22 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.3.2 sourceware.org 6CD2C385DC01 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=arm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=richard.sandiford@arm.com Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id E9BA730E; Tue, 31 Mar 2020 11:34:21 -0700 (PDT) Received: from localhost (e121540-lin.manchester.arm.com [10.32.98.126]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 04E913F68F; Tue, 31 Mar 2020 11:34:20 -0700 (PDT) From: Richard Sandiford To: Richard Henderson Mail-Followup-To: Richard Henderson , gcc-patches@gcc.gnu.org, richard.earnshaw@arm.com, marcus.shawcroft@arm.com, kyrylo.tkachov@arm.com, Wilco.Dijkstra@arm.com, richard.sandiford@arm.com Cc: gcc-patches@gcc.gnu.org, richard.earnshaw@arm.com, marcus.shawcroft@arm.com, kyrylo.tkachov@arm.com, Wilco.Dijkstra@arm.com Subject: Re: [PATCH v2 3/9] aarch64: Add cmp_*_carryinC patterns References: <20200321024231.13778-1-richard.henderson@linaro.org> <20200321024231.13778-4-richard.henderson@linaro.org> Date: Tue, 31 Mar 2020 19:34:19 +0100 In-Reply-To: <20200321024231.13778-4-richard.henderson@linaro.org> (Richard Henderson's message of "Fri, 20 Mar 2020 19:42:25 -0700") Message-ID: User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/26.1 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain X-Spam-Status: No, score=-28.8 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, KAM_DMARC_STATUS, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.2 X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 31 Mar 2020 18:34:23 -0000 Richard Henderson writes: > Duplicate all usub_*_carryinC, but use xzr for the output when we > only require the flags output. The signed versions use sign_extend > instead of zero_extend for combine's benefit. > > These will be used shortly for TImode comparisons. > > * config/aarch64/aarch64.md (cmp3_carryinC): New. > (*cmp3_carryinC_z1): New. > (*cmp3_carryinC_z2): New. > (*cmp3_carryinC): New. > --- > gcc/config/aarch64/aarch64.md | 50 +++++++++++++++++++++++++++++++++++ > 1 file changed, 50 insertions(+) > > diff --git a/gcc/config/aarch64/aarch64.md b/gcc/config/aarch64/aarch64.md > index a996a5f1c39..9b1c3f797f9 100644 > --- a/gcc/config/aarch64/aarch64.md > +++ b/gcc/config/aarch64/aarch64.md > @@ -3440,6 +3440,18 @@ > "" > ) > > +(define_expand "cmp3_carryinC" > + [(set (reg:CC CC_REGNUM) > + (compare:CC > + (ANY_EXTEND: > + (match_operand:GPI 0 "register_operand")) > + (plus: > + (ANY_EXTEND: > + (match_operand:GPI 1 "register_operand")) > + (ltu: (reg:CC CC_REGNUM) (const_int 0)))))] > + "" > +) > (define_insn "*usub3_carryinC_z1" > [(set (reg:CC CC_REGNUM) > (compare:CC > @@ -3457,6 +3469,19 @@ > [(set_attr "type" "adc_reg")] > ) > > +(define_insn "*cmp3_carryinC_z1" > + [(set (reg:CC CC_REGNUM) > + (compare:CC > + (const_int 0) > + (plus: > + (ANY_EXTEND: > + (match_operand:GPI 0 "register_operand" "r")) > + (match_operand: 1 "aarch64_borrow_operation" ""))))] > + "" > + "sbcs\\tzr, zr, %0" > + [(set_attr "type" "adc_reg")] > +) > + > (define_insn "*usub3_carryinC_z2" > [(set (reg:CC CC_REGNUM) > (compare:CC > @@ -3472,6 +3497,17 @@ > [(set_attr "type" "adc_reg")] > ) > > +(define_insn "*cmp3_carryinC_z2" > + [(set (reg:CC CC_REGNUM) > + (compare:CC > + (ANY_EXTEND: > + (match_operand:GPI 0 "register_operand" "r")) > + (match_operand: 1 "aarch64_borrow_operation" "")))] > + "" > + "sbcs\\tzr, %0, zr" > + [(set_attr "type" "adc_reg")] > +) > + > (define_insn "*usub3_carryinC" > [(set (reg:CC CC_REGNUM) > (compare:CC > @@ -3490,6 +3526,20 @@ > [(set_attr "type" "adc_reg")] > ) > > +(define_insn "*cmp3_carryinC" > + [(set (reg:CC CC_REGNUM) > + (compare:CC > + (ANY_EXTEND: > + (match_operand:GPI 0 "register_operand" "r")) > + (plus: > + (ANY_EXTEND: > + (match_operand:GPI 1 "register_operand" "r")) > + (match_operand: 2 "aarch64_borrow_operation" ""))))] > + "" > + "sbcs\\tzr, %0, %1" > + [(set_attr "type" "adc_reg")] > +) I guess this feeds into your reply to Segher's comment for 7/9, but I think: (compare:CC X Y) is always supposed to be the NZCV flags result of X - Y, as computed in the mode of X and Y. If so, it seems like the type of extension should matter. E.g. the N flag ought to be set for: (compare:CC (sign_extend 0xf...) (plus (sign_extend 0x7...) (ltu ...))) but ought to be clear for: (compare:CC (zero_extend 0xf...) (plus (zero_extend 0x7...) (ltu ...))) If so, I guess this is a bug in the existing code... Thanks, Richard