@@ -146,7 +146,7 @@ reg_t mcontrol_t::tdata1_read(const processor_t * const proc) const noexcept {
146146 auto xlen = proc->get_xlen ();
147147 v = set_field (v, MCONTROL_TYPE (xlen), CSR_TDATA1_TYPE_MCONTROL);
148148 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 );
150150 v = set_field (v, CSR_MCONTROL_HIT, hit);
151151 v = set_field (v, MCONTROL_SELECT, select);
152152 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
171171 timing = legalize_timing (val, MCONTROL_TIMING, MCONTROL_SELECT, MCONTROL_EXECUTE, MCONTROL_LOAD);
172172 action = legalize_action (val, MCONTROL_ACTION, CSR_MCONTROL_DMODE (xlen));
173173 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 );
175175 m = get_field (val, MCONTROL_M);
176176 s = proc->extension_enabled_const (' S' ) ? get_field (val, CSR_MCONTROL_S) : 0 ;
177177 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
244244 return std::nullopt ;
245245}
246246
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
248248{
249249 switch (val) {
250+ case MATCH_NAPOT: if (maskmax == 0 ) return MATCH_EQUAL;
250251 case MATCH_EQUAL:
251- case MATCH_NAPOT:
252252 case MATCH_GE:
253253 case MATCH_LT:
254254 case MATCH_MASK_LOW:
@@ -294,13 +294,14 @@ void mcontrol6_t::tdata1_write(processor_t * const proc, const reg_t val, const
294294 auto xlen = proc->get_const_xlen ();
295295 assert (get_field (val, CSR_MCONTROL6_TYPE (xlen)) == CSR_TDATA1_TYPE_MCONTROL6);
296296 dmode = get_field (val, CSR_MCONTROL6_DMODE (xlen));
297+ const reg_t maskmax6 = xlen - 1 ;
297298 vs = get_field (val, CSR_MCONTROL6_VS);
298299 vu = get_field (val, CSR_MCONTROL6_VU);
299300 hit = hit_t (2 * get_field (val, CSR_MCONTROL6_HIT1) + get_field (val, CSR_MCONTROL6_HIT0)); // 2-bit field {hit1,hit0}
300301 select = get_field (val, CSR_MCONTROL6_SELECT);
301302 action = legalize_action (val, CSR_MCONTROL6_ACTION, CSR_MCONTROL6_DMODE (xlen));
302303 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 );
304305 m = get_field (val, CSR_MCONTROL6_M);
305306 s = proc->extension_enabled_const (' S' ) ? get_field (val, CSR_MCONTROL6_S) : 0 ;
306307 u = proc->extension_enabled_const (' U' ) ? get_field (val, CSR_MCONTROL6_U) : 0 ;
0 commit comments