From patchwork Thu Aug 11 11:22:04 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Andreas Krebbel X-Patchwork-Id: 658177 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 3s95Gj49JHz9sDf for ; Thu, 11 Aug 2016 21:22:53 +1000 (AEST) Authentication-Results: ozlabs.org; dkim=pass (1024-bit key; unprotected) header.d=gcc.gnu.org header.i=@gcc.gnu.org header.b=CdSRSGRH; dkim-atps=neutral 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:subject:date:in-reply-to:references:message-id; q=dns; s= default; b=bxx4gQyeeTvmaMlhyXwaRPzbThraVpw/fxOmwipuZjI0ZeJsqVYld QqlbUIn0c+fBEhSX+DRM8Pr15ZzqFO/87fOkrbG5QthClaN5yf14lXxExCR0Nn8J VFlv1fCGOBPpTTGnGxF3VJfA55DCs0DRCQF+b0SpZQ+ccL8Btce308= 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:subject:date:in-reply-to:references:message-id; s=default; bh=i+tL3kc5V2jC0Lgla1e730ehftY=; b=CdSRSGRH+AqJyCS5J9vl694H1p67 ongHElkHxZhUs0ICclVzvL2t0UDgxYtUJs6oUviSyZ1UDHObt8Ux126jDQyWji1P pFfhu7FD0SdNa5D7UiGnktn/Ve+gEVM/g0BWf0vSs62Hq9L/w/m1OpyUk6LyS4BU 84YuqQyFBae9vWo= Received: (qmail 9492 invoked by alias); 11 Aug 2016 11:22:26 -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 9365 invoked by uid 89); 11 Aug 2016 11:22:25 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=0.5 required=5.0 tests=AWL, BAYES_00, KAM_LAZY_DOMAIN_SECURITY, RCVD_IN_DNSWL_LOW, UNWANTED_LANGUAGE_BODY autolearn=no version=3.3.2 spammy=H*r:AES256-SHA256, Hx-languages:cs.iso-8859-2, define_insn, set_attr X-HELO: mx0a-001b2d01.pphosted.com Received: from mx0b-001b2d01.pphosted.com (HELO mx0a-001b2d01.pphosted.com) (148.163.158.5) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-SHA encrypted) ESMTPS; Thu, 11 Aug 2016 11:22:13 +0000 Received: from pps.filterd (m0098414.ppops.net [127.0.0.1]) by mx0b-001b2d01.pphosted.com (8.16.0.11/8.16.0.11) with SMTP id u7BBKtjR013271 for ; Thu, 11 Aug 2016 07:22:11 -0400 Received: from e06smtp12.uk.ibm.com (e06smtp12.uk.ibm.com [195.75.94.108]) by mx0b-001b2d01.pphosted.com with ESMTP id 24qm9t9tdp-1 (version=TLSv1.2 cipher=AES256-SHA bits=256 verify=NOT) for ; Thu, 11 Aug 2016 07:22:10 -0400 Received: from localhost by e06smtp12.uk.ibm.com with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted for from ; Thu, 11 Aug 2016 12:22:09 +0100 Received: from d06dlp01.portsmouth.uk.ibm.com (9.149.20.13) by e06smtp12.uk.ibm.com (192.168.101.142) with IBM ESMTP SMTP Gateway: Authorized Use Only! Violators will be prosecuted; Thu, 11 Aug 2016 12:22:08 +0100 X-IBM-Helo: d06dlp01.portsmouth.uk.ibm.com X-IBM-MailFrom: krebbel@linux.vnet.ibm.com X-IBM-RcptTo: gcc-patches@gcc.gnu.org Received: from b06cxnps4075.portsmouth.uk.ibm.com (d06relay12.portsmouth.uk.ibm.com [9.149.109.197]) by d06dlp01.portsmouth.uk.ibm.com (Postfix) with ESMTP id 9FE1717D806B for ; Thu, 11 Aug 2016 12:23:47 +0100 (BST) Received: from d06av04.portsmouth.uk.ibm.com (d06av04.portsmouth.uk.ibm.com [9.149.37.216]) by b06cxnps4075.portsmouth.uk.ibm.com (8.14.9/8.14.9/NCO v10.0) with ESMTP id u7BBM7AX4718888 for ; Thu, 11 Aug 2016 11:22:07 GMT Received: from d06av04.portsmouth.uk.ibm.com (localhost [127.0.0.1]) by d06av04.portsmouth.uk.ibm.com (8.14.4/8.14.4/NCO v10.0 AVout) with ESMTP id u7BBM7RP016975 for ; Thu, 11 Aug 2016 05:22:07 -0600 Received: from maggie.boeblingen.de.ibm.com (dyn-9-152-212-147.boeblingen.de.ibm.com [9.152.212.147]) by d06av04.portsmouth.uk.ibm.com (8.14.4/8.14.4/NCO v10.0 AVin) with ESMTP id u7BBM4WG016816 (version=TLSv1/SSLv3 cipher=AES256-SHA256 bits=256 verify=NO) for ; Thu, 11 Aug 2016 05:22:06 -0600 From: Andreas Krebbel To: gcc-patches@gcc.gnu.org Subject: [PATCH 2/2] S/390: Provide low-level builtins with __int128 ops. Date: Thu, 11 Aug 2016 13:22:04 +0200 In-Reply-To: <20160811112204.23738-1-krebbel@linux.vnet.ibm.com> References: <20160811112204.23738-1-krebbel@linux.vnet.ibm.com> X-TM-AS-MML: disable X-Content-Scanned: Fidelis XPS MAILER x-cbid: 16081111-0008-0000-0000-000002B05561 X-IBM-AV-DETECTION: SAVI=unused REMOTE=unused XFE=unused x-cbparentid: 16081111-0009-0000-0000-0000196B56A1 Message-Id: <20160811112204.23738-3-krebbel@linux.vnet.ibm.com> X-Proofpoint-Virus-Version: vendor=fsecure engine=2.50.10432:, , definitions=2016-08-11_08:, , signatures=0 X-Proofpoint-Spam-Details: rule=outbound_spam_definite policy=outbound score=100 spamscore=100 suspectscore=1 malwarescore=0 phishscore=0 adultscore=2 bulkscore=0 classifier=spam adjust=0 reason=mlx scancount=1 engine=8.0.1-1604210000 definitions=main-1608110159 X-IsSubscribed: yes gcc/ChangeLog: 2016-08-11 Andreas Krebbel * config/s390/s390-builtin-types.def: Add INT128 types. * config/s390/s390-builtins.def: Add INT128 variants for the add sub low-level builtins dealing with TImode. * config/s390/s390.c (s390_expand_builtin): Allow mode conversions via subreg when expanding a builtin. * config/s390/s390.md: Remove UNSPEC_VEC_ADDC_U128, UNSPEC_VEC_SUB_U128, and UNSPEC_VEC_SUBC_U128 constants. Fix comment. * config/s390/vecintrin.h: Adjust builtin names accordingly. * config/s390/vx-builtins.md ("vec_add_u128"): Remove expander. ("vec_addc", "vec_addc_u128"): Merge to "vacc_". ("vec_adde_u128"): Rename to "vacq". Change mode to TImode. ("vec_addec_u128"): Rename to "vacccq". Change mode to TImode. ("vec_subc", "vec_subc_u128"): Merge to "vscbi_". ("vec_sube_u128"): Rename to "vsbiq". Change mode to TImode. ("vec_subec_u128"): Rename to "vsbcbiq". Change mode to TImode. --- gcc/config/s390/s390-builtin-types.def | 3 + gcc/config/s390/s390-builtins.def | 49 +++++++++----- gcc/config/s390/s390.c | 15 +++++ gcc/config/s390/s390.md | 5 +- gcc/config/s390/vecintrin.h | 16 ++--- gcc/config/s390/vx-builtins.md | 113 +++++++++------------------------ 6 files changed, 91 insertions(+), 110 deletions(-) diff --git a/gcc/config/s390/s390-builtin-types.def b/gcc/config/s390/s390-builtin-types.def index 3d90d41..f5fcf98 100644 --- a/gcc/config/s390/s390-builtin-types.def +++ b/gcc/config/s390/s390-builtin-types.def @@ -66,6 +66,7 @@ DEF_TYPE (BT_FLT, B_VX, float_type_node, 0) DEF_TYPE (BT_UINT, 0, unsigned_type_node, 0) DEF_TYPE (BT_VOIDCONST, B_VX, void_type_node, 1) DEF_TYPE (BT_ULONG, B_VX, long_unsigned_type_node, 0) +DEF_TYPE (BT_INT128, B_VX, intTI_type_node, 0) DEF_TYPE (BT_USHORTCONST, B_VX, short_unsigned_type_node, 1) DEF_TYPE (BT_SHORTCONST, B_VX, short_integer_type_node, 1) DEF_TYPE (BT_INTCONST, B_VX, integer_type_node, 1) @@ -171,6 +172,7 @@ DEF_FN_TYPE_1 (BT_FN_V8HI_V8HI, B_VX, BT_V8HI, BT_V8HI) DEF_FN_TYPE_1 (BT_FN_VOID_INT, B_HTM, BT_VOID, BT_INT) DEF_FN_TYPE_1 (BT_FN_VOID_UINT, 0, BT_VOID, BT_UINT) DEF_FN_TYPE_2 (BT_FN_DBL_V2DF_INT, B_VX, BT_DBL, BT_V2DF, BT_INT) +DEF_FN_TYPE_2 (BT_FN_INT128_INT128_INT128, B_VX, BT_INT128, BT_INT128, BT_INT128) DEF_FN_TYPE_2 (BT_FN_INT_OV4SI_INT, B_VX, BT_INT, BT_OV4SI, BT_INT) DEF_FN_TYPE_2 (BT_FN_INT_OV4SI_OV4SI, B_VX, BT_INT, BT_OV4SI, BT_OV4SI) DEF_FN_TYPE_2 (BT_FN_INT_UV16QI_UV16QI, B_VX, BT_INT, BT_UV16QI, BT_UV16QI) @@ -260,6 +262,7 @@ DEF_FN_TYPE_2 (BT_FN_V8HI_V4SI_V4SI, B_VX, BT_V8HI, BT_V4SI, BT_V4SI) DEF_FN_TYPE_2 (BT_FN_V8HI_V8HI_V8HI, B_VX, BT_V8HI, BT_V8HI, BT_V8HI) DEF_FN_TYPE_2 (BT_FN_VOID_UINT64PTR_UINT64, B_HTM, BT_VOID, BT_UINT64PTR, BT_UINT64) DEF_FN_TYPE_2 (BT_FN_VOID_V2DF_FLTPTR, B_VX, BT_VOID, BT_V2DF, BT_FLTPTR) +DEF_FN_TYPE_3 (BT_FN_INT128_INT128_INT128_INT128, B_VX, BT_INT128, BT_INT128, BT_INT128, BT_INT128) DEF_FN_TYPE_3 (BT_FN_INT_OV4SI_OV4SI_INTPTR, B_VX, BT_INT, BT_OV4SI, BT_OV4SI, BT_INTPTR) DEF_FN_TYPE_3 (BT_FN_OV4SI_INT_OV4SI_INT, B_VX, BT_OV4SI, BT_INT, BT_OV4SI, BT_INT) DEF_FN_TYPE_3 (BT_FN_OV4SI_OV4SI_OV4SI_INT, B_VX, BT_OV4SI, BT_OV4SI, BT_OV4SI, BT_INT) diff --git a/gcc/config/s390/s390-builtins.def b/gcc/config/s390/s390-builtins.def index ead0afb..4bcdb22 100644 --- a/gcc/config/s390/s390-builtins.def +++ b/gcc/config/s390/s390-builtins.def @@ -741,7 +741,6 @@ B_DEF (s390_vuplhw, vec_unpacklv8hi, 0, B_DEF (s390_vupllh, vec_unpackl_lv8hi, 0, B_VX, 0, BT_FN_UV4SI_UV8HI) B_DEF (s390_vuplf, vec_unpacklv4si, 0, B_VX, 0, BT_FN_V2DI_V4SI) B_DEF (s390_vupllf, vec_unpackl_lv4si, 0, B_VX, 0, BT_FN_UV2DI_UV4SI) -B_DEF (s390_vaq, vec_add_u128, 0, B_VX, 0, BT_FN_UV16QI_UV16QI_UV16QI) OB_DEF (s390_vec_addc, s390_vec_addc_u8, s390_vec_addc_u64, B_VX, BT_FN_OV4SI_OV4SI_OV4SI) OB_DEF_VAR (s390_vec_addc_u8, s390_vaccb, 0, BT_OV_UV16QI_UV16QI_UV16QI) @@ -749,13 +748,20 @@ OB_DEF_VAR (s390_vec_addc_u16, s390_vacch, 0, OB_DEF_VAR (s390_vec_addc_u32, s390_vaccf, 0, BT_OV_UV4SI_UV4SI_UV4SI) OB_DEF_VAR (s390_vec_addc_u64, s390_vaccg, 0, BT_OV_UV2DI_UV2DI_UV2DI) -B_DEF (s390_vaccb, vec_addcv16qi, 0, B_VX, 0, BT_FN_UV16QI_UV16QI_UV16QI) -B_DEF (s390_vacch, vec_addcv8hi, 0, B_VX, 0, BT_FN_UV8HI_UV8HI_UV8HI) -B_DEF (s390_vaccf, vec_addcv4si, 0, B_VX, 0, BT_FN_UV4SI_UV4SI_UV4SI) -B_DEF (s390_vaccg, vec_addcv2di, 0, B_VX, 0, BT_FN_UV2DI_UV2DI_UV2DI) -B_DEF (s390_vaccq, vec_addc_u128, 0, B_VX, 0, BT_FN_UV16QI_UV16QI_UV16QI) -B_DEF (s390_vacq, vec_adde_u128, 0, B_VX, 0, BT_FN_UV16QI_UV16QI_UV16QI_UV16QI) -B_DEF (s390_vacccq, vec_addec_u128, 0, B_VX, 0, BT_FN_UV16QI_UV16QI_UV16QI_UV16QI) +B_DEF (s390_vaccb, vaccb_v16qi, 0, B_VX, 0, BT_FN_UV16QI_UV16QI_UV16QI) +B_DEF (s390_vacch, vacch_v8hi, 0, B_VX, 0, BT_FN_UV8HI_UV8HI_UV8HI) +B_DEF (s390_vaccf, vaccf_v4si, 0, B_VX, 0, BT_FN_UV4SI_UV4SI_UV4SI) +B_DEF (s390_vaccg, vaccg_v2di, 0, B_VX, 0, BT_FN_UV2DI_UV2DI_UV2DI) + +B_DEF (s390_vec_add_u128, addti3, 0, B_VX, 0, BT_FN_UV16QI_UV16QI_UV16QI) +B_DEF (s390_vec_addc_u128, vaccq_ti, 0, B_VX, 0, BT_FN_UV16QI_UV16QI_UV16QI) +B_DEF (s390_vec_adde_u128, vacq, 0, B_VX, 0, BT_FN_UV16QI_UV16QI_UV16QI_UV16QI) +B_DEF (s390_vec_addec_u128, vacccq, 0, B_VX, 0, BT_FN_UV16QI_UV16QI_UV16QI_UV16QI) + +B_DEF (s390_vaq, addti3, 0, B_VX, 0, BT_FN_INT128_INT128_INT128) +B_DEF (s390_vaccq, vaccq_ti, 0, B_VX, 0, BT_FN_INT128_INT128_INT128) +B_DEF (s390_vacq, vacq, 0, B_VX, 0, BT_FN_INT128_INT128_INT128_INT128) +B_DEF (s390_vacccq, vacccq, 0, B_VX, 0, BT_FN_INT128_INT128_INT128_INT128) OB_DEF (s390_vec_and, s390_vec_and_b8, s390_vec_and_dbl_c, B_VX, BT_FN_OV4SI_OV4SI_OV4SI) OB_DEF_VAR (s390_vec_and_b8, s390_vn, 0, BT_OV_BV16QI_BV16QI_BV16QI) @@ -2051,7 +2057,6 @@ OB_DEF_VAR (s390_vec_srb_dbl_u64, s390_vsrlb, 0, OB_DEF_VAR (s390_vec_srb_dbl_s64, s390_vsrlb, 0, BT_OV_V2DF_V2DF_V2DI) B_DEF (s390_vsrlb, vec_srbv16qi, 0, B_VX, 0, BT_FN_UV16QI_UV16QI_UV16QI) -B_DEF (s390_vsq, vec_sub_u128, 0, B_VX, 0, BT_FN_UV16QI_UV16QI_UV16QI) OB_DEF (s390_vec_subc, s390_vec_subc_u8, s390_vec_subc_u64, B_VX, BT_FN_OV4SI_OV4SI_OV4SI) OB_DEF_VAR (s390_vec_subc_u8, s390_vscbib, 0, BT_OV_UV16QI_UV16QI_UV16QI) @@ -2059,13 +2064,25 @@ OB_DEF_VAR (s390_vec_subc_u16, s390_vscbih, 0, OB_DEF_VAR (s390_vec_subc_u32, s390_vscbif, 0, BT_OV_UV4SI_UV4SI_UV4SI) OB_DEF_VAR (s390_vec_subc_u64, s390_vscbig, 0, BT_OV_UV2DI_UV2DI_UV2DI) -B_DEF (s390_vscbib, vec_subcv16qi, 0, B_VX, 0, BT_FN_UV16QI_UV16QI_UV16QI) -B_DEF (s390_vscbih, vec_subcv8hi, 0, B_VX, 0, BT_FN_UV8HI_UV8HI_UV8HI) -B_DEF (s390_vscbif, vec_subcv4si, 0, B_VX, 0, BT_FN_UV4SI_UV4SI_UV4SI) -B_DEF (s390_vscbig, vec_subcv2di, 0, B_VX, 0, BT_FN_UV2DI_UV2DI_UV2DI) -B_DEF (s390_vscbiq, vec_subc_u128, 0, B_VX, 0, BT_FN_UV16QI_UV16QI_UV16QI) -B_DEF (s390_vsbiq, vec_sube_u128, 0, B_VX, 0, BT_FN_UV16QI_UV16QI_UV16QI_UV16QI) -B_DEF (s390_vsbcbiq, vec_subec_u128, 0, B_VX, 0, BT_FN_UV16QI_UV16QI_UV16QI_UV16QI) +B_DEF (s390_vscbib, vscbib_v16qi, 0, B_VX, 0, BT_FN_UV16QI_UV16QI_UV16QI) +B_DEF (s390_vscbih, vscbih_v8hi, 0, B_VX, 0, BT_FN_UV8HI_UV8HI_UV8HI) +B_DEF (s390_vscbif, vscbif_v4si, 0, B_VX, 0, BT_FN_UV4SI_UV4SI_UV4SI) +B_DEF (s390_vscbig, vscbig_v2di, 0, B_VX, 0, BT_FN_UV2DI_UV2DI_UV2DI) + +/* The builtin definitions requires these to use vector unsigned char. + But we want the GCC low-level builtins and the insn patterns to + allow int128_t and TImode. So we rely on s390_expand_builtin to + switch modes. */ + +B_DEF (s390_vec_sub_u128, subti3, 0, B_VX, 0, BT_FN_UV16QI_UV16QI_UV16QI) +B_DEF (s390_vec_subc_u128, vscbiq_ti, 0, B_VX, 0, BT_FN_UV16QI_UV16QI_UV16QI) +B_DEF (s390_vec_sube_u128, vsbiq, 0, B_VX, 0, BT_FN_UV16QI_UV16QI_UV16QI_UV16QI) +B_DEF (s390_vec_subec_u128, vsbcbiq, 0, B_VX, 0, BT_FN_UV16QI_UV16QI_UV16QI_UV16QI) + +B_DEF (s390_vsq, subti3, 0, B_VX, 0, BT_FN_INT128_INT128_INT128) +B_DEF (s390_vscbiq, vscbiq_ti, 0, B_VX, 0, BT_FN_INT128_INT128_INT128) +B_DEF (s390_vsbiq, vsbiq, 0, B_VX, 0, BT_FN_INT128_INT128_INT128_INT128) +B_DEF (s390_vsbcbiq, vsbcbiq, 0, B_VX, 0, BT_FN_INT128_INT128_INT128_INT128) OB_DEF (s390_vec_sum2, s390_vec_sum2_u16, s390_vec_sum2_u32, B_VX, BT_FN_OV4SI_OV4SI_OV4SI) OB_DEF_VAR (s390_vec_sum2_u16, s390_vsumgh, 0, BT_OV_UV2DI_UV8HI_UV8HI) diff --git a/gcc/config/s390/s390.c b/gcc/config/s390/s390.c index 23d758c..1abb30b 100644 --- a/gcc/config/s390/s390.c +++ b/gcc/config/s390/s390.c @@ -875,6 +875,7 @@ s390_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED, arity = 0; FOR_EACH_CALL_EXPR_ARG (arg, iter, exp) { + rtx tmp_rtx; const struct insn_operand_data *insn_op; unsigned int op_flags = all_op_flags & ((1 << O_SHIFT) - 1); @@ -950,6 +951,20 @@ s390_expand_builtin (tree exp, rtx target, rtx subtarget ATTRIBUTE_UNUSED, copy_to_mode_reg (Pmode, XEXP (op[arity], 0))); } + /* Some of the builtins require different modes/types than the + pattern in order to implement a specific API. Instead of + adding many expanders which do the mode change we do it here. + E.g. s390_vec_add_u128 required to have vector unsigned char + arguments is mapped to addti3. */ + else if (insn_op->mode != VOIDmode + && GET_MODE (op[arity]) != VOIDmode + && GET_MODE (op[arity]) != insn_op->mode + && ((tmp_rtx = simplify_gen_subreg (insn_op->mode, op[arity], + GET_MODE (op[arity]), 0)) + != NULL_RTX)) + { + op[arity] = tmp_rtx; + } else if (GET_MODE (op[arity]) == insn_op->mode || GET_MODE (op[arity]) == VOIDmode || (insn_op->predicate == address_operand diff --git a/gcc/config/s390/s390.md b/gcc/config/s390/s390.md index 6d8d041..a63cee9 100644 --- a/gcc/config/s390/s390.md +++ b/gcc/config/s390/s390.md @@ -174,7 +174,6 @@ UNSPEC_VEC_UNPACKL UNSPEC_VEC_UNPACKL_L UNSPEC_VEC_ADDC - UNSPEC_VEC_ADDC_U128 UNSPEC_VEC_ADDE_U128 UNSPEC_VEC_ADDEC_U128 UNSPEC_VEC_AVG @@ -198,9 +197,7 @@ UNSPEC_VEC_SRL UNSPEC_VEC_SRLB - UNSPEC_VEC_SUB_U128 UNSPEC_VEC_SUBC - UNSPEC_VEC_SUBC_U128 UNSPEC_VEC_SUBE_U128 UNSPEC_VEC_SUBEC_U128 @@ -5711,7 +5708,7 @@ (clobber (reg:CC CC_REGNUM))])] "TARGET_ZARCH" { - /* For z13 we have vaq which doesn't set CC. */ + /* For z13 we have vsq which doesn't set CC. */ if (TARGET_VX) { emit_insn (gen_rtx_SET (operands[0], diff --git a/gcc/config/s390/vecintrin.h b/gcc/config/s390/vecintrin.h index 2bd35d6..52e46ff 100644 --- a/gcc/config/s390/vecintrin.h +++ b/gcc/config/s390/vecintrin.h @@ -73,17 +73,9 @@ __lcbb(const void *ptr, int bndry) #define vec_splat_s32 __builtin_s390_vec_splat_s32 #define vec_splat_u64 __builtin_s390_vec_splat_u64 #define vec_splat_s64 __builtin_s390_vec_splat_s64 -#define vec_add_u128 __builtin_s390_vaq -#define vec_addc_u128 __builtin_s390_vaccq -#define vec_adde_u128 __builtin_s390_vacq -#define vec_addec_u128 __builtin_s390_vacccq #define vec_checksum __builtin_s390_vcksm #define vec_gfmsum_128 __builtin_s390_vgfmg #define vec_gfmsum_accum_128 __builtin_s390_vgfmag -#define vec_sub_u128 __builtin_s390_vsq -#define vec_subc_u128 __builtin_s390_vscbiq -#define vec_sube_u128 __builtin_s390_vsbiq -#define vec_subec_u128 __builtin_s390_vsbcbiq #define vec_ceil(X) __builtin_s390_vfidb((X), 4, 6) #define vec_roundp(X) __builtin_s390_vfidb((X), 4, 6) #define vec_floor(X) __builtin_s390_vfidb((X), 4, 7) @@ -169,6 +161,10 @@ __lcbb(const void *ptr, int bndry) #define vec_unpackh __builtin_s390_vec_unpackh #define vec_unpackl __builtin_s390_vec_unpackl #define vec_addc __builtin_s390_vec_addc +#define vec_add_u128 __builtin_s390_vec_add_u128 +#define vec_addc_u128 __builtin_s390_vec_addc_u128 +#define vec_adde_u128 __builtin_s390_vec_adde_u128 +#define vec_addec_u128 __builtin_s390_vec_addec_u128 #define vec_and __builtin_s390_vec_and #define vec_andc __builtin_s390_vec_andc #define vec_avg __builtin_s390_vec_avg @@ -219,6 +215,10 @@ __lcbb(const void *ptr, int bndry) #define vec_srl __builtin_s390_vec_srl #define vec_srb __builtin_s390_vec_srb #define vec_subc __builtin_s390_vec_subc +#define vec_sub_u128 __builtin_s390_vec_sub_u128 +#define vec_subc_u128 __builtin_s390_vec_subc_u128 +#define vec_sube_u128 __builtin_s390_vec_sube_u128 +#define vec_subec_u128 __builtin_s390_vec_subec_u128 #define vec_sum2 __builtin_s390_vec_sum2 #define vec_sum_u128 __builtin_s390_vec_sum_u128 #define vec_sum4 __builtin_s390_vec_sum4 diff --git a/gcc/config/s390/vx-builtins.md b/gcc/config/s390/vx-builtins.md index 9ab429e..444c277 100644 --- a/gcc/config/s390/vx-builtins.md +++ b/gcc/config/s390/vx-builtins.md @@ -550,56 +550,25 @@ ; Vector add -; vaq - -; zvector builtins uses V16QI operands. So replace the modes in order -; to map this to a TImode add. We have to keep the V16QI mode -; operands in the expander in order to allow some operand type -; checking when expanding the builtin. -(define_expand "vec_add_u128" - [(match_operand:V16QI 0 "register_operand" "") - (match_operand:V16QI 1 "register_operand" "") - (match_operand:V16QI 2 "register_operand" "")] - "TARGET_VX" -{ - rtx op0 = gen_rtx_SUBREG (TImode, operands[0], 0); - rtx op1 = gen_rtx_SUBREG (TImode, operands[1], 0); - rtx op2 = gen_rtx_SUBREG (TImode, operands[2], 0); - - emit_insn (gen_rtx_SET (op0, - gen_rtx_PLUS (TImode, op1, op2))); - DONE; -}) - ; Vector add compute carry -(define_insn "vec_addc" - [(set (match_operand:VI_HW 0 "register_operand" "=v") - (unspec:VI_HW [(match_operand:VI_HW 1 "register_operand" "%v") - (match_operand:VI_HW 2 "register_operand" "v")] - UNSPEC_VEC_ADDC))] +(define_insn "vacc_" + [(set (match_operand:VIT_HW 0 "register_operand" "=v") + (unspec:VIT_HW [(match_operand:VIT_HW 1 "register_operand" "%v") + (match_operand:VIT_HW 2 "register_operand" "v")] + UNSPEC_VEC_ADDC))] "TARGET_VX" "vacc\t%v0,%v1,%v2" [(set_attr "op_type" "VRR")]) -(define_insn "vec_addc_u128" - [(set (match_operand:V16QI 0 "register_operand" "=v") - (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "%v") - (match_operand:V16QI 2 "register_operand" "v")] - UNSPEC_VEC_ADDC_U128))] - "TARGET_VX" - "vaccq\t%v0,%v1,%v2" - [(set_attr "op_type" "VRR")]) - - ; Vector add with carry -(define_insn "vec_adde_u128" - [(set (match_operand:V16QI 0 "register_operand" "=v") - (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "%v") - (match_operand:V16QI 2 "register_operand" "v") - (match_operand:V16QI 3 "register_operand" "v")] - UNSPEC_VEC_ADDE_U128))] +(define_insn "vacq" + [(set (match_operand:TI 0 "register_operand" "=v") + (unspec:TI [(match_operand:TI 1 "register_operand" "%v") + (match_operand:TI 2 "register_operand" "v") + (match_operand:TI 3 "register_operand" "v")] + UNSPEC_VEC_ADDE_U128))] "TARGET_VX" "vacq\t%v0,%v1,%v2,%v3" [(set_attr "op_type" "VRR")]) @@ -607,12 +576,12 @@ ; Vector add with carry compute carry -(define_insn "vec_addec_u128" - [(set (match_operand:V16QI 0 "register_operand" "=v") - (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "%v") - (match_operand:V16QI 2 "register_operand" "v") - (match_operand:V16QI 3 "register_operand" "v")] - UNSPEC_VEC_ADDEC_U128))] +(define_insn "vacccq" + [(set (match_operand:TI 0 "register_operand" "=v") + (unspec:TI [(match_operand:TI 1 "register_operand" "%v") + (match_operand:TI 2 "register_operand" "v") + (match_operand:TI 3 "register_operand" "v")] + UNSPEC_VEC_ADDEC_U128))] "TARGET_VX" "vacccq\t%v0,%v1,%v2,%v3" [(set_attr "op_type" "VRR")]) @@ -1145,44 +1114,24 @@ ; Vector subtract -(define_insn "vec_sub_u128" - [(set (match_operand:V16QI 0 "register_operand" "=v") - (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v") - (match_operand:V16QI 2 "register_operand" "v")] - UNSPEC_VEC_SUB_U128))] - "TARGET_VX" - "vsq\t%v0,%v1,%v2" - [(set_attr "op_type" "VRR")]) - - ; Vector subtract compute borrow indication -(define_insn "vec_subc" - [(set (match_operand:VI_HW 0 "register_operand" "=v") - (unspec:VI_HW [(match_operand:VI_HW 1 "register_operand" "v") - (match_operand:VI_HW 2 "register_operand" "v")] +(define_insn "vscbi_" + [(set (match_operand:VIT_HW 0 "register_operand" "=v") + (unspec:VIT_HW [(match_operand:VIT_HW 1 "register_operand" "v") + (match_operand:VIT_HW 2 "register_operand" "v")] UNSPEC_VEC_SUBC))] "TARGET_VX" "vscbi\t%v0,%v1,%v2" [(set_attr "op_type" "VRR")]) -(define_insn "vec_subc_u128" - [(set (match_operand:V16QI 0 "register_operand" "=v") - (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v") - (match_operand:V16QI 2 "register_operand" "v")] - UNSPEC_VEC_SUBC_U128))] - "TARGET_VX" - "vscbiq\t%v0,%v1,%v2" - [(set_attr "op_type" "VRR")]) - - ; Vector subtract with borrow indication -(define_insn "vec_sube_u128" - [(set (match_operand:V16QI 0 "register_operand" "=v") - (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v") - (match_operand:V16QI 2 "register_operand" "v") - (match_operand:V16QI 3 "register_operand" "v")] +(define_insn "vsbiq" + [(set (match_operand:TI 0 "register_operand" "=v") + (unspec:TI [(match_operand:TI 1 "register_operand" "v") + (match_operand:TI 2 "register_operand" "v") + (match_operand:TI 3 "register_operand" "v")] UNSPEC_VEC_SUBE_U128))] "TARGET_VX" "vsbiq\t%v0,%v1,%v2,%v3" @@ -1191,11 +1140,11 @@ ; Vector subtract with borrow compute and borrow indication -(define_insn "vec_subec_u128" - [(set (match_operand:V16QI 0 "register_operand" "=v") - (unspec:V16QI [(match_operand:V16QI 1 "register_operand" "v") - (match_operand:V16QI 2 "register_operand" "v") - (match_operand:V16QI 3 "register_operand" "v")] +(define_insn "vsbcbiq" + [(set (match_operand:TI 0 "register_operand" "=v") + (unspec:TI [(match_operand:TI 1 "register_operand" "v") + (match_operand:TI 2 "register_operand" "v") + (match_operand:TI 3 "register_operand" "v")] UNSPEC_VEC_SUBEC_U128))] "TARGET_VX" "vsbcbiq\t%v0,%v1,%v2,%v3"