@@ -146,7 +146,7 @@ reg_t mcontrol_t::tdata1_read(const processor_t * const proc) const noexcept {
146
146
auto xlen = proc->get_xlen ();
147
147
v = set_field (v, MCONTROL_TYPE (xlen), CSR_TDATA1_TYPE_MCONTROL);
148
148
v = set_field (v, CSR_MCONTROL_DMODE (xlen), dmode);
149
- v = set_field (v, MCONTROL_MASKMAX (xlen), 0 );
149
+ v = set_field (v, MCONTROL_MASKMAX (xlen), maskmax );
150
150
v = set_field (v, CSR_MCONTROL_HIT, hit);
151
151
v = set_field (v, MCONTROL_SELECT, select);
152
152
v = set_field (v, MCONTROL_TIMING, timing);
@@ -171,7 +171,7 @@ void mcontrol_t::tdata1_write(processor_t * const proc, const reg_t val, const b
171
171
timing = legalize_timing (val, MCONTROL_TIMING, MCONTROL_SELECT, MCONTROL_EXECUTE, MCONTROL_LOAD);
172
172
action = legalize_action (val, MCONTROL_ACTION, CSR_MCONTROL_DMODE (xlen));
173
173
chain = allow_chain ? get_field (val, MCONTROL_CHAIN) : 0 ;
174
- match = legalize_match (get_field (val, MCONTROL_MATCH));
174
+ match = legalize_match (get_field (val, MCONTROL_MATCH), maskmax );
175
175
m = get_field (val, MCONTROL_M);
176
176
s = proc->extension_enabled_const (' S' ) ? get_field (val, CSR_MCONTROL_S) : 0 ;
177
177
u = proc->extension_enabled_const (' U' ) ? get_field (val, CSR_MCONTROL_U) : 0 ;
@@ -244,11 +244,11 @@ std::optional<match_result_t> mcontrol_common_t::detect_memory_access_match(proc
244
244
return std::nullopt;
245
245
}
246
246
247
- mcontrol_common_t ::match_t mcontrol_common_t::legalize_match (reg_t val) noexcept
247
+ mcontrol_common_t ::match_t mcontrol_common_t::legalize_match (reg_t val, reg_t maskmax ) noexcept
248
248
{
249
249
switch (val) {
250
+ case MATCH_NAPOT: if (maskmax == 0 ) return MATCH_EQUAL;
250
251
case MATCH_EQUAL:
251
- case MATCH_NAPOT:
252
252
case MATCH_GE:
253
253
case MATCH_LT:
254
254
case MATCH_MASK_LOW:
@@ -294,13 +294,14 @@ void mcontrol6_t::tdata1_write(processor_t * const proc, const reg_t val, const
294
294
auto xlen = proc->get_const_xlen ();
295
295
assert (get_field (val, CSR_MCONTROL6_TYPE (xlen)) == CSR_TDATA1_TYPE_MCONTROL6);
296
296
dmode = get_field (val, CSR_MCONTROL6_DMODE (xlen));
297
+ const reg_t maskmax6 = xlen - 1 ;
297
298
vs = get_field (val, CSR_MCONTROL6_VS);
298
299
vu = get_field (val, CSR_MCONTROL6_VU);
299
300
hit = hit_t (2 * get_field (val, CSR_MCONTROL6_HIT1) + get_field (val, CSR_MCONTROL6_HIT0)); // 2-bit field {hit1,hit0}
300
301
select = get_field (val, CSR_MCONTROL6_SELECT);
301
302
action = legalize_action (val, CSR_MCONTROL6_ACTION, CSR_MCONTROL6_DMODE (xlen));
302
303
chain = allow_chain ? get_field (val, CSR_MCONTROL6_CHAIN) : 0 ;
303
- match = legalize_match (get_field (val, CSR_MCONTROL6_MATCH));
304
+ match = legalize_match (get_field (val, CSR_MCONTROL6_MATCH), maskmax6 );
304
305
m = get_field (val, CSR_MCONTROL6_M);
305
306
s = proc->extension_enabled_const (' S' ) ? get_field (val, CSR_MCONTROL6_S) : 0 ;
306
307
u = proc->extension_enabled_const (' U' ) ? get_field (val, CSR_MCONTROL6_U) : 0 ;
0 commit comments