@ -266,6 +266,18 @@ struct : public arg_t {
}
} rvc_sp ;
struct : public arg_t {
std : : string to_string ( insn_t UNUSED insn ) const {
return xpr_name [ X_RA ] ;
}
} rvc_ra ;
struct : public arg_t {
std : : string to_string ( insn_t UNUSED insn ) const {
return xpr_name [ X_T0 ] ;
}
} rvc_t0 ;
struct : public arg_t {
std : : string to_string ( insn_t insn ) const {
return std : : to_string ( ( int ) insn . rvc_imm ( ) ) ;
@ -2184,6 +2196,13 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
}
if ( isa - > extension_enabled ( EXT_ZIMOP ) ) {
# define DISASM_MOP_R(name, rs1, rd) \
add_insn ( new disasm_insn_t ( # name , match_ # # name | ( rs1 < < 15 ) | ( rd < < 7 ) , \
0xFFFFFFFF , { & xrd , & xrs1 } ) ) ;
# define DISASM_MOP_RR(name, rs1, rd, rs2) \
add_insn ( new disasm_insn_t ( # name , match_ # # name | ( rs1 < < 15 ) | ( rd < < 7 ) | ( rs2 < < 20 ) , \
0xFFFFFFFF , { & xrd , & xrs1 , & xrs2 } ) ) ;
DEFINE_R1TYPE ( mop_r_0 ) ;
DEFINE_R1TYPE ( mop_r_1 ) ;
DEFINE_R1TYPE ( mop_r_2 ) ;
@ -2212,7 +2231,15 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_R1TYPE ( mop_r_25 ) ;
DEFINE_R1TYPE ( mop_r_26 ) ;
DEFINE_R1TYPE ( mop_r_27 ) ;
DEFINE_R1TYPE ( mop_r_28 ) ;
if ( ! isa - > extension_enabled ( EXT_ZICFISS ) ) {
DEFINE_R1TYPE ( mop_r_28 ) ;
} else {
// Add code points of mop_r_28 not used by Zicfiss
for ( unsigned rd_val = 0 ; rd_val < = 31 ; + + rd_val )
for ( unsigned rs1_val = 0 ; rs1_val < = 31 ; + + rs1_val )
if ( ( rd_val ! = 0 & & rs1_val ! = 0 ) | | ( rd_val = = 0 & & ! ( rs1_val = = 1 | | rs1_val = = 5 ) ) )
DISASM_MOP_R ( mop_r_28 , rs1_val , rd_val ) ;
}
DEFINE_R1TYPE ( mop_r_29 ) ;
DEFINE_R1TYPE ( mop_r_30 ) ;
DEFINE_R1TYPE ( mop_r_31 ) ;
@ -2224,12 +2251,24 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_RTYPE ( mop_rr_5 ) ;
DEFINE_RTYPE ( mop_rr_6 ) ;
DEFINE_RTYPE ( mop_rr_7 ) ;
if ( ! isa - > extension_enabled ( EXT_ZICFISS ) ) {
DEFINE_RTYPE ( mop_rr_7 ) ;
} else {
// Add code points of mop_rr_7 not used by Zicfiss
for ( unsigned rd_val = 0 ; rd_val < = 31 ; + + rd_val )
for ( unsigned rs1_val = 0 ; rs1_val < = 31 ; + + rs1_val )
for ( unsigned rs2_val = 0 ; rs2_val < = 31 ; + + rs2_val )
if ( ( rs2_val ! = 1 & & rs2_val ! = 5 ) | | rd_val ! = 0 | | rs1_val ! = 0 )
DISASM_MOP_RR ( mop_rr_7 , rs1_val , rd_val , rs2_val ) ;
}
}
if ( isa - > extension_enabled ( EXT_ZCMOP ) ) {
DISASM_INSN ( " c.mop.1 " , c_mop_1 , 0 , { } ) ;
if ( ! isa - > extension_enabled ( EXT_ZICFISS ) )
DISASM_INSN ( " c.mop.1 " , c_mop_1 , 0 , { } ) ;
DISASM_INSN ( " c.mop.3 " , c_mop_3 , 0 , { } ) ;
DISASM_INSN ( " c.mop.5 " , c_mop_5 , 0 , { } ) ;
if ( ! isa - > extension_enabled ( EXT_ZICFISS ) )
DISASM_INSN ( " c.mop.5 " , c_mop_5 , 0 , { } ) ;
DISASM_INSN ( " c.mop.7 " , c_mop_7 , 0 , { } ) ;
DISASM_INSN ( " c.mop.9 " , c_mop_9 , 0 , { } ) ;
DISASM_INSN ( " c.mop.11 " , c_mop_11 , 0 , { } ) ;
@ -2392,6 +2431,23 @@ void disassembler_t::add_instructions(const isa_parser_t* isa)
DEFINE_XSTORE_BASE ( sw_rl ) ;
DEFINE_XSTORE_BASE ( sd_rl ) ;
}
if ( isa - > extension_enabled ( EXT_ZICFISS ) ) {
DISASM_INSN ( " sspush " , sspush_x1 , 0 , { & xrs2 } ) ;
DISASM_INSN ( " sspush " , sspush_x5 , 0 , { & xrs2 } ) ;
DISASM_INSN ( " sspopchk " , sspopchk_x1 , 0 , { & xrs1 } ) ;
DISASM_INSN ( " sspopchk " , sspopchk_x5 , 0 , { & xrs1 } ) ;
DISASM_INSN ( " ssrdp " , ssrdp , 0 , { & xrd } ) ;
DEFINE_XAMO ( ssamoswap_w ) ;
if ( isa - > get_max_xlen ( ) = = 64 )
DEFINE_XAMO ( ssamoswap_d )
if ( isa - > extension_enabled ( EXT_ZCA ) ) {
DISASM_INSN ( " c.sspush " , c_sspush_x1 , 0 , { & rvc_ra } ) ;
DISASM_INSN ( " c.sspopchk " , c_sspopchk_x5 , 0 , { & rvc_t0 } ) ;
}
}
}
disassembler_t : : disassembler_t ( const isa_parser_t * isa )