Skip to content

Commit 7dce838

Browse files
authored
Merge pull request #1729 from YenHaoChen/pr-require-vector
Fix: Vector CSRs exist without any vector extension since a484f6e
2 parents 83a2035 + 707b1f2 commit 7dce838

File tree

4 files changed

+10
-14
lines changed

4 files changed

+10
-14
lines changed

riscv/csrs.cc

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -663,11 +663,6 @@ bool sstatus_csr_t::enabled(const reg_t which) {
663663
if (!state->v || (virt_sstatus->read() & which) != 0)
664664
return true;
665665
}
666-
667-
// If the field doesn't exist, it is always enabled. See #823.
668-
if (!orig_sstatus->field_exists(which))
669-
return true;
670-
671666
return false;
672667
}
673668

@@ -1490,7 +1485,7 @@ vector_csr_t::vector_csr_t(processor_t* const proc, const reg_t addr, const reg_
14901485
}
14911486

14921487
void vector_csr_t::verify_permissions(insn_t insn, bool write) const {
1493-
require_vector_vs;
1488+
require(proc->any_vector_extensions() && STATE.sstatus->enabled(SSTATUS_VS));
14941489
basic_csr_t::verify_permissions(insn, write);
14951490
}
14961491

@@ -1511,7 +1506,7 @@ vxsat_csr_t::vxsat_csr_t(processor_t* const proc, const reg_t addr):
15111506
}
15121507

15131508
void vxsat_csr_t::verify_permissions(insn_t insn, bool write) const {
1514-
require_vector_vs;
1509+
require(proc->any_vector_extensions() && STATE.sstatus->enabled(SSTATUS_VS));
15151510
masked_csr_t::verify_permissions(insn, write);
15161511
}
15171512

riscv/decode_macros.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -167,7 +167,7 @@ static inline bool is_aligned(const unsigned val, const unsigned pos)
167167
#define require_fs require(STATE.sstatus->enabled(SSTATUS_FS))
168168
#define require_fp STATE.fflags->verify_permissions(insn, false)
169169
#define require_accelerator require(STATE.sstatus->enabled(SSTATUS_XS))
170-
#define require_vector_vs require(STATE.sstatus->enabled(SSTATUS_VS))
170+
#define require_vector_vs require(p->any_vector_extensions() && STATE.sstatus->enabled(SSTATUS_VS))
171171
#define require_vector(alu) \
172172
do { \
173173
require_vector_vs; \

riscv/processor.cc

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -577,7 +577,8 @@ void processor_t::reset()
577577
state.reset(this, isa->get_max_isa());
578578
state.dcsr->halt = halt_on_reset;
579579
halt_on_reset = false;
580-
VU.reset();
580+
if (any_vector_extensions())
581+
VU.reset();
581582
in_wfi = false;
582583

583584
if (n_pmp > 0) {

riscv/v_ext_macros.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1202,10 +1202,10 @@ reg_t index[P.VU.vlmax]; \
12021202

12031203
#define VI_LD(stride, offset, elt_width, is_mask_ldst) \
12041204
const reg_t nf = insn.v_nf() + 1; \
1205+
VI_CHECK_LOAD(elt_width, is_mask_ldst); \
12051206
const reg_t vl = is_mask_ldst ? ((P.VU.vl->read() + 7) / 8) : P.VU.vl->read(); \
12061207
const reg_t baseAddr = RS1; \
12071208
const reg_t vd = insn.rd(); \
1208-
VI_CHECK_LOAD(elt_width, is_mask_ldst); \
12091209
for (reg_t i = 0; i < vl; ++i) { \
12101210
VI_ELEMENT_SKIP; \
12111211
VI_STRIP(i); \
@@ -1220,12 +1220,12 @@ reg_t index[P.VU.vlmax]; \
12201220

12211221
#define VI_LD_INDEX(elt_width, is_seg) \
12221222
const reg_t nf = insn.v_nf() + 1; \
1223+
VI_CHECK_LD_INDEX(elt_width); \
12231224
const reg_t vl = P.VU.vl->read(); \
12241225
const reg_t baseAddr = RS1; \
12251226
const reg_t vd = insn.rd(); \
12261227
if (!is_seg) \
12271228
require(nf == 1); \
1228-
VI_CHECK_LD_INDEX(elt_width); \
12291229
VI_DUPLICATE_VREG(insn.rs2(), elt_width); \
12301230
for (reg_t i = 0; i < vl; ++i) { \
12311231
VI_ELEMENT_SKIP; \
@@ -1256,10 +1256,10 @@ reg_t index[P.VU.vlmax]; \
12561256

12571257
#define VI_ST(stride, offset, elt_width, is_mask_ldst) \
12581258
const reg_t nf = insn.v_nf() + 1; \
1259+
VI_CHECK_STORE(elt_width, is_mask_ldst); \
12591260
const reg_t vl = is_mask_ldst ? ((P.VU.vl->read() + 7) / 8) : P.VU.vl->read(); \
12601261
const reg_t baseAddr = RS1; \
12611262
const reg_t vs3 = insn.rd(); \
1262-
VI_CHECK_STORE(elt_width, is_mask_ldst); \
12631263
for (reg_t i = 0; i < vl; ++i) { \
12641264
VI_STRIP(i) \
12651265
VI_ELEMENT_SKIP; \
@@ -1274,12 +1274,12 @@ reg_t index[P.VU.vlmax]; \
12741274

12751275
#define VI_ST_INDEX(elt_width, is_seg) \
12761276
const reg_t nf = insn.v_nf() + 1; \
1277+
VI_CHECK_ST_INDEX(elt_width); \
12771278
const reg_t vl = P.VU.vl->read(); \
12781279
const reg_t baseAddr = RS1; \
12791280
const reg_t vs3 = insn.rd(); \
12801281
if (!is_seg) \
12811282
require(nf == 1); \
1282-
VI_CHECK_ST_INDEX(elt_width); \
12831283
VI_DUPLICATE_VREG(insn.rs2(), elt_width); \
12841284
for (reg_t i = 0; i < vl; ++i) { \
12851285
VI_STRIP(i) \
@@ -1310,10 +1310,10 @@ reg_t index[P.VU.vlmax]; \
13101310

13111311
#define VI_LDST_FF(elt_width) \
13121312
const reg_t nf = insn.v_nf() + 1; \
1313+
VI_CHECK_LOAD(elt_width, false); \
13131314
const reg_t vl = p->VU.vl->read(); \
13141315
const reg_t baseAddr = RS1; \
13151316
const reg_t rd_num = insn.rd(); \
1316-
VI_CHECK_LOAD(elt_width, false); \
13171317
bool early_stop = false; \
13181318
for (reg_t i = p->VU.vstart->read(); i < vl; ++i) { \
13191319
VI_STRIP(i); \

0 commit comments

Comments
 (0)