Re: Re: [PATCH] RISC-V: Allow CONST_VECTOR for VLS modes.

2023-08-08 Thread 钟居哲
>> Looks like just a line-break change and the line is not too long?
Yes.

>> 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?

I'am not sure. I change this because I encounter an issue in my tests.
Could you try this patch without this change and run tests?
I am not whether this patch is the only correct fix.


>>This hunk seems unrelated to the rest.  I suppose it's just a fixup
>>for 1-element float vectors for VLS?
No, this is related since there will be an ICE when I didn't add these modes.
Could you try this? I didn't spend time on the details of this.



juzhe.zh...@rivai.ai
 
From: Robin Dapp
Date: 2023-08-08 20:50
To: Juzhe-Zhong; gcc-patches
CC: rdapp.gcc; kito.cheng; kito.cheng; jeffreyalaw
Subject: Re: [PATCH] RISC-V: Allow CONST_VECTOR for VLS modes.
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
 
 


Re: [PATCH] RISC-V: Allow CONST_VECTOR for VLS modes.

2023-08-08 Thread Robin Dapp via Gcc-patches
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