From patchwork Wed Sep 20 08:49:16 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: HAO CHEN GUI X-Patchwork-Id: 142290 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:612c:172:b0:3f2:4152:657d with SMTP id h50csp3979156vqi; Wed, 20 Sep 2023 01:50:54 -0700 (PDT) X-Google-Smtp-Source: AGHT+IHACjH9dbn28lcHAi/poGs69LRKvEJt/muEyDF8m5G5rT8Kbdf32+9MLLpqsZ3MdhEm1AD6 X-Received: by 2002:a05:6402:288:b0:52c:b469:bafd with SMTP id l8-20020a056402028800b0052cb469bafdmr1380891edv.41.1695199854159; Wed, 20 Sep 2023 01:50:54 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1695199854; cv=none; d=google.com; s=arc-20160816; b=Kvq5bu+GDSQ4Ghm/lqXem09ZPBKkHyqS9Lv6XyPlzvAb+UVDngfFwRXmPHSz33NRsc NEeU+oi7ZK2SyiLQRV5AHZ6y6j/B/2a5mJCFTQIt17nlVtEJwmnX0VPnAT55DZEy1tT+ XS5QdcMvmnrUYPjEovYCxECma2DwOM7xJJwoDuwlEAXvlxgHmcsh8EIf52D/aKWVerI7 qEEniH2YNONyZ6zMI8bZFCRFedioMrAlppm+PM/TLO51Mg7sbE7wyiy0eCIRwpTAcdVc cHiJh8Di594xnRirmbZMIGcREPClmnLbZdGqm/KDV8AKwOL92PtfGk2ShmxCxqIiBbMx NTQQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=errors-to:list-subscribe:list-help:list-post:list-archive :list-unsubscribe:list-id:precedence:content-transfer-encoding :subject:from:cc:to:content-language:user-agent:mime-version:date :message-id:dkim-signature:dmarc-filter:delivered-to; bh=7k/8IuefnL/fEdu0Lslk4A+TCsf0lSHV6HO4XV4AcAo=; fh=3eUSxJU+9IWNwGHlMjnmqDQDnJfeMKAjlglEUO7a4vw=; b=ISBUSFBBWRlDC09tGs86S1XpIlhQ41yPyBjf+nRpbtdVadk457wWzbBwjBUcALsUhh oa0aG7AoyZjcXH8MjQxvdYcM4b2OSOjKY92OKAeYGOOtRv0SqO2LoB1lcGKfTwsXS+bz JCtoIuXSJKCOE9gb4PlhVQoc3kVK4OMlQvbiq2brBNQG1D4ZgZniwBs14A68esu+fxcK nl/tY97Y9l7QJtVhsjueAK60SrO88KSHk4OFXHJ5v23dPLnObv3TSjGgM0fFtB7WLMZi dV9OaLil2MF8kQkHQUpH1DzoQ10MPWDlTr8WrblXGBFOOpY4tSuo+PnvwPCjic3l6eOA VJAw== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@ibm.com header.s=pp1 header.b=HZiZjf2o; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=REJECT sp=NONE dis=NONE) header.from=ibm.com Received: from server2.sourceware.org (ip-8-43-85-97.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id b19-20020aa7cd13000000b00532ec75465fsi1130797edw.585.2023.09.20.01.50.53 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 20 Sep 2023 01:50:54 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@ibm.com header.s=pp1 header.b=HZiZjf2o; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=REJECT sp=NONE dis=NONE) header.from=ibm.com Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 51E543858031 for ; Wed, 20 Sep 2023 08:50:50 +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 B87663858D20 for ; Wed, 20 Sep 2023 08:49:25 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B87663858D20 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 Received: from pps.filterd (m0360072.ppops.net [127.0.0.1]) by mx0a-001b2d01.pphosted.com (8.17.1.19/8.17.1.19) with ESMTP id 38K8gk76014233; Wed, 20 Sep 2023 08:49: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=7k/8IuefnL/fEdu0Lslk4A+TCsf0lSHV6HO4XV4AcAo=; b=HZiZjf2oP4l0p9XbOv6CtApILXVEgNyBu3AE5kqCUDF8XeV4VSfEIfZWMt0OUQf79S1w OFUP5ihvASceh22qsEjEbeKtIHVwGFScWuhM7dkXR4WPWnrSn48Z2fNXJwYWjvq2ScE+ /OwPeh3jerUW8PSRDncnb6Oc16SEBpEyeNKgHl0mfcMlaWB1FVDn+K3PbY4XYP0tlsQ9 OnKjcVLiYBvskZVZMnZVg3BN8D8Yow+pHypanZkdWAeZCOK34qV48mLxvXwrbJ3/uask kVsnI0SZU3IR+mdW9M+Xd2c/TCSjJaFSk9vhrptUzYuuNuqIrSGrvlXvBBKedDSd73iw Hw== Received: from pps.reinject (localhost [127.0.0.1]) by mx0a-001b2d01.pphosted.com (PPS) with ESMTPS id 3t7wfa05bg-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 20 Sep 2023 08:49:24 +0000 Received: from m0360072.ppops.net (m0360072.ppops.net [127.0.0.1]) by pps.reinject (8.17.1.5/8.17.1.5) with ESMTP id 38K8golG014357; Wed, 20 Sep 2023 08:49: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 3t7wfa05b5-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 20 Sep 2023 08:49: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 38K83vKP005855; Wed, 20 Sep 2023 08:49:23 GMT Received: from smtprelay07.fra02v.mail.ibm.com ([9.218.2.229]) by ppma22.wdc07v.mail.ibm.com (PPS) with ESMTPS id 3t5q2yvdaw-1 (version=TLSv1.2 cipher=ECDHE-RSA-AES256-GCM-SHA384 bits=256 verify=NOT); Wed, 20 Sep 2023 08:49:23 +0000 Received: from smtpav03.fra02v.mail.ibm.com (smtpav03.fra02v.mail.ibm.com [10.20.54.102]) by smtprelay07.fra02v.mail.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id 38K8nKvq62390722 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-GCM-SHA384 bits=256 verify=OK); Wed, 20 Sep 2023 08:49:20 GMT Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 9344720043; Wed, 20 Sep 2023 08:49:20 +0000 (GMT) Received: from smtpav03.fra02v.mail.ibm.com (unknown [127.0.0.1]) by IMSVA (Postfix) with ESMTP id 1268A20040; Wed, 20 Sep 2023 08:49:19 +0000 (GMT) Received: from [9.200.102.40] (unknown [9.200.102.40]) by smtpav03.fra02v.mail.ibm.com (Postfix) with ESMTP; Wed, 20 Sep 2023 08:49:18 +0000 (GMT) Message-ID: Date: Wed, 20 Sep 2023 16:49:16 +0800 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:102.0) Gecko/20100101 Thunderbird/102.14.0 Content-Language: en-US To: gcc-patches Cc: Segher Boessenkool , David , "Kewen.Lin" , Peter Bergner From: HAO CHEN GUI Subject: [PATCH, rs6000] Enable vector compare for 16-byte memory equality compare [PR111449] X-TM-AS-GCONF: 00 X-Proofpoint-ORIG-GUID: t7tsYs3JzrhL8Q52sgNOJ6Q4psB5QVNW X-Proofpoint-GUID: XWkHkSXlHAgfvkC8ljcExCEfAv0xkcV1 X-Proofpoint-Virus-Version: vendor=baseguard engine=ICAP:2.0.267,Aquarius:18.0.980,Hydra:6.0.601,FMLib:17.11.176.26 definitions=2023-09-20_03,2023-09-19_01,2023-05-22_02 X-Proofpoint-Spam-Details: rule=outbound_notspam policy=outbound score=0 phishscore=0 impostorscore=0 mlxscore=0 clxscore=1011 suspectscore=0 bulkscore=0 mlxlogscore=999 priorityscore=1501 malwarescore=0 spamscore=0 adultscore=0 lowpriorityscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.12.0-2308100000 definitions=main-2309200067 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+ouuuleilei=gmail.com@gcc.gnu.org X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1777545882377647787 X-GMAIL-MSGID: 1777545882377647787 Hi, This patch enables vector compare for 16-byte memory equality compare. The 16-byte memory equality compare can be efficiently implemented by instruction "vcmpequb." It reduces one branch and one compare compared with two 8-byte compare sequence. 16-byte vector compare is not enabled on 32bit sub-targets as TImode hasn't been supported well on 32bit sub-targets. Bootstrapped and tested on powerpc64-linux BE and LE with no regressions. Thanks Gui Haochen ChangeLog rs6000: Enable vector compare for 16-byte memory equality compare gcc/ PR target/111449 * config/rs6000/altivec.md (cbranchti4): New expand pattern. * config/rs6000/rs6000.cc (rs6000_generate_compare): Generate insn sequence for TImode vector equality compare. * config/rs6000/rs6000.h (MOVE_MAX_PIECES): Define. (COMPARE_MAX_PIECES): Define. gcc/testsuite/ PR target/111449 * gcc.target/powerpc/pr111449.c: New. patch.diff diff --git a/gcc/config/rs6000/altivec.md b/gcc/config/rs6000/altivec.md index e8a596fb7e9..99264235cbe 100644 --- a/gcc/config/rs6000/altivec.md +++ b/gcc/config/rs6000/altivec.md @@ -2605,6 +2605,24 @@ (define_insn "altivec_vupklpx" } [(set_attr "type" "vecperm")]) +(define_expand "cbranchti4" + [(use (match_operator 0 "equality_operator" + [(match_operand:TI 1 "memory_operand") + (match_operand:TI 2 "memory_operand")])) + (use (match_operand 3))] + "VECTOR_UNIT_ALTIVEC_P (V16QImode)" +{ + rtx op1 = simplify_subreg (V16QImode, operands[1], TImode, 0); + rtx op2 = simplify_subreg (V16QImode, operands[2], TImode, 0); + operands[1] = force_reg (V16QImode, op1); + operands[2] = force_reg (V16QImode, op2); + rtx_code code = GET_CODE (operands[0]); + operands[0] = gen_rtx_fmt_ee (code, V16QImode, operands[1], + operands[2]); + rs6000_emit_cbranch (TImode, operands); + DONE; +}) + ;; Compare vectors producing a vector result and a predicate, setting CR6 to ;; indicate a combined status (define_insn "altivec_vcmpequ_p" diff --git a/gcc/config/rs6000/rs6000.cc b/gcc/config/rs6000/rs6000.cc index efe9adce1f8..c6b935a64e7 100644 --- a/gcc/config/rs6000/rs6000.cc +++ b/gcc/config/rs6000/rs6000.cc @@ -15264,6 +15264,15 @@ rs6000_generate_compare (rtx cmp, machine_mode mode) else emit_insn (gen_stack_protect_testsi (compare_result, op0, op1b)); } + else if (mode == TImode) + { + gcc_assert (code == EQ || code == NE); + + rtx result_vector = gen_reg_rtx (V16QImode); + compare_result = gen_rtx_REG (CCmode, CR6_REGNO); + emit_insn (gen_altivec_vcmpequb_p (result_vector, op0, op1)); + code = (code == NE) ? GE : LT; + } else emit_insn (gen_rtx_SET (compare_result, gen_rtx_COMPARE (comp_mode, op0, op1))); diff --git a/gcc/config/rs6000/rs6000.h b/gcc/config/rs6000/rs6000.h index 3503614efbd..dc33bca0802 100644 --- a/gcc/config/rs6000/rs6000.h +++ b/gcc/config/rs6000/rs6000.h @@ -1730,6 +1730,8 @@ typedef struct rs6000_args in one reasonably fast instruction. */ #define MOVE_MAX (! TARGET_POWERPC64 ? 4 : 8) #define MAX_MOVE_MAX 8 +#define MOVE_MAX_PIECES (!TARGET_POWERPC64 ? 4 : 16) +#define COMPARE_MAX_PIECES (!TARGET_POWERPC64 ? 4 : 16) /* Nonzero if access to memory by bytes is no faster than for words. Also nonzero if doing byte operations (specifically shifts) in registers diff --git a/gcc/testsuite/gcc.target/powerpc/pr111449.c b/gcc/testsuite/gcc.target/powerpc/pr111449.c new file mode 100644 index 00000000000..ab9583f47bb --- /dev/null +++ b/gcc/testsuite/gcc.target/powerpc/pr111449.c @@ -0,0 +1,14 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target powerpc_p8vector_ok } */ +/* { dg-options "-maltivec -O2" } */ +/* { dg-require-effective-target has_arch_ppc64 } */ + +/* Ensure vector comparison is used for 16-byte memory equality compare. */ + +int compare (const char* s1, const char* s2) +{ + return __builtin_memcmp (s1, s2, 16) == 0; +} + +/* { dg-final { scan-assembler-times {\mvcmpequb\M} 1 } } */ +/* { dg-final { scan-assembler-not {\mcmpd\M} } } */