aboutsummaryrefslogtreecommitdiff
path: root/riscv/processor.h
diff options
context:
space:
mode:
authorDave.Wen <dave.wen@sifive.com>2019-03-27 01:48:29 -0700
committerDave.Wen <dave.wen@sifive.com>2019-03-27 02:16:05 -0700
commit05aad3b74eda365fa4be9c026f9d68a7e0f2fe4f (patch)
tree533da8376709d80bdc3fcb851c6e673340e3c4e8 /riscv/processor.h
parent310586edb1493997aecbc92de6131780c1a62f5b (diff)
downloadspike-05aad3b74eda365fa4be9c026f9d68a7e0f2fe4f.zip
spike-05aad3b74eda365fa4be9c026f9d68a7e0f2fe4f.tar.gz
spike-05aad3b74eda365fa4be9c026f9d68a7e0f2fe4f.tar.bz2
reshape the elt
Diffstat (limited to 'riscv/processor.h')
-rw-r--r--riscv/processor.h13
1 files changed, 8 insertions, 5 deletions
diff --git a/riscv/processor.h b/riscv/processor.h
index 10c4bee..1dc6f40 100644
--- a/riscv/processor.h
+++ b/riscv/processor.h
@@ -9,6 +9,7 @@
#include <string>
#include <vector>
#include <map>
+#include <cassert>
#include "debug_rom_defines.h"
class processor_t;
@@ -89,7 +90,7 @@ inline reg_t BITS(reg_t v, int hi, int lo){
struct vectorUnit_t {
void *reg_file;
- char reg_referenced[NVPR];
+ char reg_referenced[NVPR];
int setvl_count;
reg_t reg_mask, vstart, vl, vlmax, vsew;
reg_t vxrm, vxsat, vlmul;
@@ -97,19 +98,21 @@ struct vectorUnit_t {
reg_t setVL(reg_t reqVL, reg_t newType);
+ // vector element for varies SEW
template<class T>
T& elt(reg_t vReg, reg_t n){
// this still needs to be adjusted for SLEN != VLEN
- reg_t elts_per_reg = (VLEN>>3)/sizeof(T);
- vReg += n/elts_per_reg;
- n = n%elts_per_reg;
+ assert(vsew!=0);
+ reg_t elts_per_reg = (VLEN >> 3) / (vsew >> 3);
+ vReg += n / elts_per_reg; // for grouping purpose
+ n = n % elts_per_reg;
reg_referenced[vReg] = 1;
#if 0
if (((vReg & reg_mask) != vReg) || (n >= vlmax)){
throw trap_illegal_instruction(0);
}
#endif
- T *regStart = (T*)((char*)reg_file + vReg * (VLEN/8));
+ T *regStart = (T*)((char*)reg_file + vReg * (VLEN >> 3));
return regStart[n];
}