[PATCH v2] RISC-V: Remove float vector eqne pattern

We can unify eqne and other comparison operations.

Tested on RV32 and RV64

gcc/ChangeLog:

	* config/riscv/riscv-vector-builtins-bases.cc: Remove eqne cond
	* config/riscv/vector.md (@pred_eqne<mode>_scalar): Remove patterns
	(*pred_eqne<mode>_scalar_merge_tie_mask): Ditto
	(*pred_eqne<mode>_scalar): Ditto
	(*pred_eqne<mode>_scalar_narrow): Ditto

gcc/testsuite/ChangeLog:

	* gcc.target/riscv/rvv/base/float-point-cmp-eqne.c: New test.
This commit is contained in:
demin.han 2024-06-19 16:21:13 -06:00 committed by Jeff Law
parent e03583e7ee
commit f0204ae386
3 changed files with 56 additions and 92 deletions

View File

@ -1420,12 +1420,8 @@ public:
switch (e.op_info->op)
{
case OP_TYPE_vf: {
if (CODE == EQ || CODE == NE)
return e.use_compare_insn (CODE, code_for_pred_eqne_scalar (
e.vector_mode ()));
else
return e.use_compare_insn (CODE, code_for_pred_cmp_scalar (
e.vector_mode ()));
return e.use_compare_insn (CODE, code_for_pred_cmp_scalar (
e.vector_mode ()));
}
case OP_TYPE_vv: {
return e.use_compare_insn (CODE,

View File

@ -7545,92 +7545,6 @@
(set_attr "mode" "<MODE>")
(set_attr "spec_restriction" "none,thv,thv,none,none")])
(define_expand "@pred_eqne<mode>_scalar"
[(set (match_operand:<VM> 0 "register_operand")
(if_then_else:<VM>
(unspec:<VM>
[(match_operand:<VM> 1 "vector_mask_operand")
(match_operand 6 "vector_length_operand")
(match_operand 7 "const_int_operand")
(match_operand 8 "const_int_operand")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
(match_operator:<VM> 3 "equality_operator"
[(vec_duplicate:V_VLSF
(match_operand:<VEL> 5 "register_operand"))
(match_operand:V_VLSF 4 "register_operand")])
(match_operand:<VM> 2 "vector_merge_operand")))]
"TARGET_VECTOR"
{})
(define_insn "*pred_eqne<mode>_scalar_merge_tie_mask"
[(set (match_operand:<VM> 0 "register_operand" "=vm")
(if_then_else:<VM>
(unspec:<VM>
[(match_operand:<VM> 1 "register_operand" " 0")
(match_operand 5 "vector_length_operand" " rK")
(match_operand 6 "const_int_operand" " i")
(match_operand 7 "const_int_operand" " i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
(match_operator:<VM> 2 "equality_operator"
[(vec_duplicate:V_VLSF
(match_operand:<VEL> 4 "register_operand" " f"))
(match_operand:V_VLSF 3 "register_operand" " vr")])
(match_dup 1)))]
"TARGET_VECTOR"
"vmf%B2.vf\t%0,%3,%4,v0.t"
[(set_attr "type" "vfcmp")
(set_attr "mode" "<MODE>")
(set_attr "merge_op_idx" "1")
(set_attr "vl_op_idx" "5")
(set (attr "ma") (symbol_ref "riscv_vector::get_ma(operands[6])"))
(set (attr "avl_type_idx") (const_int 7))])
;; We don't use early-clobber for LMUL <= 1 to get better codegen.
(define_insn "*pred_eqne<mode>_scalar"
[(set (match_operand:<VM> 0 "register_operand" "=vr, vr, &vr, &vr")
(if_then_else:<VM>
(unspec:<VM>
[(match_operand:<VM> 1 "vector_mask_operand" "vmWc1,vmWc1,vmWc1,vmWc1")
(match_operand 6 "vector_length_operand" " rK, rK, rK, rK")
(match_operand 7 "const_int_operand" " i, i, i, i")
(match_operand 8 "const_int_operand" " i, i, i, i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
(match_operator:<VM> 3 "equality_operator"
[(vec_duplicate:V_VLSF
(match_operand:<VEL> 5 "register_operand" " f, f, f, f"))
(match_operand:V_VLSF 4 "register_operand" " vr, vr, vr, vr")])
(match_operand:<VM> 2 "vector_merge_operand" " vu, 0, vu, 0")))]
"TARGET_VECTOR && riscv_vector::cmp_lmul_le_one (<MODE>mode)"
"vmf%B3.vf\t%0,%4,%5%p1"
[(set_attr "type" "vfcmp")
(set_attr "mode" "<MODE>")
(set_attr "spec_restriction" "thv,thv,rvv,rvv")])
;; We use early-clobber for source LMUL > dest LMUL.
(define_insn "*pred_eqne<mode>_scalar_narrow"
[(set (match_operand:<VM> 0 "register_operand" "=vm, vr, vr, &vr, &vr")
(if_then_else:<VM>
(unspec:<VM>
[(match_operand:<VM> 1 "vector_mask_operand" " 0,vmWc1,vmWc1,vmWc1,vmWc1")
(match_operand 6 "vector_length_operand" " rK, rK, rK, rK, rK")
(match_operand 7 "const_int_operand" " i, i, i, i, i")
(match_operand 8 "const_int_operand" " i, i, i, i, i")
(reg:SI VL_REGNUM)
(reg:SI VTYPE_REGNUM)] UNSPEC_VPREDICATE)
(match_operator:<VM> 3 "equality_operator"
[(vec_duplicate:V_VLSF
(match_operand:<VEL> 5 "register_operand" " f, f, f, f, f"))
(match_operand:V_VLSF 4 "register_operand" " vr, 0, 0, vr, vr")])
(match_operand:<VM> 2 "vector_merge_operand" " vu, vu, 0, vu, 0")))]
"TARGET_VECTOR && riscv_vector::cmp_lmul_gt_one (<MODE>mode)"
"vmf%B3.vf\t%0,%4,%5%p1"
[(set_attr "type" "vfcmp")
(set_attr "mode" "<MODE>")
(set_attr "spec_restriction" "none,thv,thv,none,none")])
;; -------------------------------------------------------------------------------
;; ---- Predicated floating-point merge
;; -------------------------------------------------------------------------------

View File

@ -0,0 +1,54 @@
/* { dg-do compile } */
/* { dg-options "-march=rv64gcv -mabi=lp64 -O3" } */
#include "riscv_vector.h"
#define CMP_FLOAT_VF_1(ID, S, OP, IMM) \
vbool##S##_t test_float_1_##ID##_##S (vfloat##S##m1_t op1, size_t vl) \
{ \
return __riscv_vmf##OP##_vf_f##S##m1_b##S (op1, IMM, vl); \
}
CMP_FLOAT_VF_1 (0, 32, eq, 0.0)
CMP_FLOAT_VF_1 (1, 32, eq, 1.0)
CMP_FLOAT_VF_1 (2, 32, eq, __builtin_nanf ("123"))
CMP_FLOAT_VF_1 (3, 32, ne, 0.0)
CMP_FLOAT_VF_1 (4, 32, ne, 1.0)
CMP_FLOAT_VF_1 (5, 32, ne, __builtin_nanf ("123"))
CMP_FLOAT_VF_1 (0, 64, eq, 0.0)
CMP_FLOAT_VF_1 (1, 64, eq, 1.0)
CMP_FLOAT_VF_1 (2, 64, eq, __builtin_nan ("123"))
CMP_FLOAT_VF_1 (3, 64, ne, 0.0)
CMP_FLOAT_VF_1 (4, 64, ne, 1.0)
CMP_FLOAT_VF_1 (5, 64, ne, __builtin_nan ("123"))
#define CMP_FLOAT_VF_2(ID, S, OP, IMM) \
vfloat##S##m1_t test_float_2_##ID##_##S (vfloat##S##m1_t op1, \
vfloat##S##m1_t op2, size_t vl) \
{ \
vfloat##S##m1_t op3 = __riscv_vfmv_s_f_f##S##m1 (IMM, vl); \
vbool##S##_t mask1 = __riscv_vmf##OP##_vf_f##S##m1_b##S (op1, IMM, vl); \
vbool##S##_t mask2 = __riscv_vmf##OP##_vv_f##S##m1_b##S (op1, op3, vl); \
vbool##S##_t mask3 = __riscv_vmor (mask1, mask2, vl); \
return __riscv_vmerge_vvm_f##S##m1_tu (op1, op1, op2, mask3, vl); \
}
CMP_FLOAT_VF_2 (0, 32, eq, 0.0)
CMP_FLOAT_VF_2 (1, 32, eq, 1.0)
CMP_FLOAT_VF_2 (2, 32, eq, __builtin_nanf ("123"))
CMP_FLOAT_VF_2 (3, 32, ne, 0.0)
CMP_FLOAT_VF_2 (4, 32, ne, 1.0)
CMP_FLOAT_VF_2 (5, 32, ne, __builtin_nanf ("123"))
CMP_FLOAT_VF_2 (0, 64, eq, 0.0)
CMP_FLOAT_VF_2 (1, 64, eq, 1.0)
CMP_FLOAT_VF_2 (2, 64, eq, __builtin_nan ("123"))
CMP_FLOAT_VF_2 (3, 64, ne, 0.0)
CMP_FLOAT_VF_2 (4, 64, ne, 1.0)
CMP_FLOAT_VF_2 (5, 64, ne, __builtin_nan ("123"))
/* { dg-final { scan-assembler-times {vmfeq\.vf} 12 } } */
/* { dg-final { scan-assembler-times {vmfne\.vf} 12 } } */
/* { dg-final { scan-assembler-times {vmfeq\.vv} 6 } } */
/* { dg-final { scan-assembler-times {vmfne\.vv} 6 } } */