@@ -266,6 +266,18 @@ struct : public arg_t {
266266 }
267267} rvc_sp;
268268
269+ struct : public arg_t {
270+ std::string to_string (insn_t UNUSED insn) const {
271+ return xpr_name[X_RA];
272+ }
273+ } rvc_ra;
274+
275+ struct : public arg_t {
276+ std::string to_string (insn_t UNUSED insn) const {
277+ return xpr_name[X_T0];
278+ }
279+ } rvc_t0;
280+
269281struct : public arg_t {
270282 std::string to_string (insn_t insn) const {
271283 return std::to_string ((int )insn.rvc_imm ());
@@ -2184,6 +2196,13 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
21842196 }
21852197
21862198 if (isa->extension_enabled (EXT_ZIMOP)) {
2199+ #define DISASM_MOP_R (name, rs1, rd ) \
2200+ add_insn (new disasm_insn_t (#name, match_##name | (rs1 << 15 ) | (rd << 7 ), \
2201+ 0xFFFFFFFF , {&xrd, &xrs1}));
2202+
2203+ #define DISASM_MOP_RR (name, rs1, rd, rs2 ) \
2204+ add_insn (new disasm_insn_t (#name, match_##name | (rs1 << 15 ) | (rd << 7 ) | (rs2 << 20 ), \
2205+ 0xFFFFFFFF , {&xrd, &xrs1, &xrs2}));
21872206 DEFINE_R1TYPE (mop_r_0);
21882207 DEFINE_R1TYPE (mop_r_1);
21892208 DEFINE_R1TYPE (mop_r_2);
@@ -2212,7 +2231,15 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
22122231 DEFINE_R1TYPE (mop_r_25);
22132232 DEFINE_R1TYPE (mop_r_26);
22142233 DEFINE_R1TYPE (mop_r_27);
2215- DEFINE_R1TYPE (mop_r_28);
2234+ if (!isa->extension_enabled (EXT_ZICFISS)) {
2235+ DEFINE_R1TYPE (mop_r_28);
2236+ } else {
2237+ // Add code points of mop_r_28 not used by Zicfiss
2238+ for (unsigned rd_val = 0 ; rd_val <= 31 ; ++rd_val)
2239+ for (unsigned rs1_val = 0 ; rs1_val <= 31 ; ++rs1_val)
2240+ if ((rd_val != 0 && rs1_val !=0 ) || (rd_val == 0 && !(rs1_val == 1 || rs1_val == 5 )))
2241+ DISASM_MOP_R (mop_r_28, rs1_val, rd_val);
2242+ }
22162243 DEFINE_R1TYPE (mop_r_29);
22172244 DEFINE_R1TYPE (mop_r_30);
22182245 DEFINE_R1TYPE (mop_r_31);
@@ -2224,12 +2251,24 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
22242251 DEFINE_RTYPE (mop_rr_5);
22252252 DEFINE_RTYPE (mop_rr_6);
22262253 DEFINE_RTYPE (mop_rr_7);
2254+ if (!isa->extension_enabled (EXT_ZICFISS)) {
2255+ DEFINE_RTYPE (mop_rr_7);
2256+ } else {
2257+ // Add code points of mop_rr_7 not used by Zicfiss
2258+ for (unsigned rd_val = 0 ; rd_val <= 31 ; ++rd_val)
2259+ for (unsigned rs1_val = 0 ; rs1_val <= 31 ; ++rs1_val)
2260+ for (unsigned rs2_val = 0 ; rs2_val <= 31 ; ++rs2_val)
2261+ if ((rs2_val != 1 && rs2_val != 5 ) || rd_val != 0 || rs1_val != 0 )
2262+ DISASM_MOP_RR (mop_rr_7, rs1_val, rd_val, rs2_val);
2263+ }
22272264 }
22282265
22292266 if (isa->extension_enabled (EXT_ZCMOP)) {
2230- DISASM_INSN (" c.mop.1" , c_mop_1, 0 , {});
2267+ if (!isa->extension_enabled (EXT_ZICFISS))
2268+ DISASM_INSN (" c.mop.1" , c_mop_1, 0 , {});
22312269 DISASM_INSN (" c.mop.3" , c_mop_3, 0 , {});
2232- DISASM_INSN (" c.mop.5" , c_mop_5, 0 , {});
2270+ if (!isa->extension_enabled (EXT_ZICFISS))
2271+ DISASM_INSN (" c.mop.5" , c_mop_5, 0 , {});
22332272 DISASM_INSN (" c.mop.7" , c_mop_7, 0 , {});
22342273 DISASM_INSN (" c.mop.9" , c_mop_9, 0 , {});
22352274 DISASM_INSN (" c.mop.11" , c_mop_11, 0 , {});
@@ -2392,6 +2431,23 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
23922431 DEFINE_XSTORE_BASE (sw_rl);
23932432 DEFINE_XSTORE_BASE (sd_rl);
23942433 }
2434+
2435+ if (isa->extension_enabled (EXT_ZICFISS)) {
2436+ DISASM_INSN (" sspush" , sspush_x1, 0 , {&xrs2});
2437+ DISASM_INSN (" sspush" , sspush_x5, 0 , {&xrs2});
2438+ DISASM_INSN (" sspopchk" , sspopchk_x1, 0 , {&xrs1});
2439+ DISASM_INSN (" sspopchk" , sspopchk_x5, 0 , {&xrs1});
2440+ DISASM_INSN (" ssrdp" , ssrdp, 0 , {&xrd});
2441+ DEFINE_XAMO (ssamoswap_w);
2442+
2443+ if (isa->get_max_xlen () == 64 )
2444+ DEFINE_XAMO (ssamoswap_d)
2445+
2446+ if (isa->extension_enabled (EXT_ZCA)) {
2447+ DISASM_INSN (" c.sspush" , c_sspush_x1, 0 , {&rvc_ra});
2448+ DISASM_INSN (" c.sspopchk" , c_sspopchk_x5, 0 , {&rvc_t0});
2449+ }
2450+ }
23952451}
23962452
23972453disassembler_t ::disassembler_t (const isa_parser_t *isa)
0 commit comments