Re: [PATCH v9 57/61] target/riscv: floating-point scalar move instructions

2020-06-19 Thread LIU Zhiwei




On 2020/6/20 9:06, Alistair Francis wrote:

On Fri, Jun 19, 2020 at 6:09 PM LIU Zhiwei  wrote:



On 2020/6/20 8:44, Alistair Francis wrote:

On Wed, Jun 10, 2020 at 6:44 AM LIU Zhiwei  wrote:

Signed-off-by: LIU Zhiwei 
Reviewed-by: Richard Henderson 

Hello,

This patch fails to compile with this error:

target/riscv/insn32.decode:566: error: undefined format @r2rd

Do you mind looking into why this test fails?

Sorry, it's a mistake.

the @r2rd is defined in the next patch  "[PATCH v9 58/61] target/riscv:
vector slide instructions",  where doesn't need the definition at all.

When I split patch set, I must make a mistake here. After that I only
build  and tested the whole patch set.

Thanks for pointing it.

No worries.

Do you mind fixing that problem and also rebasing the series on this
branch (it should be in master in a few days):
https://github.com/alistair23/qemu/tree/riscv-to-apply.next

Then send a new patch series.

Of course not.

I will rebase and send it later.

Zhiwei


Alistair


Zhiwei

Alistair



---
   target/riscv/insn32.decode  |  2 +
   target/riscv/insn_trans/trans_rvv.inc.c | 49 +
   2 files changed, 51 insertions(+)

diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
index 0741a25540..79f9b37b29 100644
--- a/target/riscv/insn32.decode
+++ b/target/riscv/insn32.decode
@@ -563,6 +563,8 @@ viota_m 010110 . . 1 010 . 1010111 
@r2_vm
   vid_v   010110 . 0 10001 010 . 1010111 @r1_vm
   vext_x_v001100 1 . . 010 . 1010111 @r
   vmv_s_x 001101 1 0 . 110 . 1010111 @r2
+vfmv_f_s001100 1 . 0 001 . 1010111 @r2rd
+vfmv_s_f001101 1 0 . 101 . 1010111 @r2

   vsetvli 0 ... . 111 . 1010111  @r2_zimm
   vsetvl  100 . . 111 . 1010111  @r
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c 
b/target/riscv/insn_trans/trans_rvv.inc.c
index e67eff0a7f..884ad910b1 100644
--- a/target/riscv/insn_trans/trans_rvv.inc.c
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
@@ -2709,3 +2709,52 @@ static bool trans_vmv_s_x(DisasContext *s, arg_vmv_s_x 
*a)
   }
   return false;
   }
+
+/* Floating-Point Scalar Move Instructions */
+static bool trans_vfmv_f_s(DisasContext *s, arg_vfmv_f_s *a)
+{
+if (!s->vill && has_ext(s, RVF) &&
+(s->mstatus_fs != 0) && (s->sew != 0)) {
+unsigned int len = 8 << s->sew;
+
+vec_element_loadi(s, cpu_fpr[a->rd], a->rs2, 0);
+if (len < 64) {
+tcg_gen_ori_i64(cpu_fpr[a->rd], cpu_fpr[a->rd],
+MAKE_64BIT_MASK(len, 64 - len));
+}
+
+mark_fs_dirty(s);
+return true;
+}
+return false;
+}
+
+/* vfmv.s.f vd, rs1 # vd[0] = rs1 (vs2=0) */
+static bool trans_vfmv_s_f(DisasContext *s, arg_vfmv_s_f *a)
+{
+if (!s->vill && has_ext(s, RVF) && (s->sew != 0)) {
+TCGv_i64 t1;
+/* The instructions ignore LMUL and vector register group. */
+uint32_t vlmax = s->vlen >> 3;
+
+/* if vl == 0, skip vector register write back */
+TCGLabel *over = gen_new_label();
+tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
+
+/* zeroed all elements */
+tcg_gen_gvec_dup_imm(SEW64, vreg_ofs(s, a->rd), vlmax, vlmax, 0);
+
+/* NaN-box f[rs1] as necessary for SEW */
+t1 = tcg_temp_new_i64();
+if (s->sew == MO_64 && !has_ext(s, RVD)) {
+tcg_gen_ori_i64(t1, cpu_fpr[a->rs1], MAKE_64BIT_MASK(32, 32));
+} else {
+tcg_gen_mov_i64(t1, cpu_fpr[a->rs1]);
+}
+vec_element_storei(s, a->rd, 0, t1);
+tcg_temp_free_i64(t1);
+gen_set_label(over);
+return true;
+}
+return false;
+}
--
2.23.0







Re: [PATCH v9 57/61] target/riscv: floating-point scalar move instructions

2020-06-19 Thread Alistair Francis
On Fri, Jun 19, 2020 at 6:09 PM LIU Zhiwei  wrote:
>
>
>
> On 2020/6/20 8:44, Alistair Francis wrote:
> > On Wed, Jun 10, 2020 at 6:44 AM LIU Zhiwei  wrote:
> >> Signed-off-by: LIU Zhiwei 
> >> Reviewed-by: Richard Henderson 
> > Hello,
> >
> > This patch fails to compile with this error:
> >
> > target/riscv/insn32.decode:566: error: undefined format @r2rd
> >
> > Do you mind looking into why this test fails?
> Sorry, it's a mistake.
>
> the @r2rd is defined in the next patch  "[PATCH v9 58/61] target/riscv:
> vector slide instructions",  where doesn't need the definition at all.
>
> When I split patch set, I must make a mistake here. After that I only
> build  and tested the whole patch set.
>
> Thanks for pointing it.

No worries.

Do you mind fixing that problem and also rebasing the series on this
branch (it should be in master in a few days):
https://github.com/alistair23/qemu/tree/riscv-to-apply.next

Then send a new patch series.

Alistair

>
> Zhiwei
> >
> > Alistair
> >
> >
> >> ---
> >>   target/riscv/insn32.decode  |  2 +
> >>   target/riscv/insn_trans/trans_rvv.inc.c | 49 +
> >>   2 files changed, 51 insertions(+)
> >>
> >> diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
> >> index 0741a25540..79f9b37b29 100644
> >> --- a/target/riscv/insn32.decode
> >> +++ b/target/riscv/insn32.decode
> >> @@ -563,6 +563,8 @@ viota_m 010110 . . 1 010 . 1010111 
> >> @r2_vm
> >>   vid_v   010110 . 0 10001 010 . 1010111 @r1_vm
> >>   vext_x_v001100 1 . . 010 . 1010111 @r
> >>   vmv_s_x 001101 1 0 . 110 . 1010111 @r2
> >> +vfmv_f_s001100 1 . 0 001 . 1010111 @r2rd
> >> +vfmv_s_f001101 1 0 . 101 . 1010111 @r2
> >>
> >>   vsetvli 0 ... . 111 . 1010111  @r2_zimm
> >>   vsetvl  100 . . 111 . 1010111  @r
> >> diff --git a/target/riscv/insn_trans/trans_rvv.inc.c 
> >> b/target/riscv/insn_trans/trans_rvv.inc.c
> >> index e67eff0a7f..884ad910b1 100644
> >> --- a/target/riscv/insn_trans/trans_rvv.inc.c
> >> +++ b/target/riscv/insn_trans/trans_rvv.inc.c
> >> @@ -2709,3 +2709,52 @@ static bool trans_vmv_s_x(DisasContext *s, 
> >> arg_vmv_s_x *a)
> >>   }
> >>   return false;
> >>   }
> >> +
> >> +/* Floating-Point Scalar Move Instructions */
> >> +static bool trans_vfmv_f_s(DisasContext *s, arg_vfmv_f_s *a)
> >> +{
> >> +if (!s->vill && has_ext(s, RVF) &&
> >> +(s->mstatus_fs != 0) && (s->sew != 0)) {
> >> +unsigned int len = 8 << s->sew;
> >> +
> >> +vec_element_loadi(s, cpu_fpr[a->rd], a->rs2, 0);
> >> +if (len < 64) {
> >> +tcg_gen_ori_i64(cpu_fpr[a->rd], cpu_fpr[a->rd],
> >> +MAKE_64BIT_MASK(len, 64 - len));
> >> +}
> >> +
> >> +mark_fs_dirty(s);
> >> +return true;
> >> +}
> >> +return false;
> >> +}
> >> +
> >> +/* vfmv.s.f vd, rs1 # vd[0] = rs1 (vs2=0) */
> >> +static bool trans_vfmv_s_f(DisasContext *s, arg_vfmv_s_f *a)
> >> +{
> >> +if (!s->vill && has_ext(s, RVF) && (s->sew != 0)) {
> >> +TCGv_i64 t1;
> >> +/* The instructions ignore LMUL and vector register group. */
> >> +uint32_t vlmax = s->vlen >> 3;
> >> +
> >> +/* if vl == 0, skip vector register write back */
> >> +TCGLabel *over = gen_new_label();
> >> +tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
> >> +
> >> +/* zeroed all elements */
> >> +tcg_gen_gvec_dup_imm(SEW64, vreg_ofs(s, a->rd), vlmax, vlmax, 0);
> >> +
> >> +/* NaN-box f[rs1] as necessary for SEW */
> >> +t1 = tcg_temp_new_i64();
> >> +if (s->sew == MO_64 && !has_ext(s, RVD)) {
> >> +tcg_gen_ori_i64(t1, cpu_fpr[a->rs1], MAKE_64BIT_MASK(32, 32));
> >> +} else {
> >> +tcg_gen_mov_i64(t1, cpu_fpr[a->rs1]);
> >> +}
> >> +vec_element_storei(s, a->rd, 0, t1);
> >> +tcg_temp_free_i64(t1);
> >> +gen_set_label(over);
> >> +return true;
> >> +}
> >> +return false;
> >> +}
> >> --
> >> 2.23.0
> >>
> >>
>



Re: [PATCH v9 57/61] target/riscv: floating-point scalar move instructions

2020-06-19 Thread LIU Zhiwei




On 2020/6/20 8:44, Alistair Francis wrote:

On Wed, Jun 10, 2020 at 6:44 AM LIU Zhiwei  wrote:

Signed-off-by: LIU Zhiwei 
Reviewed-by: Richard Henderson 

Hello,

This patch fails to compile with this error:

target/riscv/insn32.decode:566: error: undefined format @r2rd

Do you mind looking into why this test fails?

Sorry, it's a mistake.

the @r2rd is defined in the next patch  "[PATCH v9 58/61] target/riscv: 
vector slide instructions",  where doesn't need the definition at all.


When I split patch set, I must make a mistake here. After that I only 
build  and tested the whole patch set.


Thanks for pointing it.

Zhiwei


Alistair



---
  target/riscv/insn32.decode  |  2 +
  target/riscv/insn_trans/trans_rvv.inc.c | 49 +
  2 files changed, 51 insertions(+)

diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
index 0741a25540..79f9b37b29 100644
--- a/target/riscv/insn32.decode
+++ b/target/riscv/insn32.decode
@@ -563,6 +563,8 @@ viota_m 010110 . . 1 010 . 1010111 
@r2_vm
  vid_v   010110 . 0 10001 010 . 1010111 @r1_vm
  vext_x_v001100 1 . . 010 . 1010111 @r
  vmv_s_x 001101 1 0 . 110 . 1010111 @r2
+vfmv_f_s001100 1 . 0 001 . 1010111 @r2rd
+vfmv_s_f001101 1 0 . 101 . 1010111 @r2

  vsetvli 0 ... . 111 . 1010111  @r2_zimm
  vsetvl  100 . . 111 . 1010111  @r
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c 
b/target/riscv/insn_trans/trans_rvv.inc.c
index e67eff0a7f..884ad910b1 100644
--- a/target/riscv/insn_trans/trans_rvv.inc.c
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
@@ -2709,3 +2709,52 @@ static bool trans_vmv_s_x(DisasContext *s, arg_vmv_s_x 
*a)
  }
  return false;
  }
+
+/* Floating-Point Scalar Move Instructions */
+static bool trans_vfmv_f_s(DisasContext *s, arg_vfmv_f_s *a)
+{
+if (!s->vill && has_ext(s, RVF) &&
+(s->mstatus_fs != 0) && (s->sew != 0)) {
+unsigned int len = 8 << s->sew;
+
+vec_element_loadi(s, cpu_fpr[a->rd], a->rs2, 0);
+if (len < 64) {
+tcg_gen_ori_i64(cpu_fpr[a->rd], cpu_fpr[a->rd],
+MAKE_64BIT_MASK(len, 64 - len));
+}
+
+mark_fs_dirty(s);
+return true;
+}
+return false;
+}
+
+/* vfmv.s.f vd, rs1 # vd[0] = rs1 (vs2=0) */
+static bool trans_vfmv_s_f(DisasContext *s, arg_vfmv_s_f *a)
+{
+if (!s->vill && has_ext(s, RVF) && (s->sew != 0)) {
+TCGv_i64 t1;
+/* The instructions ignore LMUL and vector register group. */
+uint32_t vlmax = s->vlen >> 3;
+
+/* if vl == 0, skip vector register write back */
+TCGLabel *over = gen_new_label();
+tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
+
+/* zeroed all elements */
+tcg_gen_gvec_dup_imm(SEW64, vreg_ofs(s, a->rd), vlmax, vlmax, 0);
+
+/* NaN-box f[rs1] as necessary for SEW */
+t1 = tcg_temp_new_i64();
+if (s->sew == MO_64 && !has_ext(s, RVD)) {
+tcg_gen_ori_i64(t1, cpu_fpr[a->rs1], MAKE_64BIT_MASK(32, 32));
+} else {
+tcg_gen_mov_i64(t1, cpu_fpr[a->rs1]);
+}
+vec_element_storei(s, a->rd, 0, t1);
+tcg_temp_free_i64(t1);
+gen_set_label(over);
+return true;
+}
+return false;
+}
--
2.23.0







Re: [PATCH v9 57/61] target/riscv: floating-point scalar move instructions

2020-06-19 Thread Alistair Francis
On Wed, Jun 10, 2020 at 6:44 AM LIU Zhiwei  wrote:
>
> Signed-off-by: LIU Zhiwei 
> Reviewed-by: Richard Henderson 

Hello,

This patch fails to compile with this error:

target/riscv/insn32.decode:566: error: undefined format @r2rd

Do you mind looking into why this test fails?

Alistair


> ---
>  target/riscv/insn32.decode  |  2 +
>  target/riscv/insn_trans/trans_rvv.inc.c | 49 +
>  2 files changed, 51 insertions(+)
>
> diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
> index 0741a25540..79f9b37b29 100644
> --- a/target/riscv/insn32.decode
> +++ b/target/riscv/insn32.decode
> @@ -563,6 +563,8 @@ viota_m 010110 . . 1 010 . 1010111 
> @r2_vm
>  vid_v   010110 . 0 10001 010 . 1010111 @r1_vm
>  vext_x_v001100 1 . . 010 . 1010111 @r
>  vmv_s_x 001101 1 0 . 110 . 1010111 @r2
> +vfmv_f_s001100 1 . 0 001 . 1010111 @r2rd
> +vfmv_s_f001101 1 0 . 101 . 1010111 @r2
>
>  vsetvli 0 ... . 111 . 1010111  @r2_zimm
>  vsetvl  100 . . 111 . 1010111  @r
> diff --git a/target/riscv/insn_trans/trans_rvv.inc.c 
> b/target/riscv/insn_trans/trans_rvv.inc.c
> index e67eff0a7f..884ad910b1 100644
> --- a/target/riscv/insn_trans/trans_rvv.inc.c
> +++ b/target/riscv/insn_trans/trans_rvv.inc.c
> @@ -2709,3 +2709,52 @@ static bool trans_vmv_s_x(DisasContext *s, arg_vmv_s_x 
> *a)
>  }
>  return false;
>  }
> +
> +/* Floating-Point Scalar Move Instructions */
> +static bool trans_vfmv_f_s(DisasContext *s, arg_vfmv_f_s *a)
> +{
> +if (!s->vill && has_ext(s, RVF) &&
> +(s->mstatus_fs != 0) && (s->sew != 0)) {
> +unsigned int len = 8 << s->sew;
> +
> +vec_element_loadi(s, cpu_fpr[a->rd], a->rs2, 0);
> +if (len < 64) {
> +tcg_gen_ori_i64(cpu_fpr[a->rd], cpu_fpr[a->rd],
> +MAKE_64BIT_MASK(len, 64 - len));
> +}
> +
> +mark_fs_dirty(s);
> +return true;
> +}
> +return false;
> +}
> +
> +/* vfmv.s.f vd, rs1 # vd[0] = rs1 (vs2=0) */
> +static bool trans_vfmv_s_f(DisasContext *s, arg_vfmv_s_f *a)
> +{
> +if (!s->vill && has_ext(s, RVF) && (s->sew != 0)) {
> +TCGv_i64 t1;
> +/* The instructions ignore LMUL and vector register group. */
> +uint32_t vlmax = s->vlen >> 3;
> +
> +/* if vl == 0, skip vector register write back */
> +TCGLabel *over = gen_new_label();
> +tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
> +
> +/* zeroed all elements */
> +tcg_gen_gvec_dup_imm(SEW64, vreg_ofs(s, a->rd), vlmax, vlmax, 0);
> +
> +/* NaN-box f[rs1] as necessary for SEW */
> +t1 = tcg_temp_new_i64();
> +if (s->sew == MO_64 && !has_ext(s, RVD)) {
> +tcg_gen_ori_i64(t1, cpu_fpr[a->rs1], MAKE_64BIT_MASK(32, 32));
> +} else {
> +tcg_gen_mov_i64(t1, cpu_fpr[a->rs1]);
> +}
> +vec_element_storei(s, a->rd, 0, t1);
> +tcg_temp_free_i64(t1);
> +gen_set_label(over);
> +return true;
> +}
> +return false;
> +}
> --
> 2.23.0
>
>



[PATCH v9 57/61] target/riscv: floating-point scalar move instructions

2020-06-10 Thread LIU Zhiwei
Signed-off-by: LIU Zhiwei 
Reviewed-by: Richard Henderson 
---
 target/riscv/insn32.decode  |  2 +
 target/riscv/insn_trans/trans_rvv.inc.c | 49 +
 2 files changed, 51 insertions(+)

diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
index 0741a25540..79f9b37b29 100644
--- a/target/riscv/insn32.decode
+++ b/target/riscv/insn32.decode
@@ -563,6 +563,8 @@ viota_m 010110 . . 1 010 . 1010111 
@r2_vm
 vid_v   010110 . 0 10001 010 . 1010111 @r1_vm
 vext_x_v001100 1 . . 010 . 1010111 @r
 vmv_s_x 001101 1 0 . 110 . 1010111 @r2
+vfmv_f_s001100 1 . 0 001 . 1010111 @r2rd
+vfmv_s_f001101 1 0 . 101 . 1010111 @r2
 
 vsetvli 0 ... . 111 . 1010111  @r2_zimm
 vsetvl  100 . . 111 . 1010111  @r
diff --git a/target/riscv/insn_trans/trans_rvv.inc.c 
b/target/riscv/insn_trans/trans_rvv.inc.c
index e67eff0a7f..884ad910b1 100644
--- a/target/riscv/insn_trans/trans_rvv.inc.c
+++ b/target/riscv/insn_trans/trans_rvv.inc.c
@@ -2709,3 +2709,52 @@ static bool trans_vmv_s_x(DisasContext *s, arg_vmv_s_x 
*a)
 }
 return false;
 }
+
+/* Floating-Point Scalar Move Instructions */
+static bool trans_vfmv_f_s(DisasContext *s, arg_vfmv_f_s *a)
+{
+if (!s->vill && has_ext(s, RVF) &&
+(s->mstatus_fs != 0) && (s->sew != 0)) {
+unsigned int len = 8 << s->sew;
+
+vec_element_loadi(s, cpu_fpr[a->rd], a->rs2, 0);
+if (len < 64) {
+tcg_gen_ori_i64(cpu_fpr[a->rd], cpu_fpr[a->rd],
+MAKE_64BIT_MASK(len, 64 - len));
+}
+
+mark_fs_dirty(s);
+return true;
+}
+return false;
+}
+
+/* vfmv.s.f vd, rs1 # vd[0] = rs1 (vs2=0) */
+static bool trans_vfmv_s_f(DisasContext *s, arg_vfmv_s_f *a)
+{
+if (!s->vill && has_ext(s, RVF) && (s->sew != 0)) {
+TCGv_i64 t1;
+/* The instructions ignore LMUL and vector register group. */
+uint32_t vlmax = s->vlen >> 3;
+
+/* if vl == 0, skip vector register write back */
+TCGLabel *over = gen_new_label();
+tcg_gen_brcondi_tl(TCG_COND_EQ, cpu_vl, 0, over);
+
+/* zeroed all elements */
+tcg_gen_gvec_dup_imm(SEW64, vreg_ofs(s, a->rd), vlmax, vlmax, 0);
+
+/* NaN-box f[rs1] as necessary for SEW */
+t1 = tcg_temp_new_i64();
+if (s->sew == MO_64 && !has_ext(s, RVD)) {
+tcg_gen_ori_i64(t1, cpu_fpr[a->rs1], MAKE_64BIT_MASK(32, 32));
+} else {
+tcg_gen_mov_i64(t1, cpu_fpr[a->rs1]);
+}
+vec_element_storei(s, a->rd, 0, t1);
+tcg_temp_free_i64(t1);
+gen_set_label(over);
+return true;
+}
+return false;
+}
-- 
2.23.0