On 7/17/24 4:55 AM, demin.han wrote:
There are still some cases which can't utilize vx or vf for autovec
comparison after last_combine pass.

1. integer comparison when imm isn't in range of [-16, 15]
2. float imm is 0.0
3. DI or DF mode under RV32

This patch fix above mentioned issues.

Tested on RV32 and RV64.

gcc/ChangeLog:

        * config/riscv/autovec.md: register_operand to nonmemory_operand
        * config/riscv/riscv-v.cc (get_cmp_insn_code): Select code according
     * to scalar_p
        (expand_vec_cmp): Generate scalar_p and transform op1
        * config/riscv/riscv.cc (riscv_const_insns): Add !FLOAT_MODE_P
     * constrain
        * config/riscv/vector.md: Add !FLOAT_MODE_P constrain

gcc/testsuite/ChangeLog:

        * gcc.target/riscv/rvv/autovec/binop/vadd-rv32gcv-nofm.c: Fix test
        * gcc.target/riscv/rvv/autovec/binop/vdiv-rv32gcv-nofm.c: Ditto
        * gcc.target/riscv/rvv/autovec/binop/vmul-rv32gcv-nofm.c: Ditto
        * gcc.target/riscv/rvv/autovec/binop/vsub-rv32gcv-nofm.c: Ditto
        * gcc.target/riscv/rvv/autovec/cmp/vcond-1.c: Fix and add test
        * gcc.target/riscv/rvv/autovec/cond/cond_copysign-rv32gcv.c: Fix
        * gcc.target/riscv/rvv/autovec/cond/cond_fadd-1.c: Fix test
        * gcc.target/riscv/rvv/autovec/cond/cond_fadd-2.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fadd-3.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fadd-4.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fma_fnma-1.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fma_fnma-3.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fma_fnma-4.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fma_fnma-5.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fma_fnma-6.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fmax-1.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fmax-2.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fmax-3.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fmax-4.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fmin-1.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fmin-2.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fmin-3.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fmin-4.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fms_fnms-1.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fms_fnms-3.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fms_fnms-4.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fms_fnms-5.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fms_fnms-6.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fmul-1.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fmul-2.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fmul-3.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fmul-4.c: Ditto
        * gcc.target/riscv/rvv/autovec/cond/cond_fmul-5.c: Ditto

Signed-off-by: demin.han <demin....@starfivetech.com>
---
  gcc/config/riscv/autovec.md                   |  2 +-
  gcc/config/riscv/riscv-v.cc                   | 72 ++++++++++++-------
  gcc/config/riscv/riscv.cc                     |  2 +-
  gcc/config/riscv/vector.md                    |  3 +-
  .../rvv/autovec/binop/vadd-rv32gcv-nofm.c     |  4 +-
  .../rvv/autovec/binop/vdiv-rv32gcv-nofm.c     |  4 +-
  .../rvv/autovec/binop/vmul-rv32gcv-nofm.c     |  4 +-
  .../rvv/autovec/binop/vsub-rv32gcv-nofm.c     |  4 +-
  .../riscv/rvv/autovec/cmp/vcond-1.c           | 48 ++++++++++++-
  .../rvv/autovec/cond/cond_copysign-rv32gcv.c  |  8 +--
  .../riscv/rvv/autovec/cond/cond_fadd-1.c      |  4 +-
  .../riscv/rvv/autovec/cond/cond_fadd-2.c      |  4 +-
  .../riscv/rvv/autovec/cond/cond_fadd-3.c      |  4 +-
  .../riscv/rvv/autovec/cond/cond_fadd-4.c      |  4 +-
  .../riscv/rvv/autovec/cond/cond_fma_fnma-1.c  |  4 +-
  .../riscv/rvv/autovec/cond/cond_fma_fnma-3.c  |  4 +-
  .../riscv/rvv/autovec/cond/cond_fma_fnma-4.c  |  4 +-
  .../riscv/rvv/autovec/cond/cond_fma_fnma-5.c  |  4 +-
  .../riscv/rvv/autovec/cond/cond_fma_fnma-6.c  |  4 +-
  .../riscv/rvv/autovec/cond/cond_fmax-1.c      |  4 +-
  .../riscv/rvv/autovec/cond/cond_fmax-2.c      |  4 +-
  .../riscv/rvv/autovec/cond/cond_fmax-3.c      |  4 +-
  .../riscv/rvv/autovec/cond/cond_fmax-4.c      |  4 +-
  .../riscv/rvv/autovec/cond/cond_fmin-1.c      |  4 +-
  .../riscv/rvv/autovec/cond/cond_fmin-2.c      |  4 +-
  .../riscv/rvv/autovec/cond/cond_fmin-3.c      |  4 +-
  .../riscv/rvv/autovec/cond/cond_fmin-4.c      |  4 +-
  .../riscv/rvv/autovec/cond/cond_fms_fnms-1.c  |  4 +-
  .../riscv/rvv/autovec/cond/cond_fms_fnms-3.c  |  4 +-
  .../riscv/rvv/autovec/cond/cond_fms_fnms-4.c  |  4 +-
  .../riscv/rvv/autovec/cond/cond_fms_fnms-5.c  |  4 +-
  .../riscv/rvv/autovec/cond/cond_fms_fnms-6.c  |  4 +-
  .../riscv/rvv/autovec/cond/cond_fmul-1.c      |  4 +-
  .../riscv/rvv/autovec/cond/cond_fmul-2.c      |  4 +-
  .../riscv/rvv/autovec/cond/cond_fmul-3.c      |  4 +-
  .../riscv/rvv/autovec/cond/cond_fmul-4.c      |  4 +-
  .../riscv/rvv/autovec/cond/cond_fmul-5.c      |  4 +-
  37 files changed, 162 insertions(+), 97 deletions(-)

diff --git a/gcc/config/riscv/autovec.md b/gcc/config/riscv/autovec.md
index d5793acc999..a7111172153 100644
--- a/gcc/config/riscv/autovec.md
+++ b/gcc/config/riscv/autovec.md
@@ -690,7 +690,7 @@ (define_expand "vec_cmp<mode><vm>"
    [(set (match_operand:<VM> 0 "register_operand")
        (match_operator:<VM> 1 "comparison_operator"
          [(match_operand:V_VLSF 2 "register_operand")
-          (match_operand:V_VLSF 3 "register_operand")]))]
+          (match_operand:V_VLSF 3 "nonmemory_operand")]))]
Note this may be too loose. Do we really want to allow any non-memory operand or are you just trying to allow a few additional constants?

If the latter, then we should create a suitable predicate that allows a register or just that set of constants rather than using nonmemory_operand.

Robin may have further comments.

jeff

Reply via email to