From patchwork Fri Nov 3 03:26:34 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Li, Pan2" X-Patchwork-Id: 161155 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a59:8f47:0:b0:403:3b70:6f57 with SMTP id j7csp781772vqu; Thu, 2 Nov 2023 20:27:15 -0700 (PDT) X-Google-Smtp-Source: AGHT+IE9li8dCmi23fbWt5CHe3w7yc8wt9jQ9hrTO/bltCfrbGzu6+0fNw1eSDBYyVYqnSu2Ee2g X-Received: by 2002:ac8:570a:0:b0:41c:cf9d:aa0 with SMTP id 10-20020ac8570a000000b0041ccf9d0aa0mr21176835qtw.32.1698982035484; Thu, 02 Nov 2023 20:27:15 -0700 (PDT) ARC-Seal: i=2; a=rsa-sha256; t=1698982035; cv=pass; d=google.com; s=arc-20160816; b=eNEY2bIc9JSLDoQmuc1jHERccN01yO3aP8u+XijnF6wCDVR2THVChOSIY5MxW8TP+B dfLcgJbDjoLH0eBsAnNF7Nqlj4ptBtNXmAV9s4kDUd3HNpbzYRtxAAfZsajYGH7qREd6 PCrgqpHQd8fKpSN8I2Vy8ppcATTlmVnbjYpR1qUn6Ar8T+vDLh7bOmNXrxem8w+3swI5 NB91o6mr80BJAmgg3W7/9uZLj6eVVm7WQ2RzCYPXHQSxy15YO3T6Vj+2Te2BogEE/Wck FU8KN2u/isrLkGkMykFUp3x/c0jf0OxTMQ6OUUh2wkMRJ/pidClcPk6yaiqT8h/eRpvS Cv3A== ARC-Message-Signature: i=2; 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 :mime-version:references:in-reply-to:message-id:date:subject:cc:to :from:dkim-signature:arc-filter:dmarc-filter:delivered-to; bh=jQ40G2uioL8d2XDdjKuvMrjA45NgtnyyS6jMYPd0Els=; fh=yqBQmCEeFYB2Wjmf8l8QkV/dOy5iKwSEx/iU/FYQjxU=; b=F05T1Rs2tduXPEbIcz6l+l0lNAZbz5kRDLBz9GwkGuYeARITBM13lYBzydPbOSunLq odqfbzVAtuD4dkIavDiKXdTgtlv4e80BtGxZuTv80Bvc86qOjP+yc+cAgY3ud0jpIYJ5 /NB1QV41PuD18LXGpNZG0BUgcuUUpquzORiqjeg/qp4tTbHD5OFQC0x7zbY1DVnzz3Y9 /06bxpALQinBZPoVOIyFCNBoi8lFoK9uHZT2sTEjL2iY4pheEIZTrJ9yRns9moCfE09k DFQ66gab97TwHEvBjOtGIvj4AgrxsOHxKUqG9oGexTJZ4avBgDVbXNKCjrtL1TA1MNjx k9Qg== ARC-Authentication-Results: i=2; mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="P/j4dcTq"; arc=pass (i=1); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from server2.sourceware.org (server2.sourceware.org. [2620:52:3:1:0:246e:9693:128c]) by mx.google.com with ESMTPS id i9-20020ac85e49000000b00419767968dfsi745872qtx.7.2023.11.02.20.27.15 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 02 Nov 2023 20:27:15 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) client-ip=2620:52:3:1:0:246e:9693:128c; Authentication-Results: mx.google.com; dkim=pass header.i=@intel.com header.s=Intel header.b="P/j4dcTq"; arc=pass (i=1); spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 2620:52:3:1:0:246e:9693:128c as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=intel.com Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 3A40C3858C30 for ; Fri, 3 Nov 2023 03:27:15 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from mgamail.intel.com (mgamail.intel.com [192.55.52.93]) by sourceware.org (Postfix) with ESMTPS id 6F0973858D32 for ; Fri, 3 Nov 2023 03:26:40 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 6F0973858D32 Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=intel.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 6F0973858D32 Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=192.55.52.93 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1698982011; cv=none; b=XJWcw6+HjZL75r/5T5z0U1jR2zF3E1BokSd5pVyQ5DSbTLXkgMGHpZTRrscYf5z/qyBdc3mQIcGdowhOE3zby1vgNHXphAP2MWS8J3/EsvgI6O8B4OvP4LRAdVHw+5QFF1PIEJaCrc0GRVUEHGPHxLI2sQbiBu90dr2tOjrwIOk= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1698982011; c=relaxed/simple; bh=2xg+IW0/FRfruEvr0BK+4UVxU4lO+sP0hIbVsgnDmLU=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=t4nuaTYuXI+tbjOzY2vppwVTsovVVr9N98N2V090Uy5Q1+BQhmxN+gfg72MexaN99EQOx8XZEx5XNyjIX+dfSkQ34HZ9PIpY6FC4S6yhAho+QwtYv4KFEWCXd1IipIq2uu7UM/oUEkFZL2pLhYQvIGb0g34P/Kg3XDqJ+cHUtqM= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1698982000; x=1730518000; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=2xg+IW0/FRfruEvr0BK+4UVxU4lO+sP0hIbVsgnDmLU=; b=P/j4dcTqoxT9hpTd003d2nROVnHt88ddU5k9EAuOnmiRL7mX3zSBTpqi hyfnmeXEBrnIgo7bSoTutH8lhtpwUlxJ7Y6GhCNwogLELoAneeDrmITWn W8RjA1f7ZY2VUnhxYpee0FVhub5FItwSjXEEx1YLVyPdfDXbvTAAiv3zz RymMJW3HdHzTleITBSNv+Ovk9/HDZ1bOR3ZfKHmuJ1xlNv946TGI0XJle arlPeUDFsJ16njaqkjVjHehvHA+eN24GBuZQvTHmiWJUN36QFcwu/nu2p 9DvY5x6xaIPiSZDYzAEMU7K5UoAGvX85ScZoW3jpq/YyzGolllP2hBR1e Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10882"; a="386041531" X-IronPort-AV: E=Sophos;i="6.03,273,1694761200"; d="scan'208";a="386041531" Received: from orsmga004.jf.intel.com ([10.7.209.38]) by fmsmga102.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 02 Nov 2023 20:26:38 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10882"; a="885093936" X-IronPort-AV: E=Sophos;i="6.03,273,1694761200"; d="scan'208";a="885093936" Received: from shvmail02.sh.intel.com ([10.239.244.9]) by orsmga004.jf.intel.com with ESMTP; 02 Nov 2023 20:26:36 -0700 Received: from pli-ubuntu.sh.intel.com (pli-ubuntu.sh.intel.com [10.239.159.47]) by shvmail02.sh.intel.com (Postfix) with ESMTP id F09DF1005669; Fri, 3 Nov 2023 11:26:35 +0800 (CST) From: pan2.li@intel.com To: gcc-patches@gcc.gnu.org Cc: juzhe.zhong@rivai.ai, pan2.li@intel.com, yanzhang.wang@intel.com, kito.cheng@gmail.com Subject: [PATCH v2] RISC-V: Refactor prefix [I/L/LL] rounding API autovec iterator Date: Fri, 3 Nov 2023 11:26:34 +0800 Message-Id: <20231103032634.2983364-1-pan2.li@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20231102114802.17020-1-pan2.li@intel.com> References: <20231102114802.17020-1-pan2.li@intel.com> MIME-Version: 1.0 X-Spam-Status: No, score=-11.4 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, SPF_HELO_NONE, SPF_NONE, TXREP, T_SCC_BODY_TEXT_LINE 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: 1781452740693426813 X-GMAIL-MSGID: 1781511786941390958 From: Pan Li Update in v2: * Add mode size equal check to disable different mode size when expand, because the underlying codegen is not implemented yet. Original log: The previous rounding API start with i/l/ll only works on the same mode types. For example as below, and we arrange the iterator similar to fcvt. * SF => SI * DF => DI After we refined this limination from middle-end, these API can also vectorized with different type sizes, aka: * HF => SI, HF => DI * SF => DI, SF => SI * DF => SI, DF => DI Then the iterator cannot take care of this simply and this patch would like to re-arrange the iterator in two items. * V_VLS_F_CONVERT_SI: handle (HF, SF, DF) => SI * V_VLS_F_CONVERT_DI: handle (HF, SF, DF) => DI As well as related mode_attr to reconcile the new iterator. gcc/ChangeLog: * config/riscv/autovec.md (lrint2): Remove. (lround2): Ditto. (lceil2): Ditto. (lfloor2): Ditto. (lrint2): New pattern for cvt from FP to SI. (lround2): Ditto. (lceil2): Ditto. (lfloor2): Ditto. (lrint2): New pattern for cvt from FP to DI. (lround2): Ditto. (lceil2): Ditto. (lfloor2): Ditto. * config/riscv/vector-iterators.md: Renew iterators for both the SI and DI. Signed-off-by: Pan Li Signed-off-by: Pan Li --- gcc/config/riscv/autovec.md | 90 +++++++++--- gcc/config/riscv/vector-iterators.md | 199 ++++++++++++++++++++++++--- 2 files changed, 251 insertions(+), 38 deletions(-) diff --git a/gcc/config/riscv/autovec.md b/gcc/config/riscv/autovec.md index f5e3e347ace..cc4c9596bbf 100644 --- a/gcc/config/riscv/autovec.md +++ b/gcc/config/riscv/autovec.md @@ -2395,42 +2395,92 @@ (define_expand "roundeven2" } ) -(define_expand "lrint2" - [(match_operand: 0 "register_operand") - (match_operand:V_VLS_FCONVERT_I_L_LL 1 "register_operand")] - "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math" +;; Add mode_size equal check as we opened the modes for different sizes. +;; The check will be removed soon after related codegen implemented +(define_expand "lrint2" + [(match_operand: 0 "register_operand") + (match_operand:V_VLS_F_CONVERT_SI 1 "register_operand")] + "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math + && known_eq (GET_MODE_SIZE (mode), GET_MODE_SIZE (mode))" { - riscv_vector::expand_vec_lrint (operands[0], operands[1], mode, mode); + riscv_vector::expand_vec_lrint (operands[0], operands[1], mode, mode); DONE; } ) -(define_expand "lround2" - [(match_operand: 0 "register_operand") - (match_operand:V_VLS_FCONVERT_I_L_LL 1 "register_operand")] - "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math" +(define_expand "lrint2" + [(match_operand: 0 "register_operand") + (match_operand:V_VLS_F_CONVERT_DI 1 "register_operand")] + "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math + && known_eq (GET_MODE_SIZE (mode), GET_MODE_SIZE (mode))" { - riscv_vector::expand_vec_lround (operands[0], operands[1], mode, mode); + riscv_vector::expand_vec_lrint (operands[0], operands[1], mode, mode); DONE; } ) -(define_expand "lceil2" - [(match_operand: 0 "register_operand") - (match_operand:V_VLS_FCONVERT_I_L_LL 1 "register_operand")] - "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math" +(define_expand "lround2" + [(match_operand: 0 "register_operand") + (match_operand:V_VLS_F_CONVERT_SI 1 "register_operand")] + "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math + && known_eq (GET_MODE_SIZE (mode), GET_MODE_SIZE (mode))" { - riscv_vector::expand_vec_lceil (operands[0], operands[1], mode, mode); + riscv_vector::expand_vec_lround (operands[0], operands[1], mode, mode); DONE; } ) -(define_expand "lfloor2" - [(match_operand: 0 "register_operand") - (match_operand:V_VLS_FCONVERT_I_L_LL 1 "register_operand")] - "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math" +(define_expand "lround2" + [(match_operand: 0 "register_operand") + (match_operand:V_VLS_F_CONVERT_DI 1 "register_operand")] + "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math + && known_eq (GET_MODE_SIZE (mode), GET_MODE_SIZE (mode))" + { + riscv_vector::expand_vec_lround (operands[0], operands[1], mode, mode); + DONE; + } +) + +(define_expand "lceil2" + [(match_operand: 0 "register_operand") + (match_operand:V_VLS_F_CONVERT_SI 1 "register_operand")] + "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math + && known_eq (GET_MODE_SIZE (mode), GET_MODE_SIZE (mode))" + { + riscv_vector::expand_vec_lceil (operands[0], operands[1], mode, mode); + DONE; + } +) + +(define_expand "lceil2" + [(match_operand: 0 "register_operand") + (match_operand:V_VLS_F_CONVERT_DI 1 "register_operand")] + "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math + && known_eq (GET_MODE_SIZE (mode), GET_MODE_SIZE (mode))" + { + riscv_vector::expand_vec_lceil (operands[0], operands[1], mode, mode); + DONE; + } +) + +(define_expand "lfloor2" + [(match_operand: 0 "register_operand") + (match_operand:V_VLS_F_CONVERT_SI 1 "register_operand")] + "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math + && known_eq (GET_MODE_SIZE (mode), GET_MODE_SIZE (mode))" + { + riscv_vector::expand_vec_lfloor (operands[0], operands[1], mode, mode); + DONE; + } +) + +(define_expand "lfloor2" + [(match_operand: 0 "register_operand") + (match_operand:V_VLS_F_CONVERT_DI 1 "register_operand")] + "TARGET_VECTOR && !flag_trapping_math && !flag_rounding_math + && known_eq (GET_MODE_SIZE (mode), GET_MODE_SIZE (mode))" { - riscv_vector::expand_vec_lfloor (operands[0], operands[1], mode, mode); + riscv_vector::expand_vec_lfloor (operands[0], operands[1], mode, mode); DONE; } ) diff --git a/gcc/config/riscv/vector-iterators.md b/gcc/config/riscv/vector-iterators.md index d9b5dec5edb..f2d9f60b631 100644 --- a/gcc/config/riscv/vector-iterators.md +++ b/gcc/config/riscv/vector-iterators.md @@ -3175,44 +3175,104 @@ (define_mode_attr vnnconvert [ (V512DI "v512hf") ]) -;; Convert to int, long and long long -(define_mode_attr V_I_L_LL_CONVERT [ +;; +;; Convert float (VHF, VSF, VDF) to VSI/VDI. +;; The are sorts of rounding mode return integer (take rint as example) +;; - irint +;; - lrint +;; - llrint +;; +;; The long type has different bitsize in RV32 and RV64 makes them even +;; more complicated, details as below. +;; +------------+------------------+------------------+ +;; | builtin | RV32 | RV64 | +;; +------------+------------------+------------------+ +;; | lrintf16 | HF => SI | HF => DI | +;; +------------+------------------+------------------+ +;; | lrintf | SF => SI | SF => DI | +;; +------------+------------------+------------------+ +;; | lrint | DF => SI | DF => DI | +;; +------------+------------------+------------------+ +;; | llrintf16 | HF => DI | Same as RV32 | +;; +------------+------------------+------------------+ +;; | llrintf | SF => DI | Same as RV32 | +;; +------------+------------------+------------------+ +;; | llrint | DF => DI | Same as RV32 | +;; +------------+------------------+------------------+ +;; | irintf16 | HF => SI | Same as RV32 | +;; +------------+------------------+------------------+ +;; | irintf | SF => SI | Same as RV32 | +;; +------------+------------------+------------------+ +;; | irint | DF => SI | Same as RV32 | +;; +------------+------------------+------------------+ +;; +;; The [i/l/ll]rint share the same standard name lrint, +;; and both the RV32 and RV64 has the cases to the SI and DI. +;; For example, both RV32 and RV64 has the below convert: +;; +;; HF => SI (RV32: lrintf16) (RV64: irintf16) +;; HF => DI (RV32: llrintf16) (RV64: lrintf16) +;; +;; Due to we cannot define a mode_attr mapping one HF to both +;; the SI and DI, we use 2 different mode_atter to cover all +;; the combination as above, as well as the different iterator +;; for the lrint patterns. Aka: +;; +;; V_F2SI_CONVERT: (HF, SF, DF) => SI +;; V_F2DI_CONVERT: (HF, SF, DF) => DI +;; +(define_mode_attr V_F2SI_CONVERT [ + (RVVM4HF "RVVM8SI") (RVVM2HF "RVVM4SI") (RVVM1HF "RVVM2SI") + (RVVMF2HF "RVVM1SI") (RVVMF4HF "RVVMF2SI") + (RVVM8SF "RVVM8SI") (RVVM4SF "RVVM4SI") (RVVM2SF "RVVM2SI") (RVVM1SF "RVVM1SI") (RVVMF2SF "RVVMF2SI") - (RVVM8DF "RVVM8DI") (RVVM4DF "RVVM4DI") (RVVM2DF "RVVM2DI") - (RVVM1DF "RVVM1DI") + (RVVM8DF "RVVM4SI") (RVVM4DF "RVVM2SI") (RVVM2DF "RVVM1SI") + (RVVM1DF "RVVMF2SI") + + (V1HF "V1SI") (V2HF "V2SI") (V4HF "V4SI") (V8HF "V8SI") (V16HF "V16SI") + (V32HF "V32SI") (V64HF "V64SI") (V128HF "V128SI") (V256HF "V256SI") + (V512HF "V512SI") (V1024HF "V1024SI") (V1SF "V1SI") (V2SF "V2SI") (V4SF "V4SI") (V8SF "V8SI") (V16SF "V16SI") (V32SF "V32SI") (V64SF "V64SI") (V128SF "V128SI") (V256SF "V256SI") (V512SF "V512SI") (V1024SF "V1024SI") - (V1DF "V1DI") (V2DF "V2DI") (V4DF "V4DI") (V8DF "V8DI") (V16DF "V16DI") - (V32DF "V32DI") (V64DF "V64DI") (V128DF "V128DI") (V256DF "V256DI") - (V512DF "V512DI") + (V1DF "V1SI") (V2DF "V2SI") (V4DF "V4SI") (V8DF "V8SI") (V16DF "V16SI") + (V32DF "V32SI") (V64DF "V64SI") (V128DF "V128SI") (V256DF "V256SI") + (V512DF "V512SI") ]) -(define_mode_attr v_i_l_ll_convert [ +(define_mode_attr v_f2si_convert [ + (RVVM4HF "rvvm8si") (RVVM2HF "rvvm4si") (RVVM1HF "rvvm2si") + (RVVMF2HF "rvvm1si") (RVVMF4HF "rvvmf2si") + (RVVM8SF "rvvm8si") (RVVM4SF "rvvm4si") (RVVM2SF "rvvm2si") (RVVM1SF "rvvm1si") (RVVMF2SF "rvvmf2si") - (RVVM8DF "rvvm8di") (RVVM4DF "rvvm4di") (RVVM2DF "rvvm2di") - (RVVM1DF "rvvm1di") + (RVVM8DF "rvvm4si") (RVVM4DF "rvvm2si") (RVVM2DF "rvvm1si") + (RVVM1DF "rvvmf2si") + + (V1HF "v1si") (V2HF "v2si") (V4HF "v4si") (V8HF "v8si") (V16HF "v16si") + (V32HF "v32si") (V64HF "v64si") (V128HF "v128si") (V256HF "v256si") + (V512HF "v512si") (V1024HF "v1024si") (V1SF "v1si") (V2SF "v2si") (V4SF "v4si") (V8SF "v8si") (V16SF "v16si") (V32SF "v32si") (V64SF "v64si") (V128SF "v128si") (V256SF "v256si") (V512SF "v512si") (V1024SF "v1024si") - (V1DF "v1di") (V2DF "v2di") (V4DF "v4di") (V8DF "v8di") (V16DF "v16di") - (V32DF "v32di") (V64DF "v64di") (V128DF "v128di") (V256DF "v256di") - (V512DF "v512di") + (V1DF "v1si") (V2DF "v2si") (V4DF "v4si") (V8DF "v8si") (V16DF "v16si") + (V32DF "v32si") (V64DF "v64si") (V128DF "v128si") (V256DF "v256si") + (V512DF "v512si") ]) -(define_mode_iterator V_VLS_FCONVERT_I_L_LL [ - (RVVM8SF "TARGET_VECTOR_ELEN_FP_32") - (RVVM4SF "TARGET_VECTOR_ELEN_FP_32") - (RVVM2SF "TARGET_VECTOR_ELEN_FP_32") - (RVVM1SF "TARGET_VECTOR_ELEN_FP_32") +(define_mode_iterator V_VLS_F_CONVERT_SI [ + (RVVM4HF "TARGET_ZVFH") (RVVM2HF "TARGET_ZVFH") (RVVM1HF "TARGET_ZVFH") + (RVVMF2HF "TARGET_ZVFH") (RVVMF4HF "TARGET_ZVFH && TARGET_MIN_VLEN > 32") + + (RVVM8SF "TARGET_VECTOR_ELEN_FP_32") (RVVM4SF "TARGET_VECTOR_ELEN_FP_32") + (RVVM2SF "TARGET_VECTOR_ELEN_FP_32") (RVVM1SF "TARGET_VECTOR_ELEN_FP_32") (RVVMF2SF "TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN > 32") (RVVM8DF "TARGET_VECTOR_ELEN_FP_64") @@ -3220,6 +3280,18 @@ (define_mode_iterator V_VLS_FCONVERT_I_L_LL [ (RVVM2DF "TARGET_VECTOR_ELEN_FP_64") (RVVM1DF "TARGET_VECTOR_ELEN_FP_64") + (V1HF "riscv_vector::vls_mode_valid_p (V1HFmode) && TARGET_ZVFH") + (V2HF "riscv_vector::vls_mode_valid_p (V2HFmode) && TARGET_ZVFH") + (V4HF "riscv_vector::vls_mode_valid_p (V4HFmode) && TARGET_ZVFH") + (V8HF "riscv_vector::vls_mode_valid_p (V8HFmode) && TARGET_ZVFH") + (V16HF "riscv_vector::vls_mode_valid_p (V16HFmode) && TARGET_ZVFH") + (V32HF "riscv_vector::vls_mode_valid_p (V32HFmode) && TARGET_ZVFH && TARGET_MIN_VLEN >= 64") + (V64HF "riscv_vector::vls_mode_valid_p (V64HFmode) && TARGET_ZVFH && TARGET_MIN_VLEN >= 128") + (V128HF "riscv_vector::vls_mode_valid_p (V128HFmode) && TARGET_ZVFH && TARGET_MIN_VLEN >= 256") + (V256HF "riscv_vector::vls_mode_valid_p (V256HFmode) && TARGET_ZVFH && TARGET_MIN_VLEN >= 512") + (V512HF "riscv_vector::vls_mode_valid_p (V512HFmode) && TARGET_ZVFH && TARGET_MIN_VLEN >= 1024") + (V1024HF "riscv_vector::vls_mode_valid_p (V1024HFmode) && TARGET_ZVFH && TARGET_MIN_VLEN >= 2048") + (V1SF "riscv_vector::vls_mode_valid_p (V1SFmode) && TARGET_VECTOR_ELEN_FP_32") (V2SF "riscv_vector::vls_mode_valid_p (V2SFmode) && TARGET_VECTOR_ELEN_FP_32") (V4SF "riscv_vector::vls_mode_valid_p (V4SFmode) && TARGET_VECTOR_ELEN_FP_32") @@ -3244,6 +3316,97 @@ (define_mode_iterator V_VLS_FCONVERT_I_L_LL [ (V512DF "riscv_vector::vls_mode_valid_p (V512DFmode) && TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 4096") ]) +(define_mode_attr V_F2DI_CONVERT [ + (RVVM2HF "RVVM8DI") (RVVM1HF "RVVM4DI") (RVVMF2HF "RVVM2DI") + (RVVMF4HF "RVVM1DI") + + (RVVM4SF "RVVM8DI") (RVVM2SF "RVVM4DI") (RVVM1SF "RVVM2DI") + (RVVMF2SF "RVVM1DI") + + (RVVM8DF "RVVM8DI") (RVVM4DF "RVVM4DI") (RVVM2DF "RVVM2DI") + (RVVM1DF "RVVM1DI") + + (V1HF "V1DI") (V2HF "V2DI") (V4HF "V4DI") (V8HF "V8DI") (V16HF "V16DI") + (V32HF "V32DI") (V64HF "V64DI") (V128HF "V128DI") (V256HF "V256DI") + (V512HF "V512DI") + + (V1SF "V1DI") (V2SF "V2DI") (V4SF "V4DI") (V8SF "V8DI") (V16SF "V16DI") + (V32SF "V32DI") (V64SF "V64DI") (V128SF "V128DI") (V256SF "V256DI") + (V512SF "V512DI") + + (V1DF "V1DI") (V2DF "V2DI") (V4DF "V4DI") (V8DF "V8DI") (V16DF "V16DI") + (V32DF "V32DI") (V64DF "V64DI") (V128DF "V128DI") (V256DF "V256DI") + (V512DF "V512DI") +]) + +(define_mode_attr v_f2di_convert [ + (RVVM2HF "rvvm8di") (RVVM1HF "rvvm4di") (RVVMF2HF "rvvm2di") + (RVVMF4HF "rvvm1di") + + (RVVM4SF "rvvm8di") (RVVM2SF "rvvm4di") (RVVM1SF "rvvm2di") + (RVVMF2SF "rvvm1di") + + (RVVM8DF "rvvm8di") (RVVM4DF "rvvm4di") (RVVM2DF "rvvm2di") + (RVVM1DF "rvvm1di") + + (V1HF "v1di") (V2HF "v2di") (V4HF "v4di") (V8HF "v8di") (V16HF "v16di") + (V32HF "v32di") (V64HF "v64di") (V128HF "v128di") (V256HF "v256di") + (V512HF "v512di") + + (V1SF "v1di") (V2SF "v2di") (V4SF "v4di") (V8SF "v8di") (V16SF "v16di") + (V32SF "v32di") (V64SF "v64di") (V128SF "v128di") (V256SF "v256di") + (V512SF "v512di") + + (V1DF "v1di") (V2DF "v2di") (V4DF "v4di") (V8DF "v8di") (V16DF "v16di") + (V32DF "v32di") (V64DF "v64di") (V128DF "v128di") (V256DF "v256di") + (V512DF "v512di") +]) + +(define_mode_iterator V_VLS_F_CONVERT_DI [ + (RVVM2HF "TARGET_ZVFH") (RVVM1HF "TARGET_ZVFH") (RVVMF2HF "TARGET_ZVFH") + (RVVMF4HF "TARGET_ZVFH && TARGET_MIN_VLEN > 32") + + (RVVM4SF "TARGET_VECTOR_ELEN_FP_32") (RVVM2SF "TARGET_VECTOR_ELEN_FP_32") + (RVVM1SF "TARGET_VECTOR_ELEN_FP_32") + (RVVMF2SF "TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN > 32") + + (RVVM8DF "TARGET_VECTOR_ELEN_FP_64") (RVVM4DF "TARGET_VECTOR_ELEN_FP_64") + (RVVM2DF "TARGET_VECTOR_ELEN_FP_64") (RVVM1DF "TARGET_VECTOR_ELEN_FP_64") + + (V1HF "riscv_vector::vls_mode_valid_p (V1HFmode) && TARGET_ZVFH") + (V2HF "riscv_vector::vls_mode_valid_p (V2HFmode) && TARGET_ZVFH") + (V4HF "riscv_vector::vls_mode_valid_p (V4HFmode) && TARGET_ZVFH") + (V8HF "riscv_vector::vls_mode_valid_p (V8HFmode) && TARGET_ZVFH") + (V16HF "riscv_vector::vls_mode_valid_p (V16HFmode) && TARGET_ZVFH") + (V32HF "riscv_vector::vls_mode_valid_p (V32HFmode) && TARGET_ZVFH && TARGET_MIN_VLEN >= 64") + (V64HF "riscv_vector::vls_mode_valid_p (V64HFmode) && TARGET_ZVFH && TARGET_MIN_VLEN >= 128") + (V128HF "riscv_vector::vls_mode_valid_p (V128HFmode) && TARGET_ZVFH && TARGET_MIN_VLEN >= 256") + (V256HF "riscv_vector::vls_mode_valid_p (V256HFmode) && TARGET_ZVFH && TARGET_MIN_VLEN >= 512") + (V512HF "riscv_vector::vls_mode_valid_p (V512HFmode) && TARGET_ZVFH && TARGET_MIN_VLEN >= 1024") + + (V1SF "riscv_vector::vls_mode_valid_p (V1SFmode) && TARGET_VECTOR_ELEN_FP_32") + (V2SF "riscv_vector::vls_mode_valid_p (V2SFmode) && TARGET_VECTOR_ELEN_FP_32") + (V4SF "riscv_vector::vls_mode_valid_p (V4SFmode) && TARGET_VECTOR_ELEN_FP_32") + (V8SF "riscv_vector::vls_mode_valid_p (V8SFmode) && TARGET_VECTOR_ELEN_FP_32") + (V16SF "riscv_vector::vls_mode_valid_p (V16SFmode) && TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 64") + (V32SF "riscv_vector::vls_mode_valid_p (V32SFmode) && TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 128") + (V64SF "riscv_vector::vls_mode_valid_p (V64SFmode) && TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 256") + (V128SF "riscv_vector::vls_mode_valid_p (V128SFmode) && TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 512") + (V256SF "riscv_vector::vls_mode_valid_p (V256SFmode) && TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 1024") + (V512SF "riscv_vector::vls_mode_valid_p (V512SFmode) && TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN >= 2048") + + (V1DF "riscv_vector::vls_mode_valid_p (V1DFmode) && TARGET_VECTOR_ELEN_FP_64") + (V2DF "riscv_vector::vls_mode_valid_p (V2DFmode) && TARGET_VECTOR_ELEN_FP_64") + (V4DF "riscv_vector::vls_mode_valid_p (V4DFmode) && TARGET_VECTOR_ELEN_FP_64") + (V8DF "riscv_vector::vls_mode_valid_p (V8DFmode) && TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 64") + (V16DF "riscv_vector::vls_mode_valid_p (V16DFmode) && TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 128") + (V32DF "riscv_vector::vls_mode_valid_p (V32DFmode) && TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 256") + (V64DF "riscv_vector::vls_mode_valid_p (V64DFmode) && TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 512") + (V128DF "riscv_vector::vls_mode_valid_p (V128DFmode) && TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 1024") + (V256DF "riscv_vector::vls_mode_valid_p (V256DFmode) && TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 2048") + (V512DF "riscv_vector::vls_mode_valid_p (V512DFmode) && TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >= 4096") +]) + (define_mode_attr VDEMOTE [ (RVVM8DI "RVVM8SI") (RVVM4DI "RVVM4SI") (RVVM2DI "RVVM2SI") (RVVM1DI "RVVM1SI") (V1DI "V1SI")