Hi Juzhe,
just some nits.
> - else if (rtx_equal_p (step, constm1_rtx) && poly_int_rtx_p (base, &value)
> + else if (rtx_equal_p (step, constm1_rtx)
> + && poly_int_rtx_p (base, &value)
Looks like just a line-break change and the line is not too long?
> - rtx ops[] = {dest, vid, gen_int_mode (nunits_m1, GET_MODE_INNER
> (mode))};
> - insn_code icode = code_for_pred_sub_reverse_scalar (mode);
> - emit_vlmax_insn (icode, RVV_BINOP, ops);
> + if (value.is_constant () && IN_RANGE (value.to_constant (), -16, 15))
At some point, we'd want to unify all the [-16, 15] handling. We already have
simm5_p but that takes an rtx. Not urgent for now just to keep in mind.
> + {
> + rtx dup = gen_const_vector_dup (mode, value);
> + rtx ops[] = {dest, dup, vid};
> + insn_code icode = code_for_pred (MINUS, mode);
> + emit_vlmax_insn (icode, RVV_BINOP, ops);
> + }
> + else
> + {
> + rtx ops[]
> + = {dest, vid, gen_int_mode (nunits_m1, GET_MODE_INNER (mode))};
> + insn_code icode = code_for_pred_sub_reverse_scalar (mode);
> + emit_vlmax_insn (icode, RVV_BINOP, ops);
> + }
> return;
> }
> else
> @@ -1416,7 +1428,9 @@ expand_const_vector (rtx target, rtx src)
> rtx base, step;
> if (const_vec_series_p (src, &base, &step))
> {
> - emit_insn (gen_vec_series (mode, target, base, step));
> + rtx tmp = gen_reg_rtx (mode);
> + emit_insn (gen_vec_series (mode, tmp, base, step));
> + emit_move_insn (target, tmp);
This seems a bit inconsistent from a caller's perspective
as we also do emit_insn (gen_vec_series, ...) without extra move
at another spot. Can we handle this directly in expand_vec_series?
> + (V1HF "TARGET_VECTOR_VLS && TARGET_VECTOR_ELEN_FP_16")
> (V2HF "TARGET_VECTOR_VLS && TARGET_VECTOR_ELEN_FP_16")
> (V4HF "TARGET_VECTOR_VLS && TARGET_VECTOR_ELEN_FP_16")
> (V8HF "TARGET_VECTOR_VLS && TARGET_VECTOR_ELEN_FP_16")
> @@ -479,6 +480,7 @@
> (V512HF "TARGET_VECTOR_VLS && TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN
> >= 1024")
> (V1024HF "TARGET_VECTOR_VLS && TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN
> >= 2048")
> (V2048HF "TARGET_VECTOR_VLS && TARGET_VECTOR_ELEN_FP_16 && TARGET_MIN_VLEN
> >= 4096")
> + (V1SF "TARGET_VECTOR_VLS && TARGET_VECTOR_ELEN_FP_32")
> (V2SF "TARGET_VECTOR_VLS && TARGET_VECTOR_ELEN_FP_32")
> (V4SF "TARGET_VECTOR_VLS && TARGET_VECTOR_ELEN_FP_32")
> (V8SF "TARGET_VECTOR_VLS && TARGET_VECTOR_ELEN_FP_32")
> @@ -489,6 +491,7 @@
> (V256SF "TARGET_VECTOR_VLS && TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN
> >= 1024")
> (V512SF "TARGET_VECTOR_VLS && TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN
> >= 2048")
> (V1024SF "TARGET_VECTOR_VLS && TARGET_VECTOR_ELEN_FP_32 && TARGET_MIN_VLEN
> >= 4096")
> + (V1DF "TARGET_VECTOR_VLS && TARGET_VECTOR_ELEN_FP_64")
> (V2DF "TARGET_VECTOR_VLS && TARGET_VECTOR_ELEN_FP_64")
> (V4DF "TARGET_VECTOR_VLS && TARGET_VECTOR_ELEN_FP_64")
> (V8DF "TARGET_VECTOR_VLS && TARGET_VECTOR_ELEN_FP_64 && TARGET_MIN_VLEN >=
> 64")
This hunk seems unrelated to the rest. I suppose it's just a fixup
for 1-element float vectors for VLS?
Apart from that, looks good to me.
Regards
Robin