All of lore.kernel.org
 help / color / mirror / Atom feed
From: frank.chang@sifive.com
To: qemu-devel@nongnu.org
Cc: qemu-riscv@nongnu.org, Frank Chang <frank.chang@sifive.com>,
	Bin Meng <bin.meng@windriver.com>,
	Richard Henderson <richard.henderson@linaro.org>,
	Alistair Francis <alistair.francis@wdc.com>,
	Palmer Dabbelt <palmer@dabbelt.com>,
	LIU Zhiwei <zhiwei_liu@c-sky.com>
Subject: [PATCH v10 24/77] target/riscv: rvv-1.0: load/store whole register instructions
Date: Mon, 29 Nov 2021 11:02:44 +0800	[thread overview]
Message-ID: <20211129030340.429689-25-frank.chang@sifive.com> (raw)
In-Reply-To: <20211129030340.429689-1-frank.chang@sifive.com>

From: Frank Chang <frank.chang@sifive.com>

Add the following instructions:

* vl<nf>re<eew>.v
* vs<nf>r.v

Signed-off-by: Frank Chang <frank.chang@sifive.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
---
 target/riscv/helper.h                   | 21 ++++++++
 target/riscv/insn32.decode              | 22 ++++++++
 target/riscv/insn_trans/trans_rvv.c.inc | 68 +++++++++++++++++++++++++
 target/riscv/vector_helper.c            | 65 +++++++++++++++++++++++
 4 files changed, 176 insertions(+)

diff --git a/target/riscv/helper.h b/target/riscv/helper.h
index 57560b8c04d..b8894d61510 100644
--- a/target/riscv/helper.h
+++ b/target/riscv/helper.h
@@ -173,6 +173,27 @@ DEF_HELPER_5(vle16ff_v, void, ptr, ptr, tl, env, i32)
 DEF_HELPER_5(vle32ff_v, void, ptr, ptr, tl, env, i32)
 DEF_HELPER_5(vle64ff_v, void, ptr, ptr, tl, env, i32)
 
+DEF_HELPER_4(vl1re8_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl1re16_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl1re32_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl1re64_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl2re8_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl2re16_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl2re32_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl2re64_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl4re8_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl4re16_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl4re32_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl4re64_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl8re8_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl8re16_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl8re32_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl8re64_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vs1r_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vs2r_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vs4r_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vs8r_v, void, ptr, tl, env, i32)
+
 DEF_HELPER_6(vadd_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
 DEF_HELPER_6(vadd_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
 DEF_HELPER_6(vadd_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
index 180d97ecba3..7d8441d1f21 100644
--- a/target/riscv/insn32.decode
+++ b/target/riscv/insn32.decode
@@ -332,6 +332,28 @@ vle16ff_v     ... 000 . 10000 ..... 101 ..... 0000111 @r2_nfvm
 vle32ff_v     ... 000 . 10000 ..... 110 ..... 0000111 @r2_nfvm
 vle64ff_v     ... 000 . 10000 ..... 111 ..... 0000111 @r2_nfvm
 
+# Vector whole register insns
+vl1re8_v      000 000 1 01000 ..... 000 ..... 0000111 @r2
+vl1re16_v     000 000 1 01000 ..... 101 ..... 0000111 @r2
+vl1re32_v     000 000 1 01000 ..... 110 ..... 0000111 @r2
+vl1re64_v     000 000 1 01000 ..... 111 ..... 0000111 @r2
+vl2re8_v      001 000 1 01000 ..... 000 ..... 0000111 @r2
+vl2re16_v     001 000 1 01000 ..... 101 ..... 0000111 @r2
+vl2re32_v     001 000 1 01000 ..... 110 ..... 0000111 @r2
+vl2re64_v     001 000 1 01000 ..... 111 ..... 0000111 @r2
+vl4re8_v      011 000 1 01000 ..... 000 ..... 0000111 @r2
+vl4re16_v     011 000 1 01000 ..... 101 ..... 0000111 @r2
+vl4re32_v     011 000 1 01000 ..... 110 ..... 0000111 @r2
+vl4re64_v     011 000 1 01000 ..... 111 ..... 0000111 @r2
+vl8re8_v      111 000 1 01000 ..... 000 ..... 0000111 @r2
+vl8re16_v     111 000 1 01000 ..... 101 ..... 0000111 @r2
+vl8re32_v     111 000 1 01000 ..... 110 ..... 0000111 @r2
+vl8re64_v     111 000 1 01000 ..... 111 ..... 0000111 @r2
+vs1r_v        000 000 1 01000 ..... 000 ..... 0100111 @r2
+vs2r_v        001 000 1 01000 ..... 000 ..... 0100111 @r2
+vs4r_v        011 000 1 01000 ..... 000 ..... 0100111 @r2
+vs8r_v        111 000 1 01000 ..... 000 ..... 0100111 @r2
+
 # *** new major opcode OP-V ***
 vadd_vv         000000 . ..... ..... 000 ..... 1010111 @r_vm
 vadd_vx         000000 . ..... ..... 100 ..... 1010111 @r_vm
diff --git a/target/riscv/insn_trans/trans_rvv.c.inc b/target/riscv/insn_trans/trans_rvv.c.inc
index 5b5285b33f7..5e8e49d43f4 100644
--- a/target/riscv/insn_trans/trans_rvv.c.inc
+++ b/target/riscv/insn_trans/trans_rvv.c.inc
@@ -960,6 +960,74 @@ GEN_VEXT_TRANS(vle16ff_v, MO_16, r2nfvm, ldff_op, ld_us_check)
 GEN_VEXT_TRANS(vle32ff_v, MO_32, r2nfvm, ldff_op, ld_us_check)
 GEN_VEXT_TRANS(vle64ff_v, MO_64, r2nfvm, ldff_op, ld_us_check)
 
+/*
+ * load and store whole register instructions
+ */
+typedef void gen_helper_ldst_whole(TCGv_ptr, TCGv, TCGv_env, TCGv_i32);
+
+static bool ldst_whole_trans(uint32_t vd, uint32_t rs1, uint32_t nf,
+                             gen_helper_ldst_whole *fn, DisasContext *s,
+                             bool is_store)
+{
+    TCGv_ptr dest;
+    TCGv base;
+    TCGv_i32 desc;
+
+    uint32_t data = FIELD_DP32(0, VDATA, NF, nf);
+    dest = tcg_temp_new_ptr();
+    desc = tcg_constant_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
+
+    base = get_gpr(s, rs1, EXT_NONE);
+    tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, vd));
+
+    fn(dest, base, cpu_env, desc);
+
+    tcg_temp_free_ptr(dest);
+
+    if (!is_store) {
+        mark_vs_dirty(s);
+    }
+
+    return true;
+}
+
+/*
+ * load and store whole register instructions ignore vtype and vl setting.
+ * Thus, we don't need to check vill bit. (Section 7.9)
+ */
+#define GEN_LDST_WHOLE_TRANS(NAME, ARG_NF, IS_STORE)                      \
+static bool trans_##NAME(DisasContext *s, arg_##NAME * a)                 \
+{                                                                         \
+    if (require_rvv(s) &&                                                 \
+        QEMU_IS_ALIGNED(a->rd, ARG_NF)) {                                 \
+        return ldst_whole_trans(a->rd, a->rs1, ARG_NF, gen_helper_##NAME, \
+                                s, IS_STORE);                             \
+    }                                                                     \
+    return false;                                                         \
+}
+
+GEN_LDST_WHOLE_TRANS(vl1re8_v,  1, false)
+GEN_LDST_WHOLE_TRANS(vl1re16_v, 1, false)
+GEN_LDST_WHOLE_TRANS(vl1re32_v, 1, false)
+GEN_LDST_WHOLE_TRANS(vl1re64_v, 1, false)
+GEN_LDST_WHOLE_TRANS(vl2re8_v,  2, false)
+GEN_LDST_WHOLE_TRANS(vl2re16_v, 2, false)
+GEN_LDST_WHOLE_TRANS(vl2re32_v, 2, false)
+GEN_LDST_WHOLE_TRANS(vl2re64_v, 2, false)
+GEN_LDST_WHOLE_TRANS(vl4re8_v,  4, false)
+GEN_LDST_WHOLE_TRANS(vl4re16_v, 4, false)
+GEN_LDST_WHOLE_TRANS(vl4re32_v, 4, false)
+GEN_LDST_WHOLE_TRANS(vl4re64_v, 4, false)
+GEN_LDST_WHOLE_TRANS(vl8re8_v,  8, false)
+GEN_LDST_WHOLE_TRANS(vl8re16_v, 8, false)
+GEN_LDST_WHOLE_TRANS(vl8re32_v, 8, false)
+GEN_LDST_WHOLE_TRANS(vl8re64_v, 8, false)
+
+GEN_LDST_WHOLE_TRANS(vs1r_v, 1, true)
+GEN_LDST_WHOLE_TRANS(vs2r_v, 2, true)
+GEN_LDST_WHOLE_TRANS(vs4r_v, 4, true)
+GEN_LDST_WHOLE_TRANS(vs8r_v, 8, true)
+
 /*
  *** Vector Integer Arithmetic Instructions
  */
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
index 0e7bf5d27fb..9a39a0e2d26 100644
--- a/target/riscv/vector_helper.c
+++ b/target/riscv/vector_helper.c
@@ -543,6 +543,71 @@ GEN_VEXT_LDFF(vle64ff_v, int64_t, lde_d)
 #define DO_MAXU(N, M) DO_MAX((UMTYPE)N, (UMTYPE)M)
 #define DO_MINU(N, M) DO_MIN((UMTYPE)N, (UMTYPE)M)
 
+/*
+ *** load and store whole register instructions
+ */
+static void
+vext_ldst_whole(void *vd, target_ulong base, CPURISCVState *env, uint32_t desc,
+                vext_ldst_elem_fn *ldst_elem, uint32_t esz, uintptr_t ra,
+                MMUAccessType access_type)
+{
+    uint32_t i, k;
+    uint32_t nf = vext_nf(desc);
+    uint32_t vlenb = env_archcpu(env)->cfg.vlen >> 3;
+    uint32_t max_elems = vlenb >> esz;
+
+    /* probe every access */
+    probe_pages(env, base, vlenb * nf, ra, access_type);
+
+    /* load bytes from guest memory */
+    for (k = 0; k < nf; k++) {
+        for (i = 0; i < max_elems; i++) {
+            target_ulong addr = base + ((i + k * max_elems) << esz);
+            ldst_elem(env, addr, i + k * max_elems, vd, ra);
+        }
+    }
+}
+
+#define GEN_VEXT_LD_WHOLE(NAME, ETYPE, LOAD_FN)      \
+void HELPER(NAME)(void *vd, target_ulong base,       \
+                  CPURISCVState *env, uint32_t desc) \
+{                                                    \
+    vext_ldst_whole(vd, base, env, desc, LOAD_FN,    \
+                    ctzl(sizeof(ETYPE)), GETPC(),    \
+                    MMU_DATA_LOAD);                  \
+}
+
+GEN_VEXT_LD_WHOLE(vl1re8_v,  int8_t,  lde_b)
+GEN_VEXT_LD_WHOLE(vl1re16_v, int16_t, lde_h)
+GEN_VEXT_LD_WHOLE(vl1re32_v, int32_t, lde_w)
+GEN_VEXT_LD_WHOLE(vl1re64_v, int64_t, lde_d)
+GEN_VEXT_LD_WHOLE(vl2re8_v,  int8_t,  lde_b)
+GEN_VEXT_LD_WHOLE(vl2re16_v, int16_t, lde_h)
+GEN_VEXT_LD_WHOLE(vl2re32_v, int32_t, lde_w)
+GEN_VEXT_LD_WHOLE(vl2re64_v, int64_t, lde_d)
+GEN_VEXT_LD_WHOLE(vl4re8_v,  int8_t,  lde_b)
+GEN_VEXT_LD_WHOLE(vl4re16_v, int16_t, lde_h)
+GEN_VEXT_LD_WHOLE(vl4re32_v, int32_t, lde_w)
+GEN_VEXT_LD_WHOLE(vl4re64_v, int64_t, lde_d)
+GEN_VEXT_LD_WHOLE(vl8re8_v,  int8_t,  lde_b)
+GEN_VEXT_LD_WHOLE(vl8re16_v, int16_t, lde_h)
+GEN_VEXT_LD_WHOLE(vl8re32_v, int32_t, lde_w)
+GEN_VEXT_LD_WHOLE(vl8re64_v, int64_t, lde_d)
+
+#define GEN_VEXT_ST_WHOLE(NAME, ETYPE, STORE_FN)     \
+void HELPER(NAME)(void *vd, target_ulong base,       \
+                  CPURISCVState *env, uint32_t desc) \
+{                                                    \
+    vext_ldst_whole(vd, base, env, desc, STORE_FN,   \
+                    ctzl(sizeof(ETYPE)), GETPC(),    \
+                    MMU_DATA_STORE);                 \
+}
+
+GEN_VEXT_ST_WHOLE(vs1r_v, int8_t, ste_b)
+GEN_VEXT_ST_WHOLE(vs2r_v, int8_t, ste_b)
+GEN_VEXT_ST_WHOLE(vs4r_v, int8_t, ste_b)
+GEN_VEXT_ST_WHOLE(vs8r_v, int8_t, ste_b)
+
 /*
  *** Vector Integer Arithmetic Instructions
  */
-- 
2.25.1



WARNING: multiple messages have this Message-ID (diff)
From: frank.chang@sifive.com
To: qemu-devel@nongnu.org
Cc: qemu-riscv@nongnu.org, Frank Chang <frank.chang@sifive.com>,
	Alistair Francis <alistair.francis@wdc.com>,
	Palmer Dabbelt <palmer@dabbelt.com>,
	Bin Meng <bin.meng@windriver.com>,
	Richard Henderson <richard.henderson@linaro.org>,
	LIU Zhiwei <zhiwei_liu@c-sky.com>
Subject: [PATCH v10 24/77] target/riscv: rvv-1.0: load/store whole register instructions
Date: Mon, 29 Nov 2021 11:02:44 +0800	[thread overview]
Message-ID: <20211129030340.429689-25-frank.chang@sifive.com> (raw)
In-Reply-To: <20211129030340.429689-1-frank.chang@sifive.com>

From: Frank Chang <frank.chang@sifive.com>

Add the following instructions:

* vl<nf>re<eew>.v
* vs<nf>r.v

Signed-off-by: Frank Chang <frank.chang@sifive.com>
Reviewed-by: Alistair Francis <alistair.francis@wdc.com>
---
 target/riscv/helper.h                   | 21 ++++++++
 target/riscv/insn32.decode              | 22 ++++++++
 target/riscv/insn_trans/trans_rvv.c.inc | 68 +++++++++++++++++++++++++
 target/riscv/vector_helper.c            | 65 +++++++++++++++++++++++
 4 files changed, 176 insertions(+)

diff --git a/target/riscv/helper.h b/target/riscv/helper.h
index 57560b8c04d..b8894d61510 100644
--- a/target/riscv/helper.h
+++ b/target/riscv/helper.h
@@ -173,6 +173,27 @@ DEF_HELPER_5(vle16ff_v, void, ptr, ptr, tl, env, i32)
 DEF_HELPER_5(vle32ff_v, void, ptr, ptr, tl, env, i32)
 DEF_HELPER_5(vle64ff_v, void, ptr, ptr, tl, env, i32)
 
+DEF_HELPER_4(vl1re8_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl1re16_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl1re32_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl1re64_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl2re8_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl2re16_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl2re32_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl2re64_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl4re8_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl4re16_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl4re32_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl4re64_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl8re8_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl8re16_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl8re32_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vl8re64_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vs1r_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vs2r_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vs4r_v, void, ptr, tl, env, i32)
+DEF_HELPER_4(vs8r_v, void, ptr, tl, env, i32)
+
 DEF_HELPER_6(vadd_vv_b, void, ptr, ptr, ptr, ptr, env, i32)
 DEF_HELPER_6(vadd_vv_h, void, ptr, ptr, ptr, ptr, env, i32)
 DEF_HELPER_6(vadd_vv_w, void, ptr, ptr, ptr, ptr, env, i32)
diff --git a/target/riscv/insn32.decode b/target/riscv/insn32.decode
index 180d97ecba3..7d8441d1f21 100644
--- a/target/riscv/insn32.decode
+++ b/target/riscv/insn32.decode
@@ -332,6 +332,28 @@ vle16ff_v     ... 000 . 10000 ..... 101 ..... 0000111 @r2_nfvm
 vle32ff_v     ... 000 . 10000 ..... 110 ..... 0000111 @r2_nfvm
 vle64ff_v     ... 000 . 10000 ..... 111 ..... 0000111 @r2_nfvm
 
+# Vector whole register insns
+vl1re8_v      000 000 1 01000 ..... 000 ..... 0000111 @r2
+vl1re16_v     000 000 1 01000 ..... 101 ..... 0000111 @r2
+vl1re32_v     000 000 1 01000 ..... 110 ..... 0000111 @r2
+vl1re64_v     000 000 1 01000 ..... 111 ..... 0000111 @r2
+vl2re8_v      001 000 1 01000 ..... 000 ..... 0000111 @r2
+vl2re16_v     001 000 1 01000 ..... 101 ..... 0000111 @r2
+vl2re32_v     001 000 1 01000 ..... 110 ..... 0000111 @r2
+vl2re64_v     001 000 1 01000 ..... 111 ..... 0000111 @r2
+vl4re8_v      011 000 1 01000 ..... 000 ..... 0000111 @r2
+vl4re16_v     011 000 1 01000 ..... 101 ..... 0000111 @r2
+vl4re32_v     011 000 1 01000 ..... 110 ..... 0000111 @r2
+vl4re64_v     011 000 1 01000 ..... 111 ..... 0000111 @r2
+vl8re8_v      111 000 1 01000 ..... 000 ..... 0000111 @r2
+vl8re16_v     111 000 1 01000 ..... 101 ..... 0000111 @r2
+vl8re32_v     111 000 1 01000 ..... 110 ..... 0000111 @r2
+vl8re64_v     111 000 1 01000 ..... 111 ..... 0000111 @r2
+vs1r_v        000 000 1 01000 ..... 000 ..... 0100111 @r2
+vs2r_v        001 000 1 01000 ..... 000 ..... 0100111 @r2
+vs4r_v        011 000 1 01000 ..... 000 ..... 0100111 @r2
+vs8r_v        111 000 1 01000 ..... 000 ..... 0100111 @r2
+
 # *** new major opcode OP-V ***
 vadd_vv         000000 . ..... ..... 000 ..... 1010111 @r_vm
 vadd_vx         000000 . ..... ..... 100 ..... 1010111 @r_vm
diff --git a/target/riscv/insn_trans/trans_rvv.c.inc b/target/riscv/insn_trans/trans_rvv.c.inc
index 5b5285b33f7..5e8e49d43f4 100644
--- a/target/riscv/insn_trans/trans_rvv.c.inc
+++ b/target/riscv/insn_trans/trans_rvv.c.inc
@@ -960,6 +960,74 @@ GEN_VEXT_TRANS(vle16ff_v, MO_16, r2nfvm, ldff_op, ld_us_check)
 GEN_VEXT_TRANS(vle32ff_v, MO_32, r2nfvm, ldff_op, ld_us_check)
 GEN_VEXT_TRANS(vle64ff_v, MO_64, r2nfvm, ldff_op, ld_us_check)
 
+/*
+ * load and store whole register instructions
+ */
+typedef void gen_helper_ldst_whole(TCGv_ptr, TCGv, TCGv_env, TCGv_i32);
+
+static bool ldst_whole_trans(uint32_t vd, uint32_t rs1, uint32_t nf,
+                             gen_helper_ldst_whole *fn, DisasContext *s,
+                             bool is_store)
+{
+    TCGv_ptr dest;
+    TCGv base;
+    TCGv_i32 desc;
+
+    uint32_t data = FIELD_DP32(0, VDATA, NF, nf);
+    dest = tcg_temp_new_ptr();
+    desc = tcg_constant_i32(simd_desc(s->vlen / 8, s->vlen / 8, data));
+
+    base = get_gpr(s, rs1, EXT_NONE);
+    tcg_gen_addi_ptr(dest, cpu_env, vreg_ofs(s, vd));
+
+    fn(dest, base, cpu_env, desc);
+
+    tcg_temp_free_ptr(dest);
+
+    if (!is_store) {
+        mark_vs_dirty(s);
+    }
+
+    return true;
+}
+
+/*
+ * load and store whole register instructions ignore vtype and vl setting.
+ * Thus, we don't need to check vill bit. (Section 7.9)
+ */
+#define GEN_LDST_WHOLE_TRANS(NAME, ARG_NF, IS_STORE)                      \
+static bool trans_##NAME(DisasContext *s, arg_##NAME * a)                 \
+{                                                                         \
+    if (require_rvv(s) &&                                                 \
+        QEMU_IS_ALIGNED(a->rd, ARG_NF)) {                                 \
+        return ldst_whole_trans(a->rd, a->rs1, ARG_NF, gen_helper_##NAME, \
+                                s, IS_STORE);                             \
+    }                                                                     \
+    return false;                                                         \
+}
+
+GEN_LDST_WHOLE_TRANS(vl1re8_v,  1, false)
+GEN_LDST_WHOLE_TRANS(vl1re16_v, 1, false)
+GEN_LDST_WHOLE_TRANS(vl1re32_v, 1, false)
+GEN_LDST_WHOLE_TRANS(vl1re64_v, 1, false)
+GEN_LDST_WHOLE_TRANS(vl2re8_v,  2, false)
+GEN_LDST_WHOLE_TRANS(vl2re16_v, 2, false)
+GEN_LDST_WHOLE_TRANS(vl2re32_v, 2, false)
+GEN_LDST_WHOLE_TRANS(vl2re64_v, 2, false)
+GEN_LDST_WHOLE_TRANS(vl4re8_v,  4, false)
+GEN_LDST_WHOLE_TRANS(vl4re16_v, 4, false)
+GEN_LDST_WHOLE_TRANS(vl4re32_v, 4, false)
+GEN_LDST_WHOLE_TRANS(vl4re64_v, 4, false)
+GEN_LDST_WHOLE_TRANS(vl8re8_v,  8, false)
+GEN_LDST_WHOLE_TRANS(vl8re16_v, 8, false)
+GEN_LDST_WHOLE_TRANS(vl8re32_v, 8, false)
+GEN_LDST_WHOLE_TRANS(vl8re64_v, 8, false)
+
+GEN_LDST_WHOLE_TRANS(vs1r_v, 1, true)
+GEN_LDST_WHOLE_TRANS(vs2r_v, 2, true)
+GEN_LDST_WHOLE_TRANS(vs4r_v, 4, true)
+GEN_LDST_WHOLE_TRANS(vs8r_v, 8, true)
+
 /*
  *** Vector Integer Arithmetic Instructions
  */
diff --git a/target/riscv/vector_helper.c b/target/riscv/vector_helper.c
index 0e7bf5d27fb..9a39a0e2d26 100644
--- a/target/riscv/vector_helper.c
+++ b/target/riscv/vector_helper.c
@@ -543,6 +543,71 @@ GEN_VEXT_LDFF(vle64ff_v, int64_t, lde_d)
 #define DO_MAXU(N, M) DO_MAX((UMTYPE)N, (UMTYPE)M)
 #define DO_MINU(N, M) DO_MIN((UMTYPE)N, (UMTYPE)M)
 
+/*
+ *** load and store whole register instructions
+ */
+static void
+vext_ldst_whole(void *vd, target_ulong base, CPURISCVState *env, uint32_t desc,
+                vext_ldst_elem_fn *ldst_elem, uint32_t esz, uintptr_t ra,
+                MMUAccessType access_type)
+{
+    uint32_t i, k;
+    uint32_t nf = vext_nf(desc);
+    uint32_t vlenb = env_archcpu(env)->cfg.vlen >> 3;
+    uint32_t max_elems = vlenb >> esz;
+
+    /* probe every access */
+    probe_pages(env, base, vlenb * nf, ra, access_type);
+
+    /* load bytes from guest memory */
+    for (k = 0; k < nf; k++) {
+        for (i = 0; i < max_elems; i++) {
+            target_ulong addr = base + ((i + k * max_elems) << esz);
+            ldst_elem(env, addr, i + k * max_elems, vd, ra);
+        }
+    }
+}
+
+#define GEN_VEXT_LD_WHOLE(NAME, ETYPE, LOAD_FN)      \
+void HELPER(NAME)(void *vd, target_ulong base,       \
+                  CPURISCVState *env, uint32_t desc) \
+{                                                    \
+    vext_ldst_whole(vd, base, env, desc, LOAD_FN,    \
+                    ctzl(sizeof(ETYPE)), GETPC(),    \
+                    MMU_DATA_LOAD);                  \
+}
+
+GEN_VEXT_LD_WHOLE(vl1re8_v,  int8_t,  lde_b)
+GEN_VEXT_LD_WHOLE(vl1re16_v, int16_t, lde_h)
+GEN_VEXT_LD_WHOLE(vl1re32_v, int32_t, lde_w)
+GEN_VEXT_LD_WHOLE(vl1re64_v, int64_t, lde_d)
+GEN_VEXT_LD_WHOLE(vl2re8_v,  int8_t,  lde_b)
+GEN_VEXT_LD_WHOLE(vl2re16_v, int16_t, lde_h)
+GEN_VEXT_LD_WHOLE(vl2re32_v, int32_t, lde_w)
+GEN_VEXT_LD_WHOLE(vl2re64_v, int64_t, lde_d)
+GEN_VEXT_LD_WHOLE(vl4re8_v,  int8_t,  lde_b)
+GEN_VEXT_LD_WHOLE(vl4re16_v, int16_t, lde_h)
+GEN_VEXT_LD_WHOLE(vl4re32_v, int32_t, lde_w)
+GEN_VEXT_LD_WHOLE(vl4re64_v, int64_t, lde_d)
+GEN_VEXT_LD_WHOLE(vl8re8_v,  int8_t,  lde_b)
+GEN_VEXT_LD_WHOLE(vl8re16_v, int16_t, lde_h)
+GEN_VEXT_LD_WHOLE(vl8re32_v, int32_t, lde_w)
+GEN_VEXT_LD_WHOLE(vl8re64_v, int64_t, lde_d)
+
+#define GEN_VEXT_ST_WHOLE(NAME, ETYPE, STORE_FN)     \
+void HELPER(NAME)(void *vd, target_ulong base,       \
+                  CPURISCVState *env, uint32_t desc) \
+{                                                    \
+    vext_ldst_whole(vd, base, env, desc, STORE_FN,   \
+                    ctzl(sizeof(ETYPE)), GETPC(),    \
+                    MMU_DATA_STORE);                 \
+}
+
+GEN_VEXT_ST_WHOLE(vs1r_v, int8_t, ste_b)
+GEN_VEXT_ST_WHOLE(vs2r_v, int8_t, ste_b)
+GEN_VEXT_ST_WHOLE(vs4r_v, int8_t, ste_b)
+GEN_VEXT_ST_WHOLE(vs8r_v, int8_t, ste_b)
+
 /*
  *** Vector Integer Arithmetic Instructions
  */
-- 
2.25.1



  parent reply	other threads:[~2021-11-29  3:19 UTC|newest]

Thread overview: 168+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-11-29  3:02 [PATCH v10 00/77] support vector extension v1.0 frank.chang
2021-11-29  3:02 ` frank.chang
2021-11-29  3:02 ` [PATCH v10 01/77] target/riscv: drop vector 0.7.1 and add 1.0 support frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 02/77] target/riscv: Use FIELD_EX32() to extract wd field frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 03/77] target/riscv: rvv-1.0: add mstatus VS field frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 04/77] target/riscv: rvv-1.0: set mstatus.SD bit if mstatus.VS is dirty frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:16   ` Alistair Francis
2021-11-29  3:16     ` Alistair Francis
2021-11-29  3:02 ` [PATCH v10 05/77] target/riscv: rvv-1.0: add sstatus VS field frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 06/77] target/riscv: rvv-1.0: introduce writable misa.v field frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 07/77] target/riscv: rvv-1.0: add translation-time vector context status frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 08/77] target/riscv: rvv-1.0: remove rvv related codes from fcsr registers frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 09/77] target/riscv: rvv-1.0: add vcsr register frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 10/77] target/riscv: rvv-1.0: add vlenb register frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 11/77] target/riscv: rvv-1.0: check MSTATUS_VS when accessing vector csr registers frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 12/77] target/riscv: rvv-1.0: remove MLEN calculations frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 13/77] target/riscv: rvv-1.0: add fractional LMUL frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 14/77] target/riscv: rvv-1.0: add VMA and VTA frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 15/77] target/riscv: rvv-1.0: update check functions frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 16/77] target/riscv: introduce more imm value modes in translator functions frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 17/77] target/riscv: rvv:1.0: add translation-time nan-box helper function frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 18/77] target/riscv: rvv-1.0: remove amo operations instructions frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 19/77] target/riscv: rvv-1.0: configure instructions frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 20/77] target/riscv: rvv-1.0: stride load and store instructions frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 21/77] target/riscv: rvv-1.0: index " frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 22/77] target/riscv: rvv-1.0: fix address index overflow bug of indexed load/store insns frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 23/77] target/riscv: rvv-1.0: fault-only-first unit stride load frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` frank.chang [this message]
2021-11-29  3:02   ` [PATCH v10 24/77] target/riscv: rvv-1.0: load/store whole register instructions frank.chang
2021-11-29  3:02 ` [PATCH v10 25/77] target/riscv: rvv-1.0: update vext_max_elems() for load/store insns frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 26/77] target/riscv: rvv-1.0: take fractional LMUL into vector max elements calculation frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 27/77] target/riscv: rvv-1.0: floating-point square-root instruction frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 28/77] target/riscv: rvv-1.0: floating-point classify instructions frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 29/77] target/riscv: rvv-1.0: count population in mask instruction frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 30/77] target/riscv: rvv-1.0: find-first-set mask bit instruction frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 31/77] target/riscv: rvv-1.0: set-X-first mask bit instructions frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 32/77] target/riscv: rvv-1.0: iota instruction frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 33/77] target/riscv: rvv-1.0: element index instruction frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 34/77] target/riscv: rvv-1.0: allow load element with sign-extended frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 35/77] target/riscv: rvv-1.0: register gather instructions frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 36/77] target/riscv: rvv-1.0: integer scalar move instructions frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 37/77] target/riscv: rvv-1.0: floating-point move instruction frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 38/77] target/riscv: rvv-1.0: floating-point scalar move instructions frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:02 ` [PATCH v10 39/77] target/riscv: rvv-1.0: whole register " frank.chang
2021-11-29  3:02   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 40/77] target/riscv: rvv-1.0: integer extension instructions frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 41/77] target/riscv: rvv-1.0: single-width averaging add and subtract instructions frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 42/77] target/riscv: rvv-1.0: single-width bit shift instructions frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 43/77] target/riscv: rvv-1.0: integer add-with-carry/subtract-with-borrow frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 44/77] target/riscv: rvv-1.0: narrowing integer right shift instructions frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 45/77] target/riscv: rvv-1.0: widening integer multiply-add instructions frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 46/77] target/riscv: rvv-1.0: single-width saturating add and subtract instructions frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 47/77] target/riscv: rvv-1.0: integer comparison instructions frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 48/77] target/riscv: rvv-1.0: floating-point compare instructions frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 49/77] target/riscv: rvv-1.0: mask-register logical instructions frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 50/77] target/riscv: rvv-1.0: slide instructions frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 51/77] target/riscv: rvv-1.0: floating-point " frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 52/77] target/riscv: rvv-1.0: narrowing fixed-point clip instructions frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 53/77] target/riscv: rvv-1.0: single-width floating-point reduction frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 54/77] target/riscv: rvv-1.0: widening floating-point reduction instructions frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 55/77] target/riscv: rvv-1.0: single-width scaling shift instructions frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 56/77] target/riscv: rvv-1.0: remove widening saturating scaled multiply-add frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 57/77] target/riscv: rvv-1.0: remove vmford.vv and vmford.vf frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 58/77] target/riscv: rvv-1.0: remove integer extract instruction frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 59/77] target/riscv: rvv-1.0: floating-point min/max instructions frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 60/77] target/riscv: introduce floating-point rounding mode enum frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 61/77] target/riscv: rvv-1.0: floating-point/integer type-convert instructions frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 62/77] target/riscv: rvv-1.0: widening floating-point/integer type-convert frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 63/77] target/riscv: add "set round to odd" rounding mode helper function frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 64/77] target/riscv: rvv-1.0: narrowing floating-point/integer type-convert frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 65/77] target/riscv: rvv-1.0: relax RV_VLEN_MAX to 1024-bits frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 66/77] target/riscv: rvv-1.0: implement vstart CSR frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 67/77] target/riscv: rvv-1.0: trigger illegal instruction exception if frm is not valid frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 68/77] target/riscv: gdb: support vector registers for rv64 & rv32 frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 69/77] target/riscv: rvv-1.0: floating-point reciprocal square-root estimate instruction frank.chang
2021-11-29  3:03   ` frank.chang
2021-12-08  3:32   ` Alistair Francis
2021-12-08  3:32     ` Alistair Francis
2021-11-29  3:03 ` [PATCH v10 70/77] target/riscv: rvv-1.0: floating-point reciprocal " frank.chang
2021-11-29  3:03   ` frank.chang
2021-12-08  3:38   ` Alistair Francis
2021-12-08  3:38     ` Alistair Francis
2021-11-29  3:03 ` [PATCH v10 71/77] target/riscv: rvv-1.0: rename r2_zimm to r2_zimm11 frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 72/77] target/riscv: rvv-1.0: add vsetivli instruction frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 73/77] target/riscv: rvv-1.0: add evl parameter to vext_ldst_us() frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 74/77] target/riscv: rvv-1.0: add vector unit-stride mask load/store insns frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 75/77] target/riscv: rvv-1.0: rename vmandnot.mm and vmornot.mm to vmandn.mm and vmorn.mm frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 76/77] target/riscv: rvv-1.0: update opivv_vadc_check() comment frank.chang
2021-11-29  3:03   ` frank.chang
2021-11-29  3:03 ` [PATCH v10 77/77] target/riscv: rvv-1.0: Add ELEN checks for widening and narrowing instructions frank.chang
2021-11-29  3:03   ` frank.chang
2021-12-08  3:44   ` Alistair Francis
2021-12-08  3:44     ` Alistair Francis
2021-12-08  6:39 ` [PATCH v10 00/77] support vector extension v1.0 Alistair Francis
2021-12-08  6:39   ` Alistair Francis
2021-12-10  7:35   ` Frank Chang
2021-12-10  7:35     ` Frank Chang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20211129030340.429689-25-frank.chang@sifive.com \
    --to=frank.chang@sifive.com \
    --cc=alistair.francis@wdc.com \
    --cc=bin.meng@windriver.com \
    --cc=palmer@dabbelt.com \
    --cc=qemu-devel@nongnu.org \
    --cc=qemu-riscv@nongnu.org \
    --cc=richard.henderson@linaro.org \
    --cc=zhiwei_liu@c-sky.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.