2023-04-25 Michael Collison <colli...@rivosinc.com> Juzhe Zhong <juzhe.zh...@rivai.ai>
* config/riscv/riscv.md (riscv_vector_preferred_simd_mode): Include vector-iterators.md. * config/riscv/vector-auto.md: New file containing autovectorization patterns. * config/riscv/vector.md: Remove include of vector-iterators.md and include vector-auto.md. --- gcc/config/riscv/riscv.md | 1 + gcc/config/riscv/vector-auto.md | 74 +++++++++++++++++++++++++++++++++ gcc/config/riscv/vector.md | 4 +- 3 files changed, 77 insertions(+), 2 deletions(-) create mode 100644 gcc/config/riscv/vector-auto.md diff --git a/gcc/config/riscv/riscv.md b/gcc/config/riscv/riscv.md index c508ee3ad89..e9b49eda617 100644 --- a/gcc/config/riscv/riscv.md +++ b/gcc/config/riscv/riscv.md @@ -140,6 +140,7 @@ (include "predicates.md") (include "constraints.md") (include "iterators.md") +(include "vector-iterators.md") ;; .................... ;; diff --git a/gcc/config/riscv/vector-auto.md b/gcc/config/riscv/vector-auto.md new file mode 100644 index 00000000000..83d2ab6957a --- /dev/null +++ b/gcc/config/riscv/vector-auto.md @@ -0,0 +1,74 @@ +;; Machine description for RISC-V 'V' Extension for GNU compiler. +;; Copyright (C) 2022-2023 Free Software Foundation, Inc. +;; Contributed by Juzhe Zhong (juzhe.zh...@rivai.ai), RiVAI Technologies Ltd. +;; Contributed by Michael Collison (colli...@rivosinc.com, Rivos Inc. + +;; This file is part of GCC. + +;; GCC is free software; you can redistribute it and/or modify +;; it under the terms of the GNU General Public License as published by +;; the Free Software Foundation; either version 3, or (at your option) +;; any later version. + +;; GCC is distributed in the hope that it will be useful, +;; but WITHOUT ANY WARRANTY; without even the implied warranty of +;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +;; GNU General Public License for more details. + +;; You should have received a copy of the GNU General Public License +;; along with GCC; see the file COPYING3. If not see +;; <http://www.gnu.org/licenses/>. + +;; len_load/len_store is a sub-optimal pattern for RVV auto-vectorization support. +;; We will replace them when len_maskload/len_maskstore is supported in loop vectorizer. +(define_expand "len_load_<mode>" + [(match_operand:V 0 "register_operand") + (match_operand:V 1 "memory_operand") + (match_operand 2 "vector_length_operand") + (match_operand 3 "const_0_operand")] + "TARGET_VECTOR" +{ + riscv_vector::emit_nonvlmax_op (code_for_pred_mov (<MODE>mode), operands[0], + operands[1], operands[2], <VM>mode); + DONE; +}) + +(define_expand "len_store_<mode>" + [(match_operand:V 0 "memory_operand") + (match_operand:V 1 "register_operand") + (match_operand 2 "vector_length_operand") + (match_operand 3 "const_0_operand")] + "TARGET_VECTOR" +{ + riscv_vector::emit_nonvlmax_op (code_for_pred_mov (<MODE>mode), operands[0], + operands[1], operands[2], <VM>mode); + DONE; +}) + +;; ------------------------------------------------------------------------- +;; ---- [INT] Vector binary patterns +;; ------------------------------------------------------------------------- + +(define_expand "<optab><mode>3" + [(set (match_operand:VI 0 "register_operand") + (any_int_binop:VI (match_operand:VI 1 "<binop_rhs1_predicate>") + (match_operand:VI 2 "<binop_rhs2_predicate>")))] + "TARGET_VECTOR" +{ + using namespace riscv_vector; + + rtx merge = RVV_VUNDEF (<MODE>mode); + rtx vl = gen_reg_rtx (Pmode); + emit_vlmax_vsetvl (<MODE>mode, vl); + rtx mask_policy = get_mask_policy_no_pred (); + rtx tail_policy = get_tail_policy_no_pred (); + rtx mask = CONSTM1_RTX(<VM>mode); + rtx vlmax_avl_p = get_avl_type_rtx (NONVLMAX); + + emit_insn (gen_pred_<optab><mode> (operands[0], mask, merge, operands[1], operands[2], + vl, tail_policy, mask_policy, vlmax_avl_p)); + + DONE; +}) + + diff --git a/gcc/config/riscv/vector.md b/gcc/config/riscv/vector.md index 1642822d098..5c9252c281b 100644 --- a/gcc/config/riscv/vector.md +++ b/gcc/config/riscv/vector.md @@ -26,8 +26,6 @@ ;; - Auto-vectorization (TBD) ;; - Combine optimization (TBD) -(include "vector-iterators.md") - (define_constants [ (INVALID_ATTRIBUTE 255) (X0_REGNUM 0) @@ -368,6 +366,8 @@ (symbol_ref "INTVAL (operands[4])")] (const_int INVALID_ATTRIBUTE))) +(include "vector-auto.md") + ;; ----------------------------------------------------------------- ;; ---- Miscellaneous Operations ;; ----------------------------------------------------------------- -- 2.34.1