mirror of https://github.com/proxmox/mirror_qemu
This PR contains two patches to improve PLIC support in QEMU.
It also contains one patch that fixes CLINT accesses for RISC-V. This fixes a regression for most RISC-V boards. The rest of the PR is adding support for the v0.7.1 RISC-V vector extensions. This is experimental support as the vector extensions are still in a draft state. This is a v2 pull request that has fixed the building on big endian machines failure. -----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEE9sSsRtSTSGjTuM6PIeENKd+XcFQFAl7+CaIACgkQIeENKd+X cFTB0ggAhzBWLbhWfjyFSw2Unbt77zFOPtbAPThxskF63rfPutleXCUtdYk+I3Us 2XYrSScV87aZXJK4ZLqGYhskWCLEShHx4dH6Gl01SVkxDaMPLl6MOvo7JPcMQigX 5c2m2I7UYVbwubxvb3/2bpvbIzdV42bk4X/suq4cr5sUzNrGXUNUXPT33xfuENk1 jTHsz4dc2IqTZT22uasw1/RcGQCTUL3Oe2T8PXVV8FBj5D1GdSvdRHPAldsLv6cW Cks8W8HHRauraA+Cmaemv6w5un03ByHzwDq32Li2/zPHR1DFgFVJ0XFIMKmq4znF Q8TFXzpUdL2CiHiql2DF9CSByJHIsQ== =14HX -----END PGP SIGNATURE----- Merge remote-tracking branch 'remotes/alistair/tags/pull-riscv-to-apply-20200702-1' into staging This PR contains two patches to improve PLIC support in QEMU. It also contains one patch that fixes CLINT accesses for RISC-V. This fixes a regression for most RISC-V boards. The rest of the PR is adding support for the v0.7.1 RISC-V vector extensions. This is experimental support as the vector extensions are still in a draft state. This is a v2 pull request that has fixed the building on big endian machines failure. # gpg: Signature made Thu 02 Jul 2020 17:21:54 BST # gpg: using RSA key F6C4AC46D4934868D3B8CE8F21E10D29DF977054 # gpg: Good signature from "Alistair Francis <alistair@alistair23.me>" [full] # Primary key fingerprint: F6C4 AC46 D493 4868 D3B8 CE8F 21E1 0D29 DF97 7054 * remotes/alistair/tags/pull-riscv-to-apply-20200702-1: (64 commits) target/riscv: configure and turn on vector extension from command line target/riscv: vector compress instruction target/riscv: vector register gather instruction target/riscv: vector slide instructions target/riscv: floating-point scalar move instructions target/riscv: integer scalar move instruction target/riscv: integer extract instruction target/riscv: vector element index instruction target/riscv: vector iota instruction target/riscv: set-X-first mask bit target/riscv: vmfirst find-first-set mask bit target/riscv: vector mask population count vmpopc target/riscv: vector mask-register logical instructions target/riscv: vector widening floating-point reduction instructions target/riscv: vector single-width floating-point reduction instructions target/riscv: vector wideing integer reduction instructions target/riscv: vector single-width integer reduction instructions target/riscv: narrowing floating-point/integer type-convert instructions target/riscv: widening floating-point/integer type-convert instructions target/riscv: vector floating-point/integer type-convert instructions ... Signed-off-by: Peter Maydell <peter.maydell@linaro.org>master
commit
5f42c3375d
|
@ -181,7 +181,7 @@ static const MemoryRegionOps sifive_clint_ops = {
|
||||||
.endianness = DEVICE_LITTLE_ENDIAN,
|
.endianness = DEVICE_LITTLE_ENDIAN,
|
||||||
.valid = {
|
.valid = {
|
||||||
.min_access_size = 4,
|
.min_access_size = 4,
|
||||||
.max_access_size = 4
|
.max_access_size = 8
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -166,6 +166,9 @@ static void sifive_plic_update(SiFivePLICState *plic)
|
||||||
static uint32_t sifive_plic_claim(SiFivePLICState *plic, uint32_t addrid)
|
static uint32_t sifive_plic_claim(SiFivePLICState *plic, uint32_t addrid)
|
||||||
{
|
{
|
||||||
int i, j;
|
int i, j;
|
||||||
|
uint32_t max_irq = 0;
|
||||||
|
uint32_t max_prio = plic->target_priority[addrid];
|
||||||
|
|
||||||
for (i = 0; i < plic->bitfield_words; i++) {
|
for (i = 0; i < plic->bitfield_words; i++) {
|
||||||
uint32_t pending_enabled_not_claimed =
|
uint32_t pending_enabled_not_claimed =
|
||||||
(plic->pending[i] & ~plic->claimed[i]) &
|
(plic->pending[i] & ~plic->claimed[i]) &
|
||||||
|
@ -177,14 +180,18 @@ static uint32_t sifive_plic_claim(SiFivePLICState *plic, uint32_t addrid)
|
||||||
int irq = (i << 5) + j;
|
int irq = (i << 5) + j;
|
||||||
uint32_t prio = plic->source_priority[irq];
|
uint32_t prio = plic->source_priority[irq];
|
||||||
int enabled = pending_enabled_not_claimed & (1 << j);
|
int enabled = pending_enabled_not_claimed & (1 << j);
|
||||||
if (enabled && prio > plic->target_priority[addrid]) {
|
if (enabled && prio > max_prio) {
|
||||||
sifive_plic_set_pending(plic, irq, false);
|
max_irq = irq;
|
||||||
sifive_plic_set_claimed(plic, irq, true);
|
max_prio = prio;
|
||||||
return irq;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
|
if (max_irq) {
|
||||||
|
sifive_plic_set_pending(plic, max_irq, false);
|
||||||
|
sifive_plic_set_claimed(plic, max_irq, true);
|
||||||
|
}
|
||||||
|
return max_irq;
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint64_t sifive_plic_read(void *opaque, hwaddr addr, unsigned size)
|
static uint64_t sifive_plic_read(void *opaque, hwaddr addr, unsigned size)
|
||||||
|
@ -248,8 +255,8 @@ static uint64_t sifive_plic_read(void *opaque, hwaddr addr, unsigned size)
|
||||||
plic->addr_config[addrid].hartid,
|
plic->addr_config[addrid].hartid,
|
||||||
mode_to_char(plic->addr_config[addrid].mode),
|
mode_to_char(plic->addr_config[addrid].mode),
|
||||||
value);
|
value);
|
||||||
sifive_plic_print_state(plic);
|
|
||||||
}
|
}
|
||||||
|
sifive_plic_update(plic);
|
||||||
return value;
|
return value;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -280,6 +287,7 @@ static void sifive_plic_write(void *opaque, hwaddr addr, uint64_t value,
|
||||||
qemu_log("plic: write priority: irq=%d priority=%d\n",
|
qemu_log("plic: write priority: irq=%d priority=%d\n",
|
||||||
irq, plic->source_priority[irq]);
|
irq, plic->source_priority[irq]);
|
||||||
}
|
}
|
||||||
|
sifive_plic_update(plic);
|
||||||
return;
|
return;
|
||||||
} else if (addr >= plic->pending_base && /* 1 bit per source */
|
} else if (addr >= plic->pending_base && /* 1 bit per source */
|
||||||
addr < plic->pending_base + (plic->num_sources >> 3))
|
addr < plic->pending_base + (plic->num_sources >> 3))
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
obj-y += translate.o op_helper.o cpu_helper.o cpu.o csr.o fpu_helper.o gdbstub.o
|
obj-y += translate.o op_helper.o cpu_helper.o cpu.o csr.o fpu_helper.o vector_helper.o gdbstub.o
|
||||||
obj-$(CONFIG_SOFTMMU) += pmp.o
|
obj-$(CONFIG_SOFTMMU) += pmp.o
|
||||||
|
|
||||||
ifeq ($(CONFIG_SOFTMMU),y)
|
ifeq ($(CONFIG_SOFTMMU),y)
|
||||||
|
|
|
@ -106,6 +106,11 @@ static void set_priv_version(CPURISCVState *env, int priv_ver)
|
||||||
env->priv_ver = priv_ver;
|
env->priv_ver = priv_ver;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void set_vext_version(CPURISCVState *env, int vext_ver)
|
||||||
|
{
|
||||||
|
env->vext_ver = vext_ver;
|
||||||
|
}
|
||||||
|
|
||||||
static void set_feature(CPURISCVState *env, int feature)
|
static void set_feature(CPURISCVState *env, int feature)
|
||||||
{
|
{
|
||||||
env->features |= (1ULL << feature);
|
env->features |= (1ULL << feature);
|
||||||
|
@ -334,6 +339,7 @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
|
||||||
CPURISCVState *env = &cpu->env;
|
CPURISCVState *env = &cpu->env;
|
||||||
RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(dev);
|
RISCVCPUClass *mcc = RISCV_CPU_GET_CLASS(dev);
|
||||||
int priv_version = PRIV_VERSION_1_11_0;
|
int priv_version = PRIV_VERSION_1_11_0;
|
||||||
|
int vext_version = VEXT_VERSION_0_07_1;
|
||||||
target_ulong target_misa = 0;
|
target_ulong target_misa = 0;
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
|
|
||||||
|
@ -357,6 +363,7 @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
|
||||||
}
|
}
|
||||||
|
|
||||||
set_priv_version(env, priv_version);
|
set_priv_version(env, priv_version);
|
||||||
|
set_vext_version(env, vext_version);
|
||||||
|
|
||||||
if (cpu->cfg.mmu) {
|
if (cpu->cfg.mmu) {
|
||||||
set_feature(env, RISCV_FEATURE_MMU);
|
set_feature(env, RISCV_FEATURE_MMU);
|
||||||
|
@ -423,6 +430,45 @@ static void riscv_cpu_realize(DeviceState *dev, Error **errp)
|
||||||
if (cpu->cfg.ext_h) {
|
if (cpu->cfg.ext_h) {
|
||||||
target_misa |= RVH;
|
target_misa |= RVH;
|
||||||
}
|
}
|
||||||
|
if (cpu->cfg.ext_v) {
|
||||||
|
target_misa |= RVV;
|
||||||
|
if (!is_power_of_2(cpu->cfg.vlen)) {
|
||||||
|
error_setg(errp,
|
||||||
|
"Vector extension VLEN must be power of 2");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (cpu->cfg.vlen > RV_VLEN_MAX || cpu->cfg.vlen < 128) {
|
||||||
|
error_setg(errp,
|
||||||
|
"Vector extension implementation only supports VLEN "
|
||||||
|
"in the range [128, %d]", RV_VLEN_MAX);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (!is_power_of_2(cpu->cfg.elen)) {
|
||||||
|
error_setg(errp,
|
||||||
|
"Vector extension ELEN must be power of 2");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (cpu->cfg.elen > 64 || cpu->cfg.vlen < 8) {
|
||||||
|
error_setg(errp,
|
||||||
|
"Vector extension implementation only supports ELEN "
|
||||||
|
"in the range [8, 64]");
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (cpu->cfg.vext_spec) {
|
||||||
|
if (!g_strcmp0(cpu->cfg.vext_spec, "v0.7.1")) {
|
||||||
|
vext_version = VEXT_VERSION_0_07_1;
|
||||||
|
} else {
|
||||||
|
error_setg(errp,
|
||||||
|
"Unsupported vector spec version '%s'",
|
||||||
|
cpu->cfg.vext_spec);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
qemu_log("vector verison is not specified, "
|
||||||
|
"use the default value v0.7.1\n");
|
||||||
|
}
|
||||||
|
set_vext_version(env, vext_version);
|
||||||
|
}
|
||||||
|
|
||||||
set_misa(env, RVXLEN | target_misa);
|
set_misa(env, RVXLEN | target_misa);
|
||||||
}
|
}
|
||||||
|
@ -462,10 +508,14 @@ static Property riscv_cpu_properties[] = {
|
||||||
DEFINE_PROP_BOOL("u", RISCVCPU, cfg.ext_u, true),
|
DEFINE_PROP_BOOL("u", RISCVCPU, cfg.ext_u, true),
|
||||||
/* This is experimental so mark with 'x-' */
|
/* This is experimental so mark with 'x-' */
|
||||||
DEFINE_PROP_BOOL("x-h", RISCVCPU, cfg.ext_h, false),
|
DEFINE_PROP_BOOL("x-h", RISCVCPU, cfg.ext_h, false),
|
||||||
|
DEFINE_PROP_BOOL("x-v", RISCVCPU, cfg.ext_v, false),
|
||||||
DEFINE_PROP_BOOL("Counters", RISCVCPU, cfg.ext_counters, true),
|
DEFINE_PROP_BOOL("Counters", RISCVCPU, cfg.ext_counters, true),
|
||||||
DEFINE_PROP_BOOL("Zifencei", RISCVCPU, cfg.ext_ifencei, true),
|
DEFINE_PROP_BOOL("Zifencei", RISCVCPU, cfg.ext_ifencei, true),
|
||||||
DEFINE_PROP_BOOL("Zicsr", RISCVCPU, cfg.ext_icsr, true),
|
DEFINE_PROP_BOOL("Zicsr", RISCVCPU, cfg.ext_icsr, true),
|
||||||
DEFINE_PROP_STRING("priv_spec", RISCVCPU, cfg.priv_spec),
|
DEFINE_PROP_STRING("priv_spec", RISCVCPU, cfg.priv_spec),
|
||||||
|
DEFINE_PROP_STRING("vext_spec", RISCVCPU, cfg.vext_spec),
|
||||||
|
DEFINE_PROP_UINT16("vlen", RISCVCPU, cfg.vlen, 128),
|
||||||
|
DEFINE_PROP_UINT16("elen", RISCVCPU, cfg.elen, 64),
|
||||||
DEFINE_PROP_BOOL("mmu", RISCVCPU, cfg.mmu, true),
|
DEFINE_PROP_BOOL("mmu", RISCVCPU, cfg.mmu, true),
|
||||||
DEFINE_PROP_BOOL("pmp", RISCVCPU, cfg.pmp, true),
|
DEFINE_PROP_BOOL("pmp", RISCVCPU, cfg.pmp, true),
|
||||||
DEFINE_PROP_END_OF_LIST(),
|
DEFINE_PROP_END_OF_LIST(),
|
||||||
|
|
|
@ -21,6 +21,7 @@
|
||||||
#define RISCV_CPU_H
|
#define RISCV_CPU_H
|
||||||
|
|
||||||
#include "hw/core/cpu.h"
|
#include "hw/core/cpu.h"
|
||||||
|
#include "hw/registerfields.h"
|
||||||
#include "exec/cpu-defs.h"
|
#include "exec/cpu-defs.h"
|
||||||
#include "fpu/softfloat-types.h"
|
#include "fpu/softfloat-types.h"
|
||||||
|
|
||||||
|
@ -59,6 +60,7 @@
|
||||||
#define RVA RV('A')
|
#define RVA RV('A')
|
||||||
#define RVF RV('F')
|
#define RVF RV('F')
|
||||||
#define RVD RV('D')
|
#define RVD RV('D')
|
||||||
|
#define RVV RV('V')
|
||||||
#define RVC RV('C')
|
#define RVC RV('C')
|
||||||
#define RVS RV('S')
|
#define RVS RV('S')
|
||||||
#define RVU RV('U')
|
#define RVU RV('U')
|
||||||
|
@ -77,6 +79,8 @@ enum {
|
||||||
#define PRIV_VERSION_1_10_0 0x00011000
|
#define PRIV_VERSION_1_10_0 0x00011000
|
||||||
#define PRIV_VERSION_1_11_0 0x00011100
|
#define PRIV_VERSION_1_11_0 0x00011100
|
||||||
|
|
||||||
|
#define VEXT_VERSION_0_07_1 0x00000701
|
||||||
|
|
||||||
#define TRANSLATE_PMP_FAIL 2
|
#define TRANSLATE_PMP_FAIL 2
|
||||||
#define TRANSLATE_FAIL 1
|
#define TRANSLATE_FAIL 1
|
||||||
#define TRANSLATE_SUCCESS 0
|
#define TRANSLATE_SUCCESS 0
|
||||||
|
@ -88,9 +92,26 @@ typedef struct CPURISCVState CPURISCVState;
|
||||||
|
|
||||||
#include "pmp.h"
|
#include "pmp.h"
|
||||||
|
|
||||||
|
#define RV_VLEN_MAX 256
|
||||||
|
|
||||||
|
FIELD(VTYPE, VLMUL, 0, 2)
|
||||||
|
FIELD(VTYPE, VSEW, 2, 3)
|
||||||
|
FIELD(VTYPE, VEDIV, 5, 2)
|
||||||
|
FIELD(VTYPE, RESERVED, 7, sizeof(target_ulong) * 8 - 9)
|
||||||
|
FIELD(VTYPE, VILL, sizeof(target_ulong) * 8 - 2, 1)
|
||||||
|
|
||||||
struct CPURISCVState {
|
struct CPURISCVState {
|
||||||
target_ulong gpr[32];
|
target_ulong gpr[32];
|
||||||
uint64_t fpr[32]; /* assume both F and D extensions */
|
uint64_t fpr[32]; /* assume both F and D extensions */
|
||||||
|
|
||||||
|
/* vector coprocessor state. */
|
||||||
|
uint64_t vreg[32 * RV_VLEN_MAX / 64] QEMU_ALIGNED(16);
|
||||||
|
target_ulong vxrm;
|
||||||
|
target_ulong vxsat;
|
||||||
|
target_ulong vl;
|
||||||
|
target_ulong vstart;
|
||||||
|
target_ulong vtype;
|
||||||
|
|
||||||
target_ulong pc;
|
target_ulong pc;
|
||||||
target_ulong load_res;
|
target_ulong load_res;
|
||||||
target_ulong load_val;
|
target_ulong load_val;
|
||||||
|
@ -101,6 +122,7 @@ struct CPURISCVState {
|
||||||
target_ulong guest_phys_fault_addr;
|
target_ulong guest_phys_fault_addr;
|
||||||
|
|
||||||
target_ulong priv_ver;
|
target_ulong priv_ver;
|
||||||
|
target_ulong vext_ver;
|
||||||
target_ulong misa;
|
target_ulong misa;
|
||||||
target_ulong misa_mask;
|
target_ulong misa_mask;
|
||||||
|
|
||||||
|
@ -257,12 +279,16 @@ typedef struct RISCVCPU {
|
||||||
bool ext_s;
|
bool ext_s;
|
||||||
bool ext_u;
|
bool ext_u;
|
||||||
bool ext_h;
|
bool ext_h;
|
||||||
|
bool ext_v;
|
||||||
bool ext_counters;
|
bool ext_counters;
|
||||||
bool ext_ifencei;
|
bool ext_ifencei;
|
||||||
bool ext_icsr;
|
bool ext_icsr;
|
||||||
|
|
||||||
char *priv_spec;
|
char *priv_spec;
|
||||||
char *user_spec;
|
char *user_spec;
|
||||||
|
char *vext_spec;
|
||||||
|
uint16_t vlen;
|
||||||
|
uint16_t elen;
|
||||||
bool mmu;
|
bool mmu;
|
||||||
bool pmp;
|
bool pmp;
|
||||||
} cfg;
|
} cfg;
|
||||||
|
@ -335,19 +361,62 @@ void riscv_cpu_set_fflags(CPURISCVState *env, target_ulong);
|
||||||
#define TB_FLAGS_MMU_MASK 3
|
#define TB_FLAGS_MMU_MASK 3
|
||||||
#define TB_FLAGS_MSTATUS_FS MSTATUS_FS
|
#define TB_FLAGS_MSTATUS_FS MSTATUS_FS
|
||||||
|
|
||||||
static inline void cpu_get_tb_cpu_state(CPURISCVState *env, target_ulong *pc,
|
typedef CPURISCVState CPUArchState;
|
||||||
target_ulong *cs_base, uint32_t *flags)
|
typedef RISCVCPU ArchCPU;
|
||||||
|
#include "exec/cpu-all.h"
|
||||||
|
|
||||||
|
FIELD(TB_FLAGS, VL_EQ_VLMAX, 2, 1)
|
||||||
|
FIELD(TB_FLAGS, LMUL, 3, 2)
|
||||||
|
FIELD(TB_FLAGS, SEW, 5, 3)
|
||||||
|
FIELD(TB_FLAGS, VILL, 8, 1)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* A simplification for VLMAX
|
||||||
|
* = (1 << LMUL) * VLEN / (8 * (1 << SEW))
|
||||||
|
* = (VLEN << LMUL) / (8 << SEW)
|
||||||
|
* = (VLEN << LMUL) >> (SEW + 3)
|
||||||
|
* = VLEN >> (SEW + 3 - LMUL)
|
||||||
|
*/
|
||||||
|
static inline uint32_t vext_get_vlmax(RISCVCPU *cpu, target_ulong vtype)
|
||||||
{
|
{
|
||||||
|
uint8_t sew, lmul;
|
||||||
|
|
||||||
|
sew = FIELD_EX64(vtype, VTYPE, VSEW);
|
||||||
|
lmul = FIELD_EX64(vtype, VTYPE, VLMUL);
|
||||||
|
return cpu->cfg.vlen >> (sew + 3 - lmul);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void cpu_get_tb_cpu_state(CPURISCVState *env, target_ulong *pc,
|
||||||
|
target_ulong *cs_base, uint32_t *pflags)
|
||||||
|
{
|
||||||
|
uint32_t flags = 0;
|
||||||
|
|
||||||
*pc = env->pc;
|
*pc = env->pc;
|
||||||
*cs_base = 0;
|
*cs_base = 0;
|
||||||
|
|
||||||
|
if (riscv_has_ext(env, RVV)) {
|
||||||
|
uint32_t vlmax = vext_get_vlmax(env_archcpu(env), env->vtype);
|
||||||
|
bool vl_eq_vlmax = (env->vstart == 0) && (vlmax == env->vl);
|
||||||
|
flags = FIELD_DP32(flags, TB_FLAGS, VILL,
|
||||||
|
FIELD_EX64(env->vtype, VTYPE, VILL));
|
||||||
|
flags = FIELD_DP32(flags, TB_FLAGS, SEW,
|
||||||
|
FIELD_EX64(env->vtype, VTYPE, VSEW));
|
||||||
|
flags = FIELD_DP32(flags, TB_FLAGS, LMUL,
|
||||||
|
FIELD_EX64(env->vtype, VTYPE, VLMUL));
|
||||||
|
flags = FIELD_DP32(flags, TB_FLAGS, VL_EQ_VLMAX, vl_eq_vlmax);
|
||||||
|
} else {
|
||||||
|
flags = FIELD_DP32(flags, TB_FLAGS, VILL, 1);
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_USER_ONLY
|
#ifdef CONFIG_USER_ONLY
|
||||||
*flags = TB_FLAGS_MSTATUS_FS;
|
flags |= TB_FLAGS_MSTATUS_FS;
|
||||||
#else
|
#else
|
||||||
*flags = cpu_mmu_index(env, 0);
|
flags |= cpu_mmu_index(env, 0);
|
||||||
if (riscv_cpu_fp_enabled(env)) {
|
if (riscv_cpu_fp_enabled(env)) {
|
||||||
*flags |= env->mstatus & MSTATUS_FS;
|
flags |= env->mstatus & MSTATUS_FS;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
*pflags = flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
int riscv_csrrw(CPURISCVState *env, int csrno, target_ulong *ret_value,
|
int riscv_csrrw(CPURISCVState *env, int csrno, target_ulong *ret_value,
|
||||||
|
@ -388,9 +457,4 @@ void riscv_set_csr_ops(int csrno, riscv_csr_operations *ops);
|
||||||
|
|
||||||
void riscv_cpu_register_gdb_regs_for_features(CPUState *cs);
|
void riscv_cpu_register_gdb_regs_for_features(CPUState *cs);
|
||||||
|
|
||||||
typedef CPURISCVState CPUArchState;
|
|
||||||
typedef RISCVCPU ArchCPU;
|
|
||||||
|
|
||||||
#include "exec/cpu-all.h"
|
|
||||||
|
|
||||||
#endif /* RISCV_CPU_H */
|
#endif /* RISCV_CPU_H */
|
||||||
|
|
|
@ -29,6 +29,14 @@
|
||||||
#define FSR_NXA (FPEXC_NX << FSR_AEXC_SHIFT)
|
#define FSR_NXA (FPEXC_NX << FSR_AEXC_SHIFT)
|
||||||
#define FSR_AEXC (FSR_NVA | FSR_OFA | FSR_UFA | FSR_DZA | FSR_NXA)
|
#define FSR_AEXC (FSR_NVA | FSR_OFA | FSR_UFA | FSR_DZA | FSR_NXA)
|
||||||
|
|
||||||
|
/* Vector Fixed-Point round model */
|
||||||
|
#define FSR_VXRM_SHIFT 9
|
||||||
|
#define FSR_VXRM (0x3 << FSR_VXRM_SHIFT)
|
||||||
|
|
||||||
|
/* Vector Fixed-Point saturation flag */
|
||||||
|
#define FSR_VXSAT_SHIFT 8
|
||||||
|
#define FSR_VXSAT (0x1 << FSR_VXSAT_SHIFT)
|
||||||
|
|
||||||
/* Control and Status Registers */
|
/* Control and Status Registers */
|
||||||
|
|
||||||
/* User Trap Setup */
|
/* User Trap Setup */
|
||||||
|
@ -48,6 +56,13 @@
|
||||||
#define CSR_FRM 0x002
|
#define CSR_FRM 0x002
|
||||||
#define CSR_FCSR 0x003
|
#define CSR_FCSR 0x003
|
||||||
|
|
||||||
|
/* User Vector CSRs */
|
||||||
|
#define CSR_VSTART 0x008
|
||||||
|
#define CSR_VXSAT 0x009
|
||||||
|
#define CSR_VXRM 0x00a
|
||||||
|
#define CSR_VL 0xc20
|
||||||
|
#define CSR_VTYPE 0xc21
|
||||||
|
|
||||||
/* User Timers and Counters */
|
/* User Timers and Counters */
|
||||||
#define CSR_CYCLE 0xc00
|
#define CSR_CYCLE 0xc00
|
||||||
#define CSR_TIME 0xc01
|
#define CSR_TIME 0xc01
|
||||||
|
|
|
@ -46,6 +46,10 @@ void riscv_set_csr_ops(int csrno, riscv_csr_operations *ops)
|
||||||
static int fs(CPURISCVState *env, int csrno)
|
static int fs(CPURISCVState *env, int csrno)
|
||||||
{
|
{
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
/* loose check condition for fcsr in vector extension */
|
||||||
|
if ((csrno == CSR_FCSR) && (env->misa & RVV)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
if (!env->debugger && !riscv_cpu_fp_enabled(env)) {
|
if (!env->debugger && !riscv_cpu_fp_enabled(env)) {
|
||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
@ -53,6 +57,14 @@ static int fs(CPURISCVState *env, int csrno)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int vs(CPURISCVState *env, int csrno)
|
||||||
|
{
|
||||||
|
if (env->misa & RVV) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
return -1;
|
||||||
|
}
|
||||||
|
|
||||||
static int ctr(CPURISCVState *env, int csrno)
|
static int ctr(CPURISCVState *env, int csrno)
|
||||||
{
|
{
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
|
@ -154,6 +166,10 @@ static int read_fcsr(CPURISCVState *env, int csrno, target_ulong *val)
|
||||||
#endif
|
#endif
|
||||||
*val = (riscv_cpu_get_fflags(env) << FSR_AEXC_SHIFT)
|
*val = (riscv_cpu_get_fflags(env) << FSR_AEXC_SHIFT)
|
||||||
| (env->frm << FSR_RD_SHIFT);
|
| (env->frm << FSR_RD_SHIFT);
|
||||||
|
if (vs(env, csrno) >= 0) {
|
||||||
|
*val |= (env->vxrm << FSR_VXRM_SHIFT)
|
||||||
|
| (env->vxsat << FSR_VXSAT_SHIFT);
|
||||||
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -166,10 +182,62 @@ static int write_fcsr(CPURISCVState *env, int csrno, target_ulong val)
|
||||||
env->mstatus |= MSTATUS_FS;
|
env->mstatus |= MSTATUS_FS;
|
||||||
#endif
|
#endif
|
||||||
env->frm = (val & FSR_RD) >> FSR_RD_SHIFT;
|
env->frm = (val & FSR_RD) >> FSR_RD_SHIFT;
|
||||||
|
if (vs(env, csrno) >= 0) {
|
||||||
|
env->vxrm = (val & FSR_VXRM) >> FSR_VXRM_SHIFT;
|
||||||
|
env->vxsat = (val & FSR_VXSAT) >> FSR_VXSAT_SHIFT;
|
||||||
|
}
|
||||||
riscv_cpu_set_fflags(env, (val & FSR_AEXC) >> FSR_AEXC_SHIFT);
|
riscv_cpu_set_fflags(env, (val & FSR_AEXC) >> FSR_AEXC_SHIFT);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int read_vtype(CPURISCVState *env, int csrno, target_ulong *val)
|
||||||
|
{
|
||||||
|
*val = env->vtype;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int read_vl(CPURISCVState *env, int csrno, target_ulong *val)
|
||||||
|
{
|
||||||
|
*val = env->vl;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int read_vxrm(CPURISCVState *env, int csrno, target_ulong *val)
|
||||||
|
{
|
||||||
|
*val = env->vxrm;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int write_vxrm(CPURISCVState *env, int csrno, target_ulong val)
|
||||||
|
{
|
||||||
|
env->vxrm = val;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int read_vxsat(CPURISCVState *env, int csrno, target_ulong *val)
|
||||||
|
{
|
||||||
|
*val = env->vxsat;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int write_vxsat(CPURISCVState *env, int csrno, target_ulong val)
|
||||||
|
{
|
||||||
|
env->vxsat = val;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int read_vstart(CPURISCVState *env, int csrno, target_ulong *val)
|
||||||
|
{
|
||||||
|
*val = env->vstart;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int write_vstart(CPURISCVState *env, int csrno, target_ulong val)
|
||||||
|
{
|
||||||
|
env->vstart = val;
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
/* User Timers and Counters */
|
/* User Timers and Counters */
|
||||||
static int read_instret(CPURISCVState *env, int csrno, target_ulong *val)
|
static int read_instret(CPURISCVState *env, int csrno, target_ulong *val)
|
||||||
{
|
{
|
||||||
|
@ -1183,7 +1251,12 @@ static riscv_csr_operations csr_ops[CSR_TABLE_SIZE] = {
|
||||||
[CSR_FFLAGS] = { fs, read_fflags, write_fflags },
|
[CSR_FFLAGS] = { fs, read_fflags, write_fflags },
|
||||||
[CSR_FRM] = { fs, read_frm, write_frm },
|
[CSR_FRM] = { fs, read_frm, write_frm },
|
||||||
[CSR_FCSR] = { fs, read_fcsr, write_fcsr },
|
[CSR_FCSR] = { fs, read_fcsr, write_fcsr },
|
||||||
|
/* Vector CSRs */
|
||||||
|
[CSR_VSTART] = { vs, read_vstart, write_vstart },
|
||||||
|
[CSR_VXSAT] = { vs, read_vxsat, write_vxsat },
|
||||||
|
[CSR_VXRM] = { vs, read_vxrm, write_vxrm },
|
||||||
|
[CSR_VL] = { vs, read_vl },
|
||||||
|
[CSR_VTYPE] = { vs, read_vtype },
|
||||||
/* User Timers and Counters */
|
/* User Timers and Counters */
|
||||||
[CSR_CYCLE] = { ctr, read_instret },
|
[CSR_CYCLE] = { ctr, read_instret },
|
||||||
[CSR_INSTRET] = { ctr, read_instret },
|
[CSR_INSTRET] = { ctr, read_instret },
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include "exec/exec-all.h"
|
#include "exec/exec-all.h"
|
||||||
#include "exec/helper-proto.h"
|
#include "exec/helper-proto.h"
|
||||||
#include "fpu/softfloat.h"
|
#include "fpu/softfloat.h"
|
||||||
|
#include "internals.h"
|
||||||
|
|
||||||
target_ulong riscv_cpu_get_fflags(CPURISCVState *env)
|
target_ulong riscv_cpu_get_fflags(CPURISCVState *env)
|
||||||
{
|
{
|
||||||
|
@ -230,21 +231,7 @@ uint64_t helper_fcvt_s_lu(CPURISCVState *env, uint64_t rs1)
|
||||||
|
|
||||||
target_ulong helper_fclass_s(uint64_t frs1)
|
target_ulong helper_fclass_s(uint64_t frs1)
|
||||||
{
|
{
|
||||||
float32 f = frs1;
|
return fclass_s(frs1);
|
||||||
bool sign = float32_is_neg(f);
|
|
||||||
|
|
||||||
if (float32_is_infinity(f)) {
|
|
||||||
return sign ? 1 << 0 : 1 << 7;
|
|
||||||
} else if (float32_is_zero(f)) {
|
|
||||||
return sign ? 1 << 3 : 1 << 4;
|
|
||||||
} else if (float32_is_zero_or_denormal(f)) {
|
|
||||||
return sign ? 1 << 2 : 1 << 5;
|
|
||||||
} else if (float32_is_any_nan(f)) {
|
|
||||||
float_status s = { }; /* for snan_bit_is_one */
|
|
||||||
return float32_is_quiet_nan(f, &s) ? 1 << 9 : 1 << 8;
|
|
||||||
} else {
|
|
||||||
return sign ? 1 << 1 : 1 << 6;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t helper_fadd_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2)
|
uint64_t helper_fadd_d(CPURISCVState *env, uint64_t frs1, uint64_t frs2)
|
||||||
|
@ -353,19 +340,5 @@ uint64_t helper_fcvt_d_lu(CPURISCVState *env, uint64_t rs1)
|
||||||
|
|
||||||
target_ulong helper_fclass_d(uint64_t frs1)
|
target_ulong helper_fclass_d(uint64_t frs1)
|
||||||
{
|
{
|
||||||
float64 f = frs1;
|
return fclass_d(frs1);
|
||||||
bool sign = float64_is_neg(f);
|
|
||||||
|
|
||||||
if (float64_is_infinity(f)) {
|
|
||||||
return sign ? 1 << 0 : 1 << 7;
|
|
||||||
} else if (float64_is_zero(f)) {
|
|
||||||
return sign ? 1 << 3 : 1 << 4;
|
|
||||||
} else if (float64_is_zero_or_denormal(f)) {
|
|
||||||
return sign ? 1 << 2 : 1 << 5;
|
|
||||||
} else if (float64_is_any_nan(f)) {
|
|
||||||
float_status s = { }; /* for snan_bit_is_one */
|
|
||||||
return float64_is_quiet_nan(f, &s) ? 1 << 9 : 1 << 8;
|
|
||||||
} else {
|
|
||||||
return sign ? 1 << 1 : 1 << 6;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -57,6 +57,17 @@ amomax_d 10100 . . ..... ..... 011 ..... 0101111 @atom_st
|
||||||
amominu_d 11000 . . ..... ..... 011 ..... 0101111 @atom_st
|
amominu_d 11000 . . ..... ..... 011 ..... 0101111 @atom_st
|
||||||
amomaxu_d 11100 . . ..... ..... 011 ..... 0101111 @atom_st
|
amomaxu_d 11100 . . ..... ..... 011 ..... 0101111 @atom_st
|
||||||
|
|
||||||
|
#*** Vector AMO operations (in addition to Zvamo) ***
|
||||||
|
vamoswapd_v 00001 . . ..... ..... 111 ..... 0101111 @r_wdvm
|
||||||
|
vamoaddd_v 00000 . . ..... ..... 111 ..... 0101111 @r_wdvm
|
||||||
|
vamoxord_v 00100 . . ..... ..... 111 ..... 0101111 @r_wdvm
|
||||||
|
vamoandd_v 01100 . . ..... ..... 111 ..... 0101111 @r_wdvm
|
||||||
|
vamoord_v 01000 . . ..... ..... 111 ..... 0101111 @r_wdvm
|
||||||
|
vamomind_v 10000 . . ..... ..... 111 ..... 0101111 @r_wdvm
|
||||||
|
vamomaxd_v 10100 . . ..... ..... 111 ..... 0101111 @r_wdvm
|
||||||
|
vamominud_v 11000 . . ..... ..... 111 ..... 0101111 @r_wdvm
|
||||||
|
vamomaxud_v 11100 . . ..... ..... 111 ..... 0101111 @r_wdvm
|
||||||
|
|
||||||
# *** RV64F Standard Extension (in addition to RV32F) ***
|
# *** RV64F Standard Extension (in addition to RV32F) ***
|
||||||
fcvt_l_s 1100000 00010 ..... ... ..... 1010011 @r2_rm
|
fcvt_l_s 1100000 00010 ..... ... ..... 1010011 @r2_rm
|
||||||
fcvt_lu_s 1100000 00011 ..... ... ..... 1010011 @r2_rm
|
fcvt_lu_s 1100000 00011 ..... ... ..... 1010011 @r2_rm
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
%sh10 20:10
|
%sh10 20:10
|
||||||
%csr 20:12
|
%csr 20:12
|
||||||
%rm 12:3
|
%rm 12:3
|
||||||
|
%nf 29:3 !function=ex_plus_1
|
||||||
|
|
||||||
# immediates:
|
# immediates:
|
||||||
%imm_i 20:s12
|
%imm_i 20:s12
|
||||||
|
@ -43,6 +44,11 @@
|
||||||
&u imm rd
|
&u imm rd
|
||||||
&shift shamt rs1 rd
|
&shift shamt rs1 rd
|
||||||
&atomic aq rl rs2 rs1 rd
|
&atomic aq rl rs2 rs1 rd
|
||||||
|
&rmrr vm rd rs1 rs2
|
||||||
|
&rmr vm rd rs2
|
||||||
|
&rwdvm vm wd rd rs1 rs2
|
||||||
|
&r2nfvm vm rd rs1 nf
|
||||||
|
&rnfvm vm rd rs1 rs2 nf
|
||||||
|
|
||||||
# Formats 32:
|
# Formats 32:
|
||||||
@r ....... ..... ..... ... ..... ....... &r %rs2 %rs1 %rd
|
@r ....... ..... ..... ... ..... ....... &r %rs2 %rs1 %rd
|
||||||
|
@ -62,6 +68,16 @@
|
||||||
@r_rm ....... ..... ..... ... ..... ....... %rs2 %rs1 %rm %rd
|
@r_rm ....... ..... ..... ... ..... ....... %rs2 %rs1 %rm %rd
|
||||||
@r2_rm ....... ..... ..... ... ..... ....... %rs1 %rm %rd
|
@r2_rm ....... ..... ..... ... ..... ....... %rs1 %rm %rd
|
||||||
@r2 ....... ..... ..... ... ..... ....... %rs1 %rd
|
@r2 ....... ..... ..... ... ..... ....... %rs1 %rd
|
||||||
|
@r2_nfvm ... ... vm:1 ..... ..... ... ..... ....... &r2nfvm %nf %rs1 %rd
|
||||||
|
@r2_vm ...... vm:1 ..... ..... ... ..... ....... &rmr %rs2 %rd
|
||||||
|
@r1_vm ...... vm:1 ..... ..... ... ..... ....... %rd
|
||||||
|
@r_nfvm ... ... vm:1 ..... ..... ... ..... ....... &rnfvm %nf %rs2 %rs1 %rd
|
||||||
|
@r2rd ....... ..... ..... ... ..... ....... %rs2 %rd
|
||||||
|
@r_vm ...... vm:1 ..... ..... ... ..... ....... &rmrr %rs2 %rs1 %rd
|
||||||
|
@r_vm_1 ...... . ..... ..... ... ..... ....... &rmrr vm=1 %rs2 %rs1 %rd
|
||||||
|
@r_vm_0 ...... . ..... ..... ... ..... ....... &rmrr vm=0 %rs2 %rs1 %rd
|
||||||
|
@r_wdvm ..... wd:1 vm:1 ..... ..... ... ..... ....... &rwdvm %rs2 %rs1 %rd
|
||||||
|
@r2_zimm . zimm:11 ..... ... ..... ....... %rs1 %rd
|
||||||
|
|
||||||
@hfence_gvma ....... ..... ..... ... ..... ....... %rs2 %rs1
|
@hfence_gvma ....... ..... ..... ... ..... ....... %rs2 %rs1
|
||||||
@hfence_vvma ....... ..... ..... ... ..... ....... %rs2 %rs1
|
@hfence_vvma ....... ..... ..... ... ..... ....... %rs2 %rs1
|
||||||
|
@ -209,3 +225,359 @@ fcvt_d_wu 1101001 00001 ..... ... ..... 1010011 @r2_rm
|
||||||
# *** RV32H Base Instruction Set ***
|
# *** RV32H Base Instruction Set ***
|
||||||
hfence_gvma 0110001 ..... ..... 000 00000 1110011 @hfence_gvma
|
hfence_gvma 0110001 ..... ..... 000 00000 1110011 @hfence_gvma
|
||||||
hfence_vvma 0010001 ..... ..... 000 00000 1110011 @hfence_vvma
|
hfence_vvma 0010001 ..... ..... 000 00000 1110011 @hfence_vvma
|
||||||
|
|
||||||
|
# *** RV32V Extension ***
|
||||||
|
|
||||||
|
# *** Vector loads and stores are encoded within LOADFP/STORE-FP ***
|
||||||
|
vlb_v ... 100 . 00000 ..... 000 ..... 0000111 @r2_nfvm
|
||||||
|
vlh_v ... 100 . 00000 ..... 101 ..... 0000111 @r2_nfvm
|
||||||
|
vlw_v ... 100 . 00000 ..... 110 ..... 0000111 @r2_nfvm
|
||||||
|
vle_v ... 000 . 00000 ..... 111 ..... 0000111 @r2_nfvm
|
||||||
|
vlbu_v ... 000 . 00000 ..... 000 ..... 0000111 @r2_nfvm
|
||||||
|
vlhu_v ... 000 . 00000 ..... 101 ..... 0000111 @r2_nfvm
|
||||||
|
vlwu_v ... 000 . 00000 ..... 110 ..... 0000111 @r2_nfvm
|
||||||
|
vlbff_v ... 100 . 10000 ..... 000 ..... 0000111 @r2_nfvm
|
||||||
|
vlhff_v ... 100 . 10000 ..... 101 ..... 0000111 @r2_nfvm
|
||||||
|
vlwff_v ... 100 . 10000 ..... 110 ..... 0000111 @r2_nfvm
|
||||||
|
vleff_v ... 000 . 10000 ..... 111 ..... 0000111 @r2_nfvm
|
||||||
|
vlbuff_v ... 000 . 10000 ..... 000 ..... 0000111 @r2_nfvm
|
||||||
|
vlhuff_v ... 000 . 10000 ..... 101 ..... 0000111 @r2_nfvm
|
||||||
|
vlwuff_v ... 000 . 10000 ..... 110 ..... 0000111 @r2_nfvm
|
||||||
|
vsb_v ... 000 . 00000 ..... 000 ..... 0100111 @r2_nfvm
|
||||||
|
vsh_v ... 000 . 00000 ..... 101 ..... 0100111 @r2_nfvm
|
||||||
|
vsw_v ... 000 . 00000 ..... 110 ..... 0100111 @r2_nfvm
|
||||||
|
vse_v ... 000 . 00000 ..... 111 ..... 0100111 @r2_nfvm
|
||||||
|
|
||||||
|
vlsb_v ... 110 . ..... ..... 000 ..... 0000111 @r_nfvm
|
||||||
|
vlsh_v ... 110 . ..... ..... 101 ..... 0000111 @r_nfvm
|
||||||
|
vlsw_v ... 110 . ..... ..... 110 ..... 0000111 @r_nfvm
|
||||||
|
vlse_v ... 010 . ..... ..... 111 ..... 0000111 @r_nfvm
|
||||||
|
vlsbu_v ... 010 . ..... ..... 000 ..... 0000111 @r_nfvm
|
||||||
|
vlshu_v ... 010 . ..... ..... 101 ..... 0000111 @r_nfvm
|
||||||
|
vlswu_v ... 010 . ..... ..... 110 ..... 0000111 @r_nfvm
|
||||||
|
vssb_v ... 010 . ..... ..... 000 ..... 0100111 @r_nfvm
|
||||||
|
vssh_v ... 010 . ..... ..... 101 ..... 0100111 @r_nfvm
|
||||||
|
vssw_v ... 010 . ..... ..... 110 ..... 0100111 @r_nfvm
|
||||||
|
vsse_v ... 010 . ..... ..... 111 ..... 0100111 @r_nfvm
|
||||||
|
|
||||||
|
vlxb_v ... 111 . ..... ..... 000 ..... 0000111 @r_nfvm
|
||||||
|
vlxh_v ... 111 . ..... ..... 101 ..... 0000111 @r_nfvm
|
||||||
|
vlxw_v ... 111 . ..... ..... 110 ..... 0000111 @r_nfvm
|
||||||
|
vlxe_v ... 011 . ..... ..... 111 ..... 0000111 @r_nfvm
|
||||||
|
vlxbu_v ... 011 . ..... ..... 000 ..... 0000111 @r_nfvm
|
||||||
|
vlxhu_v ... 011 . ..... ..... 101 ..... 0000111 @r_nfvm
|
||||||
|
vlxwu_v ... 011 . ..... ..... 110 ..... 0000111 @r_nfvm
|
||||||
|
# Vector ordered-indexed and unordered-indexed store insns.
|
||||||
|
vsxb_v ... -11 . ..... ..... 000 ..... 0100111 @r_nfvm
|
||||||
|
vsxh_v ... -11 . ..... ..... 101 ..... 0100111 @r_nfvm
|
||||||
|
vsxw_v ... -11 . ..... ..... 110 ..... 0100111 @r_nfvm
|
||||||
|
vsxe_v ... -11 . ..... ..... 111 ..... 0100111 @r_nfvm
|
||||||
|
|
||||||
|
#*** Vector AMO operations are encoded under the standard AMO major opcode ***
|
||||||
|
vamoswapw_v 00001 . . ..... ..... 110 ..... 0101111 @r_wdvm
|
||||||
|
vamoaddw_v 00000 . . ..... ..... 110 ..... 0101111 @r_wdvm
|
||||||
|
vamoxorw_v 00100 . . ..... ..... 110 ..... 0101111 @r_wdvm
|
||||||
|
vamoandw_v 01100 . . ..... ..... 110 ..... 0101111 @r_wdvm
|
||||||
|
vamoorw_v 01000 . . ..... ..... 110 ..... 0101111 @r_wdvm
|
||||||
|
vamominw_v 10000 . . ..... ..... 110 ..... 0101111 @r_wdvm
|
||||||
|
vamomaxw_v 10100 . . ..... ..... 110 ..... 0101111 @r_wdvm
|
||||||
|
vamominuw_v 11000 . . ..... ..... 110 ..... 0101111 @r_wdvm
|
||||||
|
vamomaxuw_v 11100 . . ..... ..... 110 ..... 0101111 @r_wdvm
|
||||||
|
|
||||||
|
# *** new major opcode OP-V ***
|
||||||
|
vadd_vv 000000 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vadd_vx 000000 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vadd_vi 000000 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vsub_vv 000010 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vsub_vx 000010 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vrsub_vx 000011 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vrsub_vi 000011 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vwaddu_vv 110000 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vwaddu_vx 110000 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vwadd_vv 110001 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vwadd_vx 110001 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vwsubu_vv 110010 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vwsubu_vx 110010 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vwsub_vv 110011 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vwsub_vx 110011 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vwaddu_wv 110100 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vwaddu_wx 110100 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vwadd_wv 110101 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vwadd_wx 110101 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vwsubu_wv 110110 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vwsubu_wx 110110 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vwsub_wv 110111 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vwsub_wx 110111 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vadc_vvm 010000 1 ..... ..... 000 ..... 1010111 @r_vm_1
|
||||||
|
vadc_vxm 010000 1 ..... ..... 100 ..... 1010111 @r_vm_1
|
||||||
|
vadc_vim 010000 1 ..... ..... 011 ..... 1010111 @r_vm_1
|
||||||
|
vmadc_vvm 010001 1 ..... ..... 000 ..... 1010111 @r_vm_1
|
||||||
|
vmadc_vxm 010001 1 ..... ..... 100 ..... 1010111 @r_vm_1
|
||||||
|
vmadc_vim 010001 1 ..... ..... 011 ..... 1010111 @r_vm_1
|
||||||
|
vsbc_vvm 010010 1 ..... ..... 000 ..... 1010111 @r_vm_1
|
||||||
|
vsbc_vxm 010010 1 ..... ..... 100 ..... 1010111 @r_vm_1
|
||||||
|
vmsbc_vvm 010011 1 ..... ..... 000 ..... 1010111 @r_vm_1
|
||||||
|
vmsbc_vxm 010011 1 ..... ..... 100 ..... 1010111 @r_vm_1
|
||||||
|
vand_vv 001001 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vand_vx 001001 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vand_vi 001001 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vor_vv 001010 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vor_vx 001010 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vor_vi 001010 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vxor_vv 001011 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vxor_vx 001011 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vxor_vi 001011 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vsll_vv 100101 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vsll_vx 100101 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vsll_vi 100101 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vsrl_vv 101000 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vsrl_vx 101000 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vsrl_vi 101000 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vsra_vv 101001 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vsra_vx 101001 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vsra_vi 101001 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vnsrl_vv 101100 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vnsrl_vx 101100 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vnsrl_vi 101100 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vnsra_vv 101101 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vnsra_vx 101101 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vnsra_vi 101101 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vmseq_vv 011000 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vmseq_vx 011000 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vmseq_vi 011000 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vmsne_vv 011001 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vmsne_vx 011001 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vmsne_vi 011001 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vmsltu_vv 011010 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vmsltu_vx 011010 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vmslt_vv 011011 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vmslt_vx 011011 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vmsleu_vv 011100 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vmsleu_vx 011100 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vmsleu_vi 011100 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vmsle_vv 011101 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vmsle_vx 011101 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vmsle_vi 011101 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vmsgtu_vx 011110 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vmsgtu_vi 011110 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vmsgt_vx 011111 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vmsgt_vi 011111 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vminu_vv 000100 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vminu_vx 000100 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vmin_vv 000101 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vmin_vx 000101 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vmaxu_vv 000110 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vmaxu_vx 000110 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vmax_vv 000111 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vmax_vx 000111 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vmul_vv 100101 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vmul_vx 100101 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vmulh_vv 100111 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vmulh_vx 100111 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vmulhu_vv 100100 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vmulhu_vx 100100 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vmulhsu_vv 100110 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vmulhsu_vx 100110 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vdivu_vv 100000 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vdivu_vx 100000 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vdiv_vv 100001 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vdiv_vx 100001 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vremu_vv 100010 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vremu_vx 100010 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vrem_vv 100011 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vrem_vx 100011 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vwmulu_vv 111000 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vwmulu_vx 111000 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vwmulsu_vv 111010 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vwmulsu_vx 111010 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vwmul_vv 111011 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vwmul_vx 111011 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vmacc_vv 101101 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vmacc_vx 101101 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vnmsac_vv 101111 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vnmsac_vx 101111 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vmadd_vv 101001 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vmadd_vx 101001 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vnmsub_vv 101011 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vnmsub_vx 101011 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vwmaccu_vv 111100 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vwmaccu_vx 111100 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vwmacc_vv 111101 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vwmacc_vx 111101 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vwmaccsu_vv 111110 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vwmaccsu_vx 111110 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vwmaccus_vx 111111 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vmv_v_v 010111 1 00000 ..... 000 ..... 1010111 @r2
|
||||||
|
vmv_v_x 010111 1 00000 ..... 100 ..... 1010111 @r2
|
||||||
|
vmv_v_i 010111 1 00000 ..... 011 ..... 1010111 @r2
|
||||||
|
vmerge_vvm 010111 0 ..... ..... 000 ..... 1010111 @r_vm_0
|
||||||
|
vmerge_vxm 010111 0 ..... ..... 100 ..... 1010111 @r_vm_0
|
||||||
|
vmerge_vim 010111 0 ..... ..... 011 ..... 1010111 @r_vm_0
|
||||||
|
vsaddu_vv 100000 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vsaddu_vx 100000 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vsaddu_vi 100000 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vsadd_vv 100001 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vsadd_vx 100001 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vsadd_vi 100001 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vssubu_vv 100010 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vssubu_vx 100010 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vssub_vv 100011 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vssub_vx 100011 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vaadd_vv 100100 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vaadd_vx 100100 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vaadd_vi 100100 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vasub_vv 100110 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vasub_vx 100110 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vsmul_vv 100111 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vsmul_vx 100111 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vwsmaccu_vv 111100 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vwsmaccu_vx 111100 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vwsmacc_vv 111101 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vwsmacc_vx 111101 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vwsmaccsu_vv 111110 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vwsmaccsu_vx 111110 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vwsmaccus_vx 111111 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vssrl_vv 101010 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vssrl_vx 101010 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vssrl_vi 101010 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vssra_vv 101011 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vssra_vx 101011 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vssra_vi 101011 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vnclipu_vv 101110 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vnclipu_vx 101110 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vnclipu_vi 101110 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vnclip_vv 101111 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vnclip_vx 101111 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vnclip_vi 101111 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vfadd_vv 000000 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfadd_vf 000000 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfsub_vv 000010 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfsub_vf 000010 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfrsub_vf 100111 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfwadd_vv 110000 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfwadd_vf 110000 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfwadd_wv 110100 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfwadd_wf 110100 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfwsub_vv 110010 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfwsub_vf 110010 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfwsub_wv 110110 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfwsub_wf 110110 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfmul_vv 100100 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfmul_vf 100100 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfdiv_vv 100000 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfdiv_vf 100000 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfrdiv_vf 100001 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfwmul_vv 111000 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfwmul_vf 111000 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfmacc_vv 101100 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfnmacc_vv 101101 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfnmacc_vf 101101 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfmacc_vf 101100 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfmsac_vv 101110 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfmsac_vf 101110 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfnmsac_vv 101111 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfnmsac_vf 101111 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfmadd_vv 101000 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfmadd_vf 101000 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfnmadd_vv 101001 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfnmadd_vf 101001 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfmsub_vv 101010 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfmsub_vf 101010 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfnmsub_vv 101011 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfnmsub_vf 101011 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfwmacc_vv 111100 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfwmacc_vf 111100 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfwnmacc_vv 111101 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfwnmacc_vf 111101 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfwmsac_vv 111110 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfwmsac_vf 111110 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfwnmsac_vv 111111 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfwnmsac_vf 111111 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfsqrt_v 100011 . ..... 00000 001 ..... 1010111 @r2_vm
|
||||||
|
vfmin_vv 000100 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfmin_vf 000100 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfmax_vv 000110 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfmax_vf 000110 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfsgnj_vv 001000 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfsgnj_vf 001000 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfsgnjn_vv 001001 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfsgnjn_vf 001001 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfsgnjx_vv 001010 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfsgnjx_vf 001010 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vmfeq_vv 011000 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vmfeq_vf 011000 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vmfne_vv 011100 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vmfne_vf 011100 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vmflt_vv 011011 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vmflt_vf 011011 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vmfle_vv 011001 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vmfle_vf 011001 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vmfgt_vf 011101 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vmfge_vf 011111 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vmford_vv 011010 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vmford_vf 011010 . ..... ..... 101 ..... 1010111 @r_vm
|
||||||
|
vfclass_v 100011 . ..... 10000 001 ..... 1010111 @r2_vm
|
||||||
|
vfmerge_vfm 010111 0 ..... ..... 101 ..... 1010111 @r_vm_0
|
||||||
|
vfmv_v_f 010111 1 00000 ..... 101 ..... 1010111 @r2
|
||||||
|
vfcvt_xu_f_v 100010 . ..... 00000 001 ..... 1010111 @r2_vm
|
||||||
|
vfcvt_x_f_v 100010 . ..... 00001 001 ..... 1010111 @r2_vm
|
||||||
|
vfcvt_f_xu_v 100010 . ..... 00010 001 ..... 1010111 @r2_vm
|
||||||
|
vfcvt_f_x_v 100010 . ..... 00011 001 ..... 1010111 @r2_vm
|
||||||
|
vfwcvt_xu_f_v 100010 . ..... 01000 001 ..... 1010111 @r2_vm
|
||||||
|
vfwcvt_x_f_v 100010 . ..... 01001 001 ..... 1010111 @r2_vm
|
||||||
|
vfwcvt_f_xu_v 100010 . ..... 01010 001 ..... 1010111 @r2_vm
|
||||||
|
vfwcvt_f_x_v 100010 . ..... 01011 001 ..... 1010111 @r2_vm
|
||||||
|
vfwcvt_f_f_v 100010 . ..... 01100 001 ..... 1010111 @r2_vm
|
||||||
|
vfncvt_xu_f_v 100010 . ..... 10000 001 ..... 1010111 @r2_vm
|
||||||
|
vfncvt_x_f_v 100010 . ..... 10001 001 ..... 1010111 @r2_vm
|
||||||
|
vfncvt_f_xu_v 100010 . ..... 10010 001 ..... 1010111 @r2_vm
|
||||||
|
vfncvt_f_x_v 100010 . ..... 10011 001 ..... 1010111 @r2_vm
|
||||||
|
vfncvt_f_f_v 100010 . ..... 10100 001 ..... 1010111 @r2_vm
|
||||||
|
vredsum_vs 000000 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vredand_vs 000001 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vredor_vs 000010 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vredxor_vs 000011 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vredminu_vs 000100 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vredmin_vs 000101 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vredmaxu_vs 000110 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vredmax_vs 000111 . ..... ..... 010 ..... 1010111 @r_vm
|
||||||
|
vwredsumu_vs 110000 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vwredsum_vs 110001 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
# Vector ordered and unordered reduction sum
|
||||||
|
vfredsum_vs 0000-1 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfredmin_vs 000101 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vfredmax_vs 000111 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
# Vector widening ordered and unordered float reduction sum
|
||||||
|
vfwredsum_vs 1100-1 . ..... ..... 001 ..... 1010111 @r_vm
|
||||||
|
vmand_mm 011001 - ..... ..... 010 ..... 1010111 @r
|
||||||
|
vmnand_mm 011101 - ..... ..... 010 ..... 1010111 @r
|
||||||
|
vmandnot_mm 011000 - ..... ..... 010 ..... 1010111 @r
|
||||||
|
vmxor_mm 011011 - ..... ..... 010 ..... 1010111 @r
|
||||||
|
vmor_mm 011010 - ..... ..... 010 ..... 1010111 @r
|
||||||
|
vmnor_mm 011110 - ..... ..... 010 ..... 1010111 @r
|
||||||
|
vmornot_mm 011100 - ..... ..... 010 ..... 1010111 @r
|
||||||
|
vmxnor_mm 011111 - ..... ..... 010 ..... 1010111 @r
|
||||||
|
vmpopc_m 010100 . ..... ----- 010 ..... 1010111 @r2_vm
|
||||||
|
vmfirst_m 010101 . ..... ----- 010 ..... 1010111 @r2_vm
|
||||||
|
vmsbf_m 010110 . ..... 00001 010 ..... 1010111 @r2_vm
|
||||||
|
vmsif_m 010110 . ..... 00011 010 ..... 1010111 @r2_vm
|
||||||
|
vmsof_m 010110 . ..... 00010 010 ..... 1010111 @r2_vm
|
||||||
|
viota_m 010110 . ..... 10000 010 ..... 1010111 @r2_vm
|
||||||
|
vid_v 010110 . 00000 10001 010 ..... 1010111 @r1_vm
|
||||||
|
vext_x_v 001100 1 ..... ..... 010 ..... 1010111 @r
|
||||||
|
vmv_s_x 001101 1 00000 ..... 110 ..... 1010111 @r2
|
||||||
|
vfmv_f_s 001100 1 ..... 00000 001 ..... 1010111 @r2rd
|
||||||
|
vfmv_s_f 001101 1 00000 ..... 101 ..... 1010111 @r2
|
||||||
|
vslideup_vx 001110 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vslideup_vi 001110 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vslide1up_vx 001110 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vslidedown_vx 001111 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vslidedown_vi 001111 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vslide1down_vx 001111 . ..... ..... 110 ..... 1010111 @r_vm
|
||||||
|
vrgather_vv 001100 . ..... ..... 000 ..... 1010111 @r_vm
|
||||||
|
vrgather_vx 001100 . ..... ..... 100 ..... 1010111 @r_vm
|
||||||
|
vrgather_vi 001100 . ..... ..... 011 ..... 1010111 @r_vm
|
||||||
|
vcompress_vm 010111 - ..... ..... 010 ..... 1010111 @r
|
||||||
|
|
||||||
|
vsetvli 0 ........... ..... 111 ..... 1010111 @r2_zimm
|
||||||
|
vsetvl 1000000 ..... ..... 111 ..... 1010111 @r
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -0,0 +1,41 @@
|
||||||
|
/*
|
||||||
|
* QEMU RISC-V CPU -- internal functions and types
|
||||||
|
*
|
||||||
|
* Copyright (c) 2020 T-Head Semiconductor Co., Ltd. All rights reserved.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify it
|
||||||
|
* under the terms and conditions of the GNU General Public License,
|
||||||
|
* version 2 or later, as published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
||||||
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||||
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||||
|
* more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License along with
|
||||||
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef RISCV_CPU_INTERNALS_H
|
||||||
|
#define RISCV_CPU_INTERNALS_H
|
||||||
|
|
||||||
|
#include "hw/registerfields.h"
|
||||||
|
|
||||||
|
/* share data between vector helpers and decode code */
|
||||||
|
FIELD(VDATA, MLEN, 0, 8)
|
||||||
|
FIELD(VDATA, VM, 8, 1)
|
||||||
|
FIELD(VDATA, LMUL, 9, 2)
|
||||||
|
FIELD(VDATA, NF, 11, 4)
|
||||||
|
FIELD(VDATA, WD, 11, 1)
|
||||||
|
|
||||||
|
/* float point classify helpers */
|
||||||
|
target_ulong fclass_h(uint64_t frs1);
|
||||||
|
target_ulong fclass_s(uint64_t frs1);
|
||||||
|
target_ulong fclass_d(uint64_t frs1);
|
||||||
|
|
||||||
|
#define SEW8 0
|
||||||
|
#define SEW16 1
|
||||||
|
#define SEW32 2
|
||||||
|
#define SEW64 3
|
||||||
|
|
||||||
|
#endif
|
|
@ -32,7 +32,7 @@
|
||||||
#include "instmap.h"
|
#include "instmap.h"
|
||||||
|
|
||||||
/* global register indices */
|
/* global register indices */
|
||||||
static TCGv cpu_gpr[32], cpu_pc;
|
static TCGv cpu_gpr[32], cpu_pc, cpu_vl;
|
||||||
static TCGv_i64 cpu_fpr[32]; /* assume F and D extensions */
|
static TCGv_i64 cpu_fpr[32]; /* assume F and D extensions */
|
||||||
static TCGv load_res;
|
static TCGv load_res;
|
||||||
static TCGv load_val;
|
static TCGv load_val;
|
||||||
|
@ -56,6 +56,13 @@ typedef struct DisasContext {
|
||||||
to reset this known value. */
|
to reset this known value. */
|
||||||
int frm;
|
int frm;
|
||||||
bool ext_ifencei;
|
bool ext_ifencei;
|
||||||
|
/* vector extension */
|
||||||
|
bool vill;
|
||||||
|
uint8_t lmul;
|
||||||
|
uint8_t sew;
|
||||||
|
uint16_t vlen;
|
||||||
|
uint16_t mlen;
|
||||||
|
bool vl_eq_vlmax;
|
||||||
} DisasContext;
|
} DisasContext;
|
||||||
|
|
||||||
#ifdef TARGET_RISCV64
|
#ifdef TARGET_RISCV64
|
||||||
|
@ -542,6 +549,11 @@ static void decode_RV32_64C(DisasContext *ctx, uint16_t opcode)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static int ex_plus_1(DisasContext *ctx, int nf)
|
||||||
|
{
|
||||||
|
return nf + 1;
|
||||||
|
}
|
||||||
|
|
||||||
#define EX_SH(amount) \
|
#define EX_SH(amount) \
|
||||||
static int ex_shift_##amount(DisasContext *ctx, int imm) \
|
static int ex_shift_##amount(DisasContext *ctx, int imm) \
|
||||||
{ \
|
{ \
|
||||||
|
@ -712,6 +724,7 @@ static bool gen_shift(DisasContext *ctx, arg_r *a,
|
||||||
#include "insn_trans/trans_rvf.inc.c"
|
#include "insn_trans/trans_rvf.inc.c"
|
||||||
#include "insn_trans/trans_rvd.inc.c"
|
#include "insn_trans/trans_rvd.inc.c"
|
||||||
#include "insn_trans/trans_rvh.inc.c"
|
#include "insn_trans/trans_rvh.inc.c"
|
||||||
|
#include "insn_trans/trans_rvv.inc.c"
|
||||||
#include "insn_trans/trans_privileged.inc.c"
|
#include "insn_trans/trans_privileged.inc.c"
|
||||||
|
|
||||||
/* Include the auto-generated decoder for 16 bit insn */
|
/* Include the auto-generated decoder for 16 bit insn */
|
||||||
|
@ -746,10 +759,11 @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
|
||||||
DisasContext *ctx = container_of(dcbase, DisasContext, base);
|
DisasContext *ctx = container_of(dcbase, DisasContext, base);
|
||||||
CPURISCVState *env = cs->env_ptr;
|
CPURISCVState *env = cs->env_ptr;
|
||||||
RISCVCPU *cpu = RISCV_CPU(cs);
|
RISCVCPU *cpu = RISCV_CPU(cs);
|
||||||
|
uint32_t tb_flags = ctx->base.tb->flags;
|
||||||
|
|
||||||
ctx->pc_succ_insn = ctx->base.pc_first;
|
ctx->pc_succ_insn = ctx->base.pc_first;
|
||||||
ctx->mem_idx = ctx->base.tb->flags & TB_FLAGS_MMU_MASK;
|
ctx->mem_idx = tb_flags & TB_FLAGS_MMU_MASK;
|
||||||
ctx->mstatus_fs = ctx->base.tb->flags & TB_FLAGS_MSTATUS_FS;
|
ctx->mstatus_fs = tb_flags & TB_FLAGS_MSTATUS_FS;
|
||||||
ctx->priv_ver = env->priv_ver;
|
ctx->priv_ver = env->priv_ver;
|
||||||
#if !defined(CONFIG_USER_ONLY)
|
#if !defined(CONFIG_USER_ONLY)
|
||||||
if (riscv_has_ext(env, RVH)) {
|
if (riscv_has_ext(env, RVH)) {
|
||||||
|
@ -773,6 +787,12 @@ static void riscv_tr_init_disas_context(DisasContextBase *dcbase, CPUState *cs)
|
||||||
ctx->misa = env->misa;
|
ctx->misa = env->misa;
|
||||||
ctx->frm = -1; /* unknown rounding mode */
|
ctx->frm = -1; /* unknown rounding mode */
|
||||||
ctx->ext_ifencei = cpu->cfg.ext_ifencei;
|
ctx->ext_ifencei = cpu->cfg.ext_ifencei;
|
||||||
|
ctx->vlen = cpu->cfg.vlen;
|
||||||
|
ctx->vill = FIELD_EX32(tb_flags, TB_FLAGS, VILL);
|
||||||
|
ctx->sew = FIELD_EX32(tb_flags, TB_FLAGS, SEW);
|
||||||
|
ctx->lmul = FIELD_EX32(tb_flags, TB_FLAGS, LMUL);
|
||||||
|
ctx->mlen = 1 << (ctx->sew + 3 - ctx->lmul);
|
||||||
|
ctx->vl_eq_vlmax = FIELD_EX32(tb_flags, TB_FLAGS, VL_EQ_VLMAX);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void riscv_tr_tb_start(DisasContextBase *db, CPUState *cpu)
|
static void riscv_tr_tb_start(DisasContextBase *db, CPUState *cpu)
|
||||||
|
@ -887,6 +907,7 @@ void riscv_translate_init(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
cpu_pc = tcg_global_mem_new(cpu_env, offsetof(CPURISCVState, pc), "pc");
|
cpu_pc = tcg_global_mem_new(cpu_env, offsetof(CPURISCVState, pc), "pc");
|
||||||
|
cpu_vl = tcg_global_mem_new(cpu_env, offsetof(CPURISCVState, vl), "vl");
|
||||||
load_res = tcg_global_mem_new(cpu_env, offsetof(CPURISCVState, load_res),
|
load_res = tcg_global_mem_new(cpu_env, offsetof(CPURISCVState, load_res),
|
||||||
"load_res");
|
"load_res");
|
||||||
load_val = tcg_global_mem_new(cpu_env, offsetof(CPURISCVState, load_val),
|
load_val = tcg_global_mem_new(cpu_env, offsetof(CPURISCVState, load_val),
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
Loading…
Reference in New Issue