From patchwork Tue Apr 30 07:20:08 2024 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: HAO CHEN GUI X-Patchwork-Id: 89166 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id BE1F4384AB48 for ; Tue, 30 Apr 2024 07:20:50 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mx0a-001b2d01.pphosted.com (mx0a-001b2d01.pphosted.com [148.163.156.1]) by sourceware.org (Postfix) with ESMTPS id 550A1384AB4E for ; Tue, 30 Apr 2024 07:20:19 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 550A1384AB4E Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=linux.ibm.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=linux.ibm.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 550A1384AB4E Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=148.163.156.1 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1714461622; cv=none; b=jVom5CX4MW11XxakTxNGatauNi9Up2xZFVAKBAC4GcdKMN/iaa9MqaKe37EnRk1VMMfj48BKG9SfCV3oD/p6cSlPKBLvIKZeqvxpacN1cPP8Noi3UI+iwHi16slNqicRT/8XGP9AfqY/P/8TtFNUr0+kYZ1k0vcS66efWhT9kIw= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1714461622; c=relaxed/simple; bh=raVj1p8nERn0GT//DxBGvu2iIwp6g667cYwORYKO1tw=; h=DKIM-Signature:Message-ID:Date:MIME-Version:To:From:Subject; b=rsCXKX+/nWBDhnalSZANi4VYHUCXZS//ksPSR/aJ4/0Ynub0678cGSWI1h75cqcfEu/c0WUkhWvlCc0Ot6Z7I0LxzzRX4xlLjpGWZvfapkxcVqrDIrOmz/ThQhLefos5SOINoaCjNcjGkLdlUf10VSU52Xps8nmqm+WOZ8wvun0= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from pps.filterd (m0353726.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 43U70qQQ026251; Tue, 30 Apr 2024 07:20:18 GMT DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=ibm.com; h=message-id : date : mime-version : to : cc : from : subject : content-type : content-transfer-encoding; s=pp1; bh=AbGDNoufaDuW7wQ3fz2N+UrN/8YpxY6nrquL2heuwrw=; b=EphfoCtl6C63dilonpz8Du9c8+zrgbNFGzmmPs08EwmivQwtE0WuN7glHb0gCVQI1d/x MihLEfW1r9yCMO1GfekjmvUGSJ1G+/kV5iWj6dNC/FLapyoqIon8MrdKFq4zlPTzsUvk 2b2KG6BeWaaC8uZ04YysNcrP8js/CwUOVKItHuWijz4CwSoqlq6rnPo+k4PLVweIzW0l BYYbc+zxihdUHwF6A3fN2N/5MnjX2kUs0v1OWRZ89U8A/K5GwfNRrXmixGT0GUUFF0ZE CqPU+wW1/0Q2+rP+BzeKrpIoQFSUsC2SioQQ2ejGR3rk0omZcKfsGr8ciq0uaN+S1bdh hg== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3xtucv83xr-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 30 Apr 2024 07:20:17 +0000 Received: from m0353726.ppops.net (m0353726.ppops.net [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 43U7KHf5027396; Tue, 30 Apr 2024 07:20:17 GMT Received: from ppma13.dal12v.mail.ibm.com (dd.9e.1632.ip4.static.sl-reverse.com [50.22.158.221]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3xtucv83xn-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 30 Apr 2024 07:20:17 +0000 Received: from pps.filterd (ppma13.dal12v.mail.ibm.com [127.0.0.1]) by ppma13.dal12v.mail.ibm.com (8.17.1.19/8.17.1.19) with ESMTP id 43U3VnG9011730; Tue, 30 Apr 2024 07:20:16 GMT Received: from smtprelay05.fra02v.mail.ibm.com ([9.218.2.225]) by ppma13.dal12v.mail.ibm.com (PPS) with ESMTPS id 3xsdwm3eng-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 30 Apr 2024 07:20:16 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay05.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 43U7KBKt40108400 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 30 Apr 2024 07:20:13 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1B66820063; Tue, 30 Apr 2024 07:20:11 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id AF30C2004E; Tue, 30 Apr 2024 07:20:09 +0000 (GMT) Received: from [9.200.103.244] (unknown [9.200.103.244]) by smtpav06.fra02v.mail.ibm.com (Postfix) with ESMTP; Tue, 30 Apr 2024 07:20:09 +0000 (GMT) Message-ID: Date: Tue, 30 Apr 2024 15:20:08 +0800 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Content-Language: en-US To: gcc-patches Cc: Segher Boessenkool , David , "Kewen.Lin" , Peter Bergner From: HAO CHEN GUI Subject: [PATCH-4, rs6000] Optimize single cc bit reverse implementation X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: lrVpjjmWMGps5TOSocIHJ7vCj1Ydjk54 X-Proofpoint-GUID: 1PshDtWZigb2GIXcY4o1AIoJOnEm4bI7 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.293,Aquarius:18.0.1011,Hydra:6.0.650,FMLib:17.11.176.26 definitions=2024-04-30_03,2024-04-29_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 mlxlogscore=999 clxscore=1015 bulkscore=0 adultscore=0 lowpriorityscore=0 suspectscore=0 impostorscore=0 priorityscore=1501 mlxscore=0 malwarescore=0 spamscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2404010000 definitions=main-2404300052 X-Spam-Status: No, score=-12.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gcc-patches-bounces+patchwork=sourceware.org@gcc.gnu.org Hi, It's the forth patch of a series of patches optimizing CC modes on rs6000. The single CC bit reverse can be implemented by setbcr on Power10 or isel on Power9 or mfcr on Power8 and below. Originally CCFP is not supported for isel and setbcr as bcd insns use CCFP and its bit reverse is not the same as normal CCFP mode. Previous patches add new CC modes according to the usage of CC bits. So now single CC bit reverse can be supported on all CC modes with a uniform pattern. This patch removes unordered and ordered from codes list of CCFP with finite_math_only set. These two are no needed as bcd insns use a separate CC mode now. reverse_condition is replaced with rs6000_reverse_condition as all CC modes can be reversed. A new isel version single CC bit reverse pattern is added. fp and bcd CC reverse pattern are removed and a uniform single CC bit reverse pattern is added, which is mfcr version. The new test cases illustrate the different implementation of single cc bit reverse test. Bootstrapped and tested on powerpc64-linux BE and LE with no regressions. Is it OK for the trunk? Thanks Gui Haochen ChangeLog rs6000: Optimize single cc bit reverse implementation This patch implements single cc bit reverse by mfcr (on Power8 and below) or isel (on Power9) or setbcr (on Power10) with all CC modes. gcc/ * config/rs6000/predicates.md (branch_comparison_operator): Remove unordered and ordered from CCFP with finite_math_only. (scc_comparison_operator): Add unle and unge. * config/rs6000/rs6000.md (CCANY): Add CCFP, CCBCD, CCLTEQ and CCEQ. (*isel_reversed__): Replace reverse_condition with rs6000_reverse_condition. (*set_rev): New insn_and_split pattern for single cc bit reverse P9 version. (fp_rev, ccbcd_rev): Remove. (*_cc): Remove the pattern for CCFP and CCBCD. Merge them to... (*set_rev): ...this, the new insn_and_split pattern for single cc bit reverse P8 and below version. gcc/testsuite/ * gcc.target/powerpc/cc_rev.h: New. * gcc.target/powerpc/cc_rev_1.c: New. * gcc.target/powerpc/cc_rev_2.c: New. * gcc.target/powerpc/cc_rev_3.c: New. patch.diff diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md index 322e7639fd4..ddb46799bff 100644 --- a/gcc/config/rs6000/predicates.md +++ b/gcc/config/rs6000/predicates.md @@ -1348,7 +1348,7 @@ (define_predicate "branch_comparison_operator" (match_test "GET_MODE_CLASS (GET_MODE (XEXP (op, 0))) == MODE_CC") (if_then_else (match_test "GET_MODE (XEXP (op, 0)) == CCFPmode") (if_then_else (match_test "flag_finite_math_only") - (match_code "lt,le,gt,ge,eq,ne,unordered,ordered") + (match_code "lt,le,gt,ge,eq,ne") (match_code "lt,gt,eq,unordered,unge,unle,ne,ordered")) (if_then_else (match_test "GET_MODE (XEXP (op, 0)) == CCBCDmode") (match_code "lt,le,gt,ge,eq,ne,unordered,ordered") @@ -1397,7 +1397,7 @@ (define_predicate "scc_comparison_operator" ;; an SCC insn. (define_predicate "scc_rev_comparison_operator" (and (match_operand 0 "branch_comparison_operator") - (match_code "ne,le,ge,leu,geu,ordered"))) + (match_code "ne,le,ge,leu,geu,ordered,unle,unge"))) ;; Return 1 if OP is a comparison operator suitable for floating point ;; vector/scalar comparisons that generate a -1/0 mask. diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index 2c6255395d1..ccf392b6409 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -5509,7 +5509,7 @@ (define_expand "movcc" ;; leave out the mode in operand 4 and use one pattern, but reload can ;; change the mode underneath our feet and then gets confused trying ;; to reload the value. -(define_mode_iterator CCANY [CC CCUNS]) +(define_mode_iterator CCANY [CC CCUNS CCFP CCBCD CCLTEQ CCEQ]) (define_insn "isel__" [(set (match_operand:GPR 0 "gpc_reg_operand" "=r,r") (if_then_else:GPR @@ -5536,7 +5536,8 @@ (define_insn "*isel_reversed__" (match_operand:GPR 3 "reg_or_zero_operand" "O,b")))] "TARGET_ISEL" { - PUT_CODE (operands[1], reverse_condition (GET_CODE (operands[1]))); + PUT_CODE (operands[1], rs6000_reverse_condition (mode, + GET_CODE (operands[1]))); return "isel %0,%3,%2,%j1"; } [(set_attr "type" "isel")]) @@ -12764,6 +12765,27 @@ (define_insn "set_cc" (const_string "mfcr"))) (set_attr "length" "8")]) +(define_insn_and_split "*set_rev" + [(set (match_operand:GPR 0 "gpc_reg_operand" "=r") + (match_operator:GPR 1 "scc_rev_comparison_operator" + [(match_operand:CCANY 2 "cc_reg_operand" "y") + (const_int 0)]))] + "TARGET_ISEL + && !TARGET_POWER10" + "#" + "&& 1" + [(set (match_dup 2) + (const_int 1)) + (set (match_dup 0) + (if_then_else:GPR + (match_dup 1) + (match_dup 2) + (const_int 0)))] +{ + operands[2] = can_create_pseudo_p () + ? operands[0] : gen_reg_rtx (mode); +} + [(set_attr "type" "isel")]) (define_code_iterator cmp [eq ne lt ltu gt gtu le leu ge geu]) (define_code_attr UNS [(eq "CC") @@ -13243,42 +13265,25 @@ (define_insn_and_split "*nesi3_ext" (const_string "16")))]) -(define_code_iterator fp_rev [ordered ne unle unge]) (define_code_iterator fp_two [ltgt le ge unlt ungt uneq]) -(define_code_iterator ccbcd_rev [ordered ne le ge]) -(define_insn_and_split "*_cc" +(define_insn_and_split "*set_rev" [(set (match_operand:GPR 0 "gpc_reg_operand" "=r") - (fp_rev:GPR (match_operand:CCFP 1 "cc_reg_operand" "y") - (const_int 0)))] - "!flag_finite_math_only" - "#" - "&& 1" - [(pc)] -{ - rtx_code revcode = reverse_condition_maybe_unordered (); - rtx eq = gen_rtx_fmt_ee (revcode, mode, operands[1], const0_rtx); - rtx tmp = gen_reg_rtx (mode); - emit_move_insn (tmp, eq); - emit_insn (gen_xor3 (operands[0], tmp, const1_rtx)); - DONE; -} - [(set_attr "length" "12")]) - -(define_insn_and_split "*_cc" - [(set (match_operand:GPR 0 "gpc_reg_operand" "=r") - (ccbcd_rev:GPR (match_operand:CCBCD 1 "cc_reg_operand" "y") - (const_int 0)))] - "" + (match_operator:GPR 1 "scc_rev_comparison_operator" + [(match_operand:CCANY 2 "cc_reg_operand" "y") + (const_int 0)]))] + "!TARGET_ISEL + && !TARGET_POWER10" "#" "&& 1" [(pc)] { - rtx_code revcode = reverse_condition (); - rtx eq = gen_rtx_fmt_ee (revcode, mode, operands[1], const0_rtx); - rtx tmp = gen_reg_rtx (mode); + rtx_code revcode = rs6000_reverse_condition (mode, + GET_CODE (operands[1])); + rtx eq = gen_rtx_fmt_ee (revcode, mode, operands[2], const0_rtx); + rtx tmp = gen_reg_rtx (mode); emit_move_insn (tmp, eq); - emit_insn (gen_xor3 (operands[0], tmp, const1_rtx)); + emit_insn (gen_xor3 (operands[0], tmp, const1_rtx)); DONE; } [(set_attr "length" "12")]) diff --git a/gcc/testsuite/gcc.target/powerpc/cc_rev.h b/gcc/testsuite/gcc.target/powerpc/cc_rev.h new file mode 100644 index 00000000000..777718a8546 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/cc_rev.h @@ -0,0 +1,11 @@ +#include + +int test1 (vector unsigned char a, vector unsigned char b) +{ + return __builtin_bcdcmpge (a, b); +} + +int test2 (vector unsigned char a, vector unsigned char b) +{ + return __builtin_bcdcmple (a, b); +} diff --git a/gcc/testsuite/gcc.target/powerpc/cc_rev_1.c b/gcc/testsuite/gcc.target/powerpc/cc_rev_1.c new file mode 100644 index 00000000000..b1125531e9d --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/cc_rev_1.c @@ -0,0 +1,7 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target powerpc_vsx_ok } */ +/* { dg-options "-mdejagnu-cpu=power8 -O2" } */ +/* { dg-final { scan-assembler-times {\mmfcr\M} 2 } } */ +/* { dg-final { scan-assembler-times {\mxori\M} 2 } } */ + +#include "cc_rev.h" diff --git a/gcc/testsuite/gcc.target/powerpc/cc_rev_2.c b/gcc/testsuite/gcc.target/powerpc/cc_rev_2.c new file mode 100644 index 00000000000..5938cedf230 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/cc_rev_2.c @@ -0,0 +1,6 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target powerpc_vsx_ok } */ +/* { dg-options "-mdejagnu-cpu=power9 -O2" } */ +/* { dg-final { scan-assembler-times {\misel\M} 2 } } */ + +#include "cc_rev.h" diff --git a/gcc/testsuite/gcc.target/powerpc/cc_rev_3.c b/gcc/testsuite/gcc.target/powerpc/cc_rev_3.c new file mode 100644 index 00000000000..954ecf0586f --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/cc_rev_3.c @@ -0,0 +1,6 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target powerpc_vsx_ok } */ +/* { dg-options "-mdejagnu-cpu=power10 -O2" } */ +/* { dg-final { scan-assembler-times {\msetbcr\M} 2 } } */ + +#include "cc_rev.h"