From patchwork Tue Jan 31 22:07:24 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "juzhe.zhong@rivai.ai" X-Patchwork-Id: 64047 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 D39C03858C2C for ; Tue, 31 Jan 2023 22:07:52 +0000 (GMT) X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from smtpbgjp3.qq.com (smtpbgjp3.qq.com [54.92.39.34]) by sourceware.org (Postfix) with ESMTPS id AE7383858D33 for ; Tue, 31 Jan 2023 22:07:32 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org AE7383858D33 Authentication-Results: sourceware.org; dmarc=none (p=none dis=none) header.from=rivai.ai Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=rivai.ai X-QQ-mid: bizesmtp75t1675202847tpj97bj4 Received: from rios-cad5.localdomain ( [58.60.1.11]) by bizesmtp.qq.com (ESMTP) with id ; Wed, 01 Feb 2023 06:07:26 +0800 (CST) X-QQ-SSF: 01400000000000E0L000000A0000000 X-QQ-FEAT: ILHsT53NKPjfkT9OX60ZZmb5ad3dAPVHdbraeB5N5u57OnXO07WyrCJH4XLrD SZR7QUxbcsKhqOlxiP3lFkod2gPxLgFuZwjzwnYm6UvDwNwy554sQ0fWrWrFBxxIo3+abZL H/f/o+V8t0pQHh09K6GDc7TWdCeLpYcarKgKeji+I+FvOY0PobPJscLRW6FV86jQn/dEITd i0yqK+PQ3liUkN4FiuvNlJzpAC+XZQK0vUJc3Qn6SwrVOlywQVmOD9J/RJ/CT3Y7pBMZ8kb ZaYppm9c9z0Z9GFN4alMdF5hYKbzWxwAsRoIG7VsAwzz44FiF+CAWbemd+on9AD+7/9Fyhu DBsSh9Ee3Lgve0suzs548yXoywOlFFmuw9Tk/0pEC5SV6WIbY0= X-QQ-GoodBg: 2 From: juzhe.zhong@rivai.ai To: gcc-patches@gcc.gnu.org Cc: kito.cheng@gmail.com, Ju-Zhe Zhong Subject: [PATCH] RISC-V: Add RVV shift.vx C/C++ API support Date: Wed, 1 Feb 2023 06:07:24 +0800 Message-Id: <20230131220724.19131-1-juzhe.zhong@rivai.ai> X-Mailer: git-send-email 2.36.3 MIME-Version: 1.0 X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:rivai.ai:qybglogicsvr:qybglogicsvr7 X-Spam-Status: No, score=-12.8 required=5.0 tests=BAYES_00, GIT_PATCH_0, KAM_DMARC_STATUS, RCVD_IN_DNSWL_NONE, SPF_HELO_PASS, 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.29 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 Sender: "Gcc-patches" From: Ju-Zhe Zhong gcc/ChangeLog: * config/riscv/predicates.md (pmode_reg_or_uimm5_operand): New predicate. * config/riscv/riscv-vector-builtins-bases.cc: New class. * config/riscv/riscv-vector-builtins-functions.def (vsll): Ditto. (vsra): Ditto. (vsrl): Ditto. * config/riscv/riscv-vector-builtins.cc: Ditto. * config/riscv/vector.md (@pred__scalar): New pattern. --- gcc/config/riscv/predicates.md | 8 ++++++ .../riscv/riscv-vector-builtins-bases.cc | 10 ++++++- .../riscv/riscv-vector-builtins-functions.def | 3 +++ gcc/config/riscv/riscv-vector-builtins.cc | 13 ++++++++++ gcc/config/riscv/vector.md | 26 +++++++++++++++++++ 5 files changed, 59 insertions(+), 1 deletion(-) diff --git a/gcc/config/riscv/predicates.md b/gcc/config/riscv/predicates.md index 57f7ddfbd7d..895831443e1 100644 --- a/gcc/config/riscv/predicates.md +++ b/gcc/config/riscv/predicates.md @@ -301,6 +301,14 @@ (and (match_code "const_vector") (match_test "riscv_vector::const_vec_all_same_in_range_p (op, 0, 31)")))) +;; pmode_reg_or_uimm5_operand can be used by vsll.vx/vsrl.vx/vsra.vx instructions. +;; Since it has the same predicate with vector_length_operand which allows register +;; or immediate (0 ~ 31), we define this predicate same as vector_length_operand here. +;; We don't use vector_length_operand directly to predicate vsll.vx/vsrl.vx/vsra.vx +;; since it may be confusing. +(define_special_predicate "pmode_reg_or_uimm5_operand" + (match_operand 0 "vector_length_operand")) + (define_special_predicate "pmode_reg_or_0_operand" (ior (match_operand 0 "const_0_operand") (match_operand 0 "pmode_register_operand"))) diff --git a/gcc/config/riscv/riscv-vector-builtins-bases.cc b/gcc/config/riscv/riscv-vector-builtins-bases.cc index f4256fedc5b..00d357a0d36 100644 --- a/gcc/config/riscv/riscv-vector-builtins-bases.cc +++ b/gcc/config/riscv/riscv-vector-builtins-bases.cc @@ -163,7 +163,15 @@ class binop : public function_base public: rtx expand (function_expander &e) const override { - return e.use_exact_insn (code_for_pred (CODE, e.vector_mode ())); + switch (e.op_info->op) + { + case OP_TYPE_vx: + return e.use_exact_insn (code_for_pred_scalar (CODE, e.vector_mode ())); + case OP_TYPE_vv: + return e.use_exact_insn (code_for_pred (CODE, e.vector_mode ())); + default: + gcc_unreachable (); + } } }; diff --git a/gcc/config/riscv/riscv-vector-builtins-functions.def b/gcc/config/riscv/riscv-vector-builtins-functions.def index 9f9678ab6dd..b543946c72e 100644 --- a/gcc/config/riscv/riscv-vector-builtins-functions.def +++ b/gcc/config/riscv/riscv-vector-builtins-functions.def @@ -80,5 +80,8 @@ DEF_RVV_FUNCTION (vdiv, binop, full_preds, iu_vvv_ops) DEF_RVV_FUNCTION (vrem, binop, full_preds, iu_vvv_ops) DEF_RVV_FUNCTION (vdivu, binop, full_preds, iu_vvv_ops) DEF_RVV_FUNCTION (vremu, binop, full_preds, iu_vvv_ops) +DEF_RVV_FUNCTION (vsll, binop, full_preds, iu_shift_vvx_ops) +DEF_RVV_FUNCTION (vsra, binop, full_preds, iu_shift_vvx_ops) +DEF_RVV_FUNCTION (vsrl, binop, full_preds, iu_shift_vvx_ops) #undef DEF_RVV_FUNCTION diff --git a/gcc/config/riscv/riscv-vector-builtins.cc b/gcc/config/riscv/riscv-vector-builtins.cc index 3a6c2c7c6f2..12fea2b3594 100644 --- a/gcc/config/riscv/riscv-vector-builtins.cc +++ b/gcc/config/riscv/riscv-vector-builtins.cc @@ -249,6 +249,11 @@ static CONSTEXPR const rvv_arg_type_info shift_vv_args[] = {rvv_arg_type_info (RVV_BASE_vector), rvv_arg_type_info (RVV_BASE_shift_vector), rvv_arg_type_info_end}; +/* A list of args for vector_type func (vector_type, size) function. */ +static CONSTEXPR const rvv_arg_type_info vector_size_args[] + = {rvv_arg_type_info (RVV_BASE_vector), rvv_arg_type_info (RVV_BASE_size), + rvv_arg_type_info_end}; + /* A list of none preds that will be registered for intrinsic functions. */ static CONSTEXPR const predication_type_index none_preds[] = {PRED_TYPE_none, NUM_PRED_TYPES}; @@ -405,6 +410,14 @@ static CONSTEXPR const rvv_op_info iu_shift_vvv_ops rvv_arg_type_info (RVV_BASE_vector), /* Return type */ shift_vv_args /* Args */}; +/* A static operand information for vector_type func (vector_type, size_t) + * function registration. */ +static CONSTEXPR const rvv_op_info iu_shift_vvx_ops + = {iu_ops, /* Types */ + OP_TYPE_vx, /* Suffix */ + rvv_arg_type_info (RVV_BASE_vector), /* Return type */ + vector_size_args /* Args */}; + /* A list of all RVV intrinsic functions. */ static function_group_info function_groups[] = { #define DEF_RVV_FUNCTION(NAME, SHAPE, PREDS, OPS_INFO) \ diff --git a/gcc/config/riscv/vector.md b/gcc/config/riscv/vector.md index e8d75f164e3..36b0e07728c 100644 --- a/gcc/config/riscv/vector.md +++ b/gcc/config/riscv/vector.md @@ -1148,3 +1148,29 @@ v\t%0,%p1" [(set_attr "type" "") (set_attr "mode" "")]) + +;; vx instructions patterns. +;; Note: Unlike vv patterns, we should split them since they are variant. +;; For vsll.vx/vsra.vx/vsrl.vx the scalar mode should be Pmode wheras the +;; scalar mode is inner mode of the RVV mode for other vx patterns. +(define_insn "@pred__scalar" + [(set (match_operand:VI 0 "register_operand" "=vr, vr") + (if_then_else:VI + (unspec: + [(match_operand: 1 "vector_mask_operand" "vmWc1,vmWc1") + (match_operand 5 "vector_length_operand" " rK, rK") + (match_operand 6 "const_int_operand" " i, i") + (match_operand 7 "const_int_operand" " i, i") + (match_operand 8 "const_int_operand" " i, i") + (reg:SI VL_REGNUM) + (reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE) + (any_shift:VI + (match_operand:VI 3 "register_operand" " vr, vr") + (match_operand 4 "pmode_reg_or_uimm5_operand" " r, K")) + (match_operand:VI 2 "vector_merge_operand" "0vu, 0vu")))] + "TARGET_VECTOR" + "@ + v.vx\t%0,%3,%4%p1 + v.vi\t%0,%3,%4%p1" + [(set_attr "type" "vshift") + (set_attr "mode" "")])