@@ -99,7 +99,7 @@ template <typename ARCH> class vm_impl : public iss::interp::vm_base<ARCH> {
9999 using compile_ret_t = virt_addr_t ;
100100 using compile_func = compile_ret_t (this_class::*)(virt_addr_t &pc, code_word_t instr);
101101
102- inline const char *name (size_t index){return traits::reg_aliases.at (index) ;}
102+ inline const char *name (size_t index){return index< traits::reg_aliases.size ()?traits::reg_aliases[index] : " illegal " ;}
103103
104104
105105 virt_addr_t execute_inst (finish_cond_e cond, virt_addr_t start, uint64_t icount_limit) override ;
@@ -2236,8 +2236,10 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co
22362236 if (imm == 0 || rd >= traits::RFS ) {
22372237 raise (0 , traits::RV_CAUSE_ILLEGAL_INSTRUCTION );
22382238 }
2239- if (rd != 0 ) {
2240- *(X+rd) = (uint32_t )((int32_t )sext<18 >(imm));
2239+ else {
2240+ if (rd != 0 ) {
2241+ *(X+rd) = (uint32_t )((int32_t )sext<18 >(imm));
2242+ }
22412243 }
22422244 }
22432245 break ;
@@ -2568,7 +2570,7 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co
25682570 *NEXT_PC = *PC + 2 ;
25692571 // execute instruction
25702572 {
2571- if (rd >= traits::RFS ) {
2573+ if (rd >= traits::RFS || rs2 >= traits:: RFS ) {
25722574 raise (0 , traits::RV_CAUSE_ILLEGAL_INSTRUCTION );
25732575 }
25742576 else {
@@ -2637,7 +2639,7 @@ typename vm_base<ARCH>::virt_addr_t vm_impl<ARCH>::execute_inst(finish_cond_e co
26372639 *NEXT_PC = *PC + 2 ;
26382640 // execute instruction
26392641 {
2640- if (rd >= traits::RFS ) {
2642+ if (rd >= traits::RFS || rs2 >= traits:: RFS ) {
26412643 raise (0 , traits::RV_CAUSE_ILLEGAL_INSTRUCTION );
26422644 }
26432645 else {
0 commit comments