@@ -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 ());
@@ -2178,6 +2190,13 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
21782190 }
21792191
21802192 if (isa->extension_enabled (EXT_ZIMOP)) {
2193+ #define DISASM_MOP_R (name, rs1, rd ) \
2194+ add_insn (new disasm_insn_t (#name, match_##name | (rs1 << 15 ) | (rd << 7 ), \
2195+ 0xFFFFFFFF , {&xrd, &xrs1}));
2196+
2197+ #define DISASM_MOP_RR (name, rs1, rd, rs2 ) \
2198+ add_insn (new disasm_insn_t (#name, match_##name | (rs1 << 15 ) | (rd << 7 ) | (rs2 << 20 ), \
2199+ 0xFFFFFFFF , {&xrd, &xrs1, &xrs2}));
21812200 DEFINE_R1TYPE (mop_r_0);
21822201 DEFINE_R1TYPE (mop_r_1);
21832202 DEFINE_R1TYPE (mop_r_2);
@@ -2206,7 +2225,15 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
22062225 DEFINE_R1TYPE (mop_r_25);
22072226 DEFINE_R1TYPE (mop_r_26);
22082227 DEFINE_R1TYPE (mop_r_27);
2209- DEFINE_R1TYPE (mop_r_28);
2228+ if (!isa->extension_enabled (EXT_ZICFISS)) {
2229+ DEFINE_R1TYPE (mop_r_28);
2230+ } else {
2231+ // Add code points of mop_r_28 not used by Zicfiss
2232+ for (unsigned rd_val = 0 ; rd_val <= 31 ; ++rd_val)
2233+ for (unsigned rs1_val = 0 ; rs1_val <= 31 ; ++rs1_val)
2234+ if ((rd_val != 0 && rs1_val !=0 ) || (rd_val == 0 && !(rs1_val == 1 || rs1_val == 5 )))
2235+ DISASM_MOP_R (mop_r_28, rs1_val, rd_val);
2236+ }
22102237 DEFINE_R1TYPE (mop_r_29);
22112238 DEFINE_R1TYPE (mop_r_30);
22122239 DEFINE_R1TYPE (mop_r_31);
@@ -2218,12 +2245,24 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
22182245 DEFINE_RTYPE (mop_rr_5);
22192246 DEFINE_RTYPE (mop_rr_6);
22202247 DEFINE_RTYPE (mop_rr_7);
2248+ if (!isa->extension_enabled (EXT_ZICFISS)) {
2249+ DEFINE_RTYPE (mop_rr_7);
2250+ } else {
2251+ // Add code points of mop_rr_7 not used by Zicfiss
2252+ for (unsigned rd_val = 0 ; rd_val <= 31 ; ++rd_val)
2253+ for (unsigned rs1_val = 0 ; rs1_val <= 31 ; ++rs1_val)
2254+ for (unsigned rs2_val = 0 ; rs2_val <= 31 ; ++rs2_val)
2255+ if ((rs2_val != 1 && rs2_val != 5 ) || rd_val != 0 || rs1_val != 0 )
2256+ DISASM_MOP_RR (mop_rr_7, rs1_val, rd_val, rs2_val);
2257+ }
22212258 }
22222259
22232260 if (isa->extension_enabled (EXT_ZCMOP)) {
2224- DISASM_INSN (" c.mop.1" , c_mop_1, 0 , {});
2261+ if (!isa->extension_enabled (EXT_ZICFISS))
2262+ DISASM_INSN (" c.mop.1" , c_mop_1, 0 , {});
22252263 DISASM_INSN (" c.mop.3" , c_mop_3, 0 , {});
2226- DISASM_INSN (" c.mop.5" , c_mop_5, 0 , {});
2264+ if (!isa->extension_enabled (EXT_ZICFISS))
2265+ DISASM_INSN (" c.mop.5" , c_mop_5, 0 , {});
22272266 DISASM_INSN (" c.mop.7" , c_mop_7, 0 , {});
22282267 DISASM_INSN (" c.mop.9" , c_mop_9, 0 , {});
22292268 DISASM_INSN (" c.mop.11" , c_mop_11, 0 , {});
@@ -2386,6 +2425,23 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
23862425 DEFINE_XSTORE_BASE (sw_rl);
23872426 DEFINE_XSTORE_BASE (sd_rl);
23882427 }
2428+
2429+ if (isa->extension_enabled (EXT_ZICFISS)) {
2430+ DISASM_INSN (" sspush" , sspush_x1, 0 , {&xrs2});
2431+ DISASM_INSN (" sspush" , sspush_x5, 0 , {&xrs2});
2432+ DISASM_INSN (" sspopchk" , sspopchk_x1, 0 , {&xrs1});
2433+ DISASM_INSN (" sspopchk" , sspopchk_x5, 0 , {&xrs1});
2434+ DISASM_INSN (" ssrdp" , ssrdp, 0 , {&xrd});
2435+ DEFINE_XAMO (ssamoswap_w);
2436+
2437+ if (isa->get_max_xlen () == 64 )
2438+ DEFINE_XAMO (ssamoswap_d)
2439+
2440+ if (isa->extension_enabled (EXT_ZCA)) {
2441+ DISASM_INSN (" c.sspush" , c_sspush_x1, 0 , {&rvc_ra});
2442+ DISASM_INSN (" c.sspopchk" , c_sspopchk_x5, 0 , {&rvc_t0});
2443+ }
2444+ }
23892445}
23902446
23912447disassembler_t ::disassembler_t (const isa_parser_t *isa)
0 commit comments