From 0968caa249671ca3dbd3d15a33d2631d258efa6f Mon Sep 17 00:00:00 2001 From: LIU Zhiwei Date: Fri, 26 Feb 2021 02:12:56 -0500 Subject: [PATCH] target/riscv: add vector extension field in CPURISCVState The 32 vector registers will be viewed as a continuous memory block. It avoids the convension between element index and (regno, offset). Thus elements can be directly accessed by offset from the first vector base address. Backports ad9e5aa2ae8032f19a8293b6b8f4661c06167bf0 from qemu --- qemu/target/riscv/cpu.h | 12 ++++++++++++ qemu/target/riscv/translate.c | 1 + qemu/tcg/tcg.h | 1 + 3 files changed, 14 insertions(+) diff --git a/qemu/target/riscv/cpu.h b/qemu/target/riscv/cpu.h index 6bdfb542..f610ff0b 100644 --- a/qemu/target/riscv/cpu.h +++ b/qemu/target/riscv/cpu.h @@ -64,6 +64,7 @@ #define RVA RV('A') #define RVF RV('F') #define RVD RV('D') +#define RVV RV('V') #define RVC RV('C') #define RVS RV('S') #define RVU RV('U') @@ -93,9 +94,20 @@ typedef struct CPURISCVState CPURISCVState; #include "pmp.h" +#define RV_VLEN_MAX 512 + struct CPURISCVState { target_ulong gpr[32]; uint64_t fpr[32]; /* assume both F and D extensions */ + + /* vector coprocessor state. */ + uint64_t QEMU_ALIGNED(16, vreg[32 * RV_VLEN_MAX / 64]); + target_ulong vxrm; + target_ulong vxsat; + target_ulong vl; + target_ulong vstart; + target_ulong vtype; + target_ulong pc; target_ulong load_res; target_ulong load_val; diff --git a/qemu/target/riscv/translate.c b/qemu/target/riscv/translate.c index b7a20cb3..83d19582 100644 --- a/qemu/target/riscv/translate.c +++ b/qemu/target/riscv/translate.c @@ -926,6 +926,7 @@ void riscv_translate_init(struct uc_struct *uc) } tcg_ctx->cpu_pc_risc = tcg_global_mem_new(tcg_ctx, tcg_ctx->cpu_env, offsetof(CPURISCVState, pc), "pc"); + tcg_ctx->cpu_vl_risc = tcg_global_mem_new(tcg_ctx, tcg_ctx->cpu_env, offsetof(CPURISCVState, vl), "vl"); tcg_ctx->load_res_risc = tcg_global_mem_new(tcg_ctx, tcg_ctx->cpu_env, offsetof(CPURISCVState, load_res), "load_res"); tcg_ctx->load_val_risc = tcg_global_mem_new(tcg_ctx, tcg_ctx->cpu_env, offsetof(CPURISCVState, load_val), diff --git a/qemu/tcg/tcg.h b/qemu/tcg/tcg.h index f321465c..978f7c88 100644 --- a/qemu/tcg/tcg.h +++ b/qemu/tcg/tcg.h @@ -847,6 +847,7 @@ struct TCGContext { TCGv_i64 cpu_fpr_risc[32]; /* assume F and D extensions */ TCGv load_res_risc; TCGv load_val_risc; + TCGv cpu_vl_risc; /* qemu/target-sparc/translate.c */ /* global register indexes */