From patchwork Tue Apr 30 07:18:15 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: 1929337 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@legolas.ozlabs.org Authentication-Results: legolas.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=ibm.com header.i=@ibm.com header.a=rsa-sha256 header.s=pp1 header.b=lYihuru9; dkim-atps=neutral Authentication-Results: legolas.ozlabs.org; spf=pass (sender SPF authorized) smtp.mailfrom=gcc.gnu.org (client-ip=2620:52:3:1:0:246e:9693:128c; helo=server2.sourceware.org; envelope-from=gcc-patches-bounces+incoming=patchwork.ozlabs.org@gcc.gnu.org; receiver=patchwork.ozlabs.org) Received: from server2.sourceware.org (server2.sourceware.org [IPv6:2620:52:3:1:0:246e:9693:128c]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (secp384r1) server-digest SHA384) (No client certificate requested) by legolas.ozlabs.org (Postfix) with ESMTPS id 4VTBQ23R95z20fY for ; Tue, 30 Apr 2024 17:18:50 +1000 (AEST) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id A75AE385ED4C for ; Tue, 30 Apr 2024 07:18:47 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mx0b-001b2d01.pphosted.com (mx0b-001b2d01.pphosted.com [148.163.158.5]) by sourceware.org (Postfix) with ESMTPS id CA7DD3858D35 for ; Tue, 30 Apr 2024 07:18:25 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org CA7DD3858D35 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 CA7DD3858D35 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=148.163.158.5 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1714461508; cv=none; b=GYa0+/+5SZlyvcQ1nzF06sV+mTMeyB2A+eWien0baYRXoHHL5p7vfBXqywWLY6fCn74CNUzNnWenh1Vm3iSmnQ8tMvlSfiUpkzHwcZtnYF6UjP//+9ywcOgyeYSRbCIIYS9Sf/uwb6JPEQKhFxdME80666YfQAvhlXoDu79rX4o= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1714461508; c=relaxed/simple; bh=4Hdq7EtPOeDyptGU74vohAYXH8kLpQpP04/vYqxBASU=; h=DKIM-Signature:Message-ID:Date:MIME-Version:To:From:Subject; b=B9Wqfxzo2/U3q2hBNYBjwj9hPd1fjcKbYsLCN09BxzJptXVU9rdpTXFZYK/ZfTaVrD2YNdAy96GJOBfJrMJCF7QT6s3rhbqYkqsOiR/z2DudwfEssTTS2EFSQtFlux1GphSVMQBBTz46yDOJnM5its0mto38fH/seri6xJfaF6U= ARC-Authentication-Results: i=1; server2.sourceware.org Received: from pps.filterd (m0353722.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 43U6wTAu009559; Tue, 30 Apr 2024 07:18:25 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=+ltnLND7XMDqXSf4mBWuzxPmpanRGOcdnaxxtpLXSn4=; b=lYihuru9t0jqQLZCByTDSzhNIhN3a7UrqM6d5AICLqY/HQZsgdjCZGvwt8twqW1IuwOT TfW/Uyo1tuTR6nTfVlSYHCyvFRxuf6Uc63eu17ZCozGNl5DVo8boFsYyncKiw1oyIhWZ 9ZNjvQMGe5HzbiyH/AKFTuF8gf3VZVuujTllEhLW/IMsWCx8oiTt3xkFfAAfVzQO2mpM BKLu0JTyKDSSuM3WyiT5ZKC5gxE1h2mFmCyXKdExbY4ePALya289mWdQ2GJaGVTjW6Or m2eHUuGhppwtB5bijQnuUetG700PaLuF6OlW7NszQINNq6qYEQvkxjIRO/LfKTmjew/h Lw== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3xtuuar1gt-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 30 Apr 2024 07:18:25 +0000 Received: from m0353722.ppops.net (m0353722.ppops.net [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 43U7IOdP008041; Tue, 30 Apr 2024 07:18:24 GMT Received: from ppma22.wdc07v.mail.ibm.com (5c.69.3da9.ip4.static.sl-reverse.com [169.61.105.92]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3xtuuar1gk-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 30 Apr 2024 07:18:24 +0000 Received: from pps.filterd (ppma22.wdc07v.mail.ibm.com [127.0.0.1]) by ppma22.wdc07v.mail.ibm.com (8.17.1.19/8.17.1.19) with ESMTP id 43U5UIpL027580; Tue, 30 Apr 2024 07:18:23 GMT Received: from smtprelay04.fra02v.mail.ibm.com ([9.218.2.228]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 3xsc30bw9h-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Tue, 30 Apr 2024 07:18:23 +0000 Received: from smtpav06.fra02v.mail.ibm.com (smtpav06.fra02v.mail.ibm.com [10.20.54.105]) by smtprelay04.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 43U7IIcS13238752 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Tue, 30 Apr 2024 07:18:20 GMT Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 161792004B; Tue, 30 Apr 2024 07:18:18 +0000 (GMT) Received: from smtpav06.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 99F6720049; Tue, 30 Apr 2024 07:18:16 +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:18:16 +0000 (GMT) Message-ID: <65719e53-d438-45db-b0cb-2829ba6ac7e2@linux.ibm.com> Date: Tue, 30 Apr 2024 15:18:15 +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-1, rs6000] Add a new type of CC mode - CCBCD for bcd insns [PR100736, PR114732] X-TM-AS-GCONF: 00 X-Proofpoint-GUID: f5up_PMF_jCRDfiGku8GoPtp9BFPU7SX X-Proofpoint-ORIG-GUID: ZxkOBIuck60dZRtwft5vXiQ4bUyKhaWt 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 spamscore=0 mlxlogscore=999 mlxscore=0 impostorscore=0 phishscore=0 clxscore=1011 lowpriorityscore=0 priorityscore=1501 adultscore=0 suspectscore=0 malwarescore=0 bulkscore=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+incoming=patchwork.ozlabs.org@gcc.gnu.org Hi, It's the first patch of a series of patches optimizing CC modes on rs6000. bcd insns set all four bits of a CR field. But it has different single bit reverse behavior than CCFP's. The forth bit of bcd cr fields is used to indict overflow or invalid number. It's not a bit for unordered test. So the "le" test should be reversed to "gt" not "ungt". The "ge" test should be reversed to "lt" not "unlt". That's the root cause of PR100736 and PR114732. This patch fixes the issue by adding a new type of CC mode - CCBCD for all bcd insns. Here a new setcc_rev pattern is added for ccbcd. It will be merged to a uniform pattern which is for all CC modes in sequential patch. The rtl code "unordered" is still used for testing overflow or invalid number. IMHO, the "unordered" on a CC mode can be considered as testing the forth bit of a CR field setting or not. The "eq" on a CC mode can be considered as testing the third bit setting or not. Thus we avoid creating lots of unspecs for the CR bit testing. Bootstrapped and tested on powerpc64-linux BE and LE with no regressions. Is it OK for the trunk? Thanks Gui Haochen ChangeLog rs6000: Add a new type of CC mode - CCBCD for bcd insns gcc/ PR target/100736 PR target/114732 * config/rs6000/altivec.md (bcd_): Replace CCFP with CCBCD. (*bcd_test_): Likewise. (*bcd_test2_): Likewise. (bcd__): Likewise. (*bcdinvalid_): Likewise. (bcdinvalid_): Likewise. (bcdshift_v16qi): Likewise. (bcdmul10_v16qi): Likewise. (bcddiv10_v16qi): Likewise. (peephole for bcd_add/sub): Likewise. * config/rs6000/predicates.md (branch_comparison_operator): Add CCBCD and its supported comparison codes. * config/rs6000/rs6000-modes.def (CC_MODE): Add CCBCD. * config/rs6000/rs6000.cc (validate_condition_mode): Add CCBCD assertion. * config/rs6000/rs6000.md (CC_any): Add CCBCD. (ccbcd_rev): New code iterator. (*_cc): New insn and split pattern for CCBCD reverse compare. gcc/testsuite/ PR target/100736 PR target/114732 * gcc.target/powerpc/pr100736.c: New. * gcc.target/powerpc/pr114732.c: New. patch.diff diff --git a/gcc/config/rs6000/altivec.md b/gcc/config/rs6000/altivec.md index bb20441c096..9fa8cf89f61 100644 --- a/gcc/config/rs6000/altivec.md +++ b/gcc/config/rs6000/altivec.md @@ -4443,7 +4443,7 @@ (define_insn "bcd_" (match_operand:VBCD 2 "register_operand" "v") (match_operand:QI 3 "const_0_to_1_operand" "n")] UNSPEC_BCD_ADD_SUB)) - (clobber (reg:CCFP CR6_REGNO))] + (clobber (reg:CCBCD CR6_REGNO))] "TARGET_P8_VECTOR" "bcd. %0,%1,%2,%3" [(set_attr "type" "vecsimple")]) @@ -4454,8 +4454,8 @@ (define_insn "bcd_" ;; probably should be one that can go in the VMX (Altivec) registers, so we ;; can't use DDmode or DFmode. (define_insn "*bcd_test_" - [(set (reg:CCFP CR6_REGNO) - (compare:CCFP + [(set (reg:CCBCD CR6_REGNO) + (compare:CCBCD (unspec:V2DF [(match_operand:VBCD 1 "register_operand" "v") (match_operand:VBCD 2 "register_operand" "v") (match_operand:QI 3 "const_0_to_1_operand" "i")] @@ -4472,8 +4472,8 @@ (define_insn "*bcd_test2_" (match_operand:VBCD 2 "register_operand" "v") (match_operand:QI 3 "const_0_to_1_operand" "i")] UNSPEC_BCD_ADD_SUB)) - (set (reg:CCFP CR6_REGNO) - (compare:CCFP + (set (reg:CCBCD CR6_REGNO) + (compare:CCBCD (unspec:V2DF [(match_dup 1) (match_dup 2) (match_dup 3)] @@ -4566,8 +4566,8 @@ (define_insn "vclrrb" [(set_attr "type" "vecsimple")]) (define_expand "bcd__" - [(parallel [(set (reg:CCFP CR6_REGNO) - (compare:CCFP + [(parallel [(set (reg:CCBCD CR6_REGNO) + (compare:CCBCD (unspec:V2DF [(match_operand:VBCD 1 "register_operand") (match_operand:VBCD 2 "register_operand") (match_operand:QI 3 "const_0_to_1_operand")] @@ -4575,7 +4575,7 @@ (define_expand "bcd__" (match_dup 4))) (clobber (match_scratch:VBCD 5))]) (set (match_operand:SI 0 "register_operand") - (BCD_TEST:SI (reg:CCFP CR6_REGNO) + (BCD_TEST:SI (reg:CCBCD CR6_REGNO) (const_int 0)))] "TARGET_P8_VECTOR" { @@ -4583,8 +4583,8 @@ (define_expand "bcd__" }) (define_insn "*bcdinvalid_" - [(set (reg:CCFP CR6_REGNO) - (compare:CCFP + [(set (reg:CCBCD CR6_REGNO) + (compare:CCBCD (unspec:V2DF [(match_operand:VBCD 1 "register_operand" "v")] UNSPEC_BCDSUB) (match_operand:V2DF 2 "zero_constant" "j"))) @@ -4594,14 +4594,14 @@ (define_insn "*bcdinvalid_" [(set_attr "type" "vecsimple")]) (define_expand "bcdinvalid_" - [(parallel [(set (reg:CCFP CR6_REGNO) - (compare:CCFP + [(parallel [(set (reg:CCBCD CR6_REGNO) + (compare:CCBCD (unspec:V2DF [(match_operand:VBCD 1 "register_operand")] UNSPEC_BCDSUB) (match_dup 2))) (clobber (match_scratch:VBCD 3))]) (set (match_operand:SI 0 "register_operand") - (unordered:SI (reg:CCFP CR6_REGNO) + (unordered:SI (reg:CCBCD CR6_REGNO) (const_int 0)))] "TARGET_P8_VECTOR" { @@ -4614,7 +4614,7 @@ (define_insn "bcdshift_v16qi" (match_operand:V16QI 2 "register_operand" "v") (match_operand:QI 3 "const_0_to_1_operand" "n")] UNSPEC_BCDSHIFT)) - (clobber (reg:CCFP CR6_REGNO))] + (clobber (reg:CCBCD CR6_REGNO))] "TARGET_P8_VECTOR" "bcds. %0,%1,%2,%3" [(set_attr "type" "vecsimple")]) @@ -4623,7 +4623,7 @@ (define_expand "bcdmul10_v16qi" [(set (match_operand:V16QI 0 "register_operand") (unspec:V16QI [(match_operand:V16QI 1 "register_operand")] UNSPEC_BCDSHIFT)) - (clobber (reg:CCFP CR6_REGNO))] + (clobber (reg:CCBCD CR6_REGNO))] "TARGET_P9_VECTOR" { rtx one = gen_reg_rtx (V16QImode); @@ -4638,7 +4638,7 @@ (define_expand "bcddiv10_v16qi" [(set (match_operand:V16QI 0 "register_operand") (unspec:V16QI [(match_operand:V16QI 1 "register_operand")] UNSPEC_BCDSHIFT)) - (clobber (reg:CCFP CR6_REGNO))] + (clobber (reg:CCBCD CR6_REGNO))] "TARGET_P9_VECTOR" { rtx one = gen_reg_rtx (V16QImode); @@ -4662,9 +4662,9 @@ (define_peephole2 (match_operand:V1TI 2 "register_operand") (match_operand:QI 3 "const_0_to_1_operand")] UNSPEC_BCD_ADD_SUB)) - (clobber (reg:CCFP CR6_REGNO))]) - (parallel [(set (reg:CCFP CR6_REGNO) - (compare:CCFP + (clobber (reg:CCBCD CR6_REGNO))]) + (parallel [(set (reg:CCBCD CR6_REGNO) + (compare:CCBCD (unspec:V2DF [(match_dup 1) (match_dup 2) (match_dup 3)] @@ -4677,8 +4677,8 @@ (define_peephole2 (match_dup 2) (match_dup 3)] UNSPEC_BCD_ADD_SUB)) - (set (reg:CCFP CR6_REGNO) - (compare:CCFP + (set (reg:CCBCD CR6_REGNO) + (compare:CCBCD (unspec:V2DF [(match_dup 1) (match_dup 2) (match_dup 3)] diff --git a/gcc/config/rs6000/predicates.md b/gcc/config/rs6000/predicates.md index d23ce9a77a3..18198add744 100644 --- a/gcc/config/rs6000/predicates.md +++ b/gcc/config/rs6000/predicates.md @@ -1350,7 +1350,9 @@ (define_predicate "branch_comparison_operator" (if_then_else (match_test "flag_finite_math_only") (match_code "lt,le,gt,ge,eq,ne,unordered,ordered") (match_code "lt,gt,eq,unordered,unge,unle,ne,ordered")) - (match_code "lt,ltu,le,leu,gt,gtu,ge,geu,eq,ne")) + (if_then_else (match_test "GET_MODE (XEXP (op, 0)) == CCBCDmode") + (match_code "lt,le,gt,ge,eq,ne,unordered,ordered") + (match_code "lt,ltu,le,leu,gt,gtu,ge,geu,eq,ne"))) (match_test "validate_condition_mode (GET_CODE (op), GET_MODE (XEXP (op, 0))), 1"))) diff --git a/gcc/config/rs6000/rs6000-modes.def b/gcc/config/rs6000/rs6000-modes.def index 094b246c834..3e2e6dfb4ff 100644 --- a/gcc/config/rs6000/rs6000-modes.def +++ b/gcc/config/rs6000/rs6000-modes.def @@ -61,6 +61,7 @@ FRACTIONAL_FLOAT_MODE (TF, FLOAT_PRECISION_TFmode, 16, ieee_quad_format); CC_MODE (CCUNS); CC_MODE (CCFP); +CC_MODE (CCBCD); /* Used for bcd insns */ CC_MODE (CCEQ); /* Vector modes. */ diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index 6ba9df4f02e..4068cd8b929 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -11597,9 +11597,11 @@ validate_condition_mode (enum rtx_code code, machine_mode mode) gcc_assert ((code != GTU && code != LTU && code != GEU && code != LEU) || mode == CCUNSmode); + gcc_assert (mode == CCFPmode || mode == CCBCDmode + || (code != ORDERED && code != UNORDERED)); + gcc_assert (mode == CCFPmode - || (code != ORDERED && code != UNORDERED - && code != UNEQ && code != LTGT + || (code != UNEQ && code != LTGT && code != UNGT && code != UNLT && code != UNGE && code != UNLE)); diff --git a/gcc/config/rs6000/rs6000.md b/gcc/config/rs6000/rs6000.md index bc8bc6ab060..9b5fcdc8db0 100644 --- a/gcc/config/rs6000/rs6000.md +++ b/gcc/config/rs6000/rs6000.md @@ -8115,7 +8115,7 @@ (define_expand "movcc" "" "") -(define_mode_iterator CC_any [CC CCUNS CCEQ CCFP]) +(define_mode_iterator CC_any [CC CCUNS CCEQ CCFP CCBCD]) (define_insn "*movcc_" [(set (match_operand:CC_any 0 "nonimmediate_operand" @@ -13245,6 +13245,7 @@ (define_insn_and_split "*nesi3_ext" (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" [(set (match_operand:GPR 0 "gpc_reg_operand" "=r") @@ -13264,6 +13265,24 @@ (define_insn_and_split "*_cc" } [(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)))] + "" + "#" + "&& 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); + 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") (fp_two:GPR (match_operand:CCFP 1 "cc_reg_operand" "y") diff --git a/gcc/testsuite/gcc.target/powerpc/pr100736.c b/gcc/testsuite/gcc.target/powerpc/pr100736.c new file mode 100644 index 00000000000..85e3ae56d55 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr100736.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-mdejagnu-cpu=power8 -O2 -ffinite-math-only" } */ +/* { dg-require-effective-target powerpc_vsx_ok } */ + +/* Verify there is no ICE with finite-math-only */ + +int foo (vector unsigned char a, vector unsigned char b) +{ + return __builtin_vec_bcdsub_ge (a, b, 0); +} + + diff --git a/gcc/testsuite/gcc.target/powerpc/pr114732.c b/gcc/testsuite/gcc.target/powerpc/pr114732.c new file mode 100644 index 00000000000..d0b878780c6 --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr114732.c @@ -0,0 +1,12 @@ +/* { dg-do compile } */ +/* { dg-options "-mdejagnu-cpu=power8 -O2" } */ +/* { dg-require-effective-target powerpc_vsx_ok } */ + +/* Verify only one cr bit need to be tested. */ + +int foo (vector unsigned char a, vector unsigned char b) +{ + return __builtin_vec_bcdsub_ge (a, b, 0) != 1; +} + +/* { dg-final { scan-assembler-not "cror" } } */