|
@@ -982,6 +982,8 @@ typedef enum {
|
|
rv_op_ssrdp = 951,
|
|
rv_op_ssrdp = 951,
|
|
rv_op_ssamoswap_w = 952,
|
|
rv_op_ssamoswap_w = 952,
|
|
rv_op_ssamoswap_d = 953,
|
|
rv_op_ssamoswap_d = 953,
|
|
|
|
+ rv_op_c_sspush = 954,
|
|
|
|
+ rv_op_c_sspopchk = 955,
|
|
} rv_op;
|
|
} rv_op;
|
|
|
|
|
|
/* register names */
|
|
/* register names */
|
|
@@ -2248,6 +2250,10 @@ const rv_opcode_data rvi_opcode_data[] = {
|
|
{ "ssrdp", rv_codec_r, rv_fmt_rd, NULL, 0, 0, 0 },
|
|
{ "ssrdp", rv_codec_r, rv_fmt_rd, NULL, 0, 0, 0 },
|
|
{ "ssamoswap.w", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
|
|
{ "ssamoswap.w", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
|
|
{ "ssamoswap.d", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
|
|
{ "ssamoswap.d", rv_codec_r_a, rv_fmt_aqrl_rd_rs2_rs1, NULL, 0, 0, 0 },
|
|
|
|
+ { "c.sspush", rv_codec_cmop_ss, rv_fmt_rs2, NULL, rv_op_sspush,
|
|
|
|
+ rv_op_sspush, 0 },
|
|
|
|
+ { "c.sspopchk", rv_codec_cmop_ss, rv_fmt_rs1, NULL, rv_op_sspopchk,
|
|
|
|
+ rv_op_sspopchk, 0 },
|
|
};
|
|
};
|
|
|
|
|
|
/* CSR names */
|
|
/* CSR names */
|
|
@@ -2608,7 +2614,13 @@ static void decode_inst_opcode(rv_decode *dec, rv_isa isa)
|
|
if (dec->cfg->ext_zcmop) {
|
|
if (dec->cfg->ext_zcmop) {
|
|
if ((((inst >> 2) & 0b111111) == 0b100000) &&
|
|
if ((((inst >> 2) & 0b111111) == 0b100000) &&
|
|
(((inst >> 11) & 0b11) == 0b0)) {
|
|
(((inst >> 11) & 0b11) == 0b0)) {
|
|
- op = rv_c_mop_1 + ((inst >> 8) & 0b111);
|
|
|
|
|
|
+ unsigned int cmop_code = 0;
|
|
|
|
+ cmop_code = ((inst >> 8) & 0b111);
|
|
|
|
+ op = rv_c_mop_1 + cmop_code;
|
|
|
|
+ if (dec->cfg->ext_zicfiss) {
|
|
|
|
+ op = (cmop_code == 0) ? rv_op_c_sspush : op;
|
|
|
|
+ op = (cmop_code == 2) ? rv_op_c_sspopchk : op;
|
|
|
|
+ }
|
|
break;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
@@ -4929,6 +4941,11 @@ static void decode_inst_operands(rv_decode *dec, rv_isa isa)
|
|
case rv_codec_lp:
|
|
case rv_codec_lp:
|
|
dec->imm = operand_lpl(inst);
|
|
dec->imm = operand_lpl(inst);
|
|
break;
|
|
break;
|
|
|
|
+ case rv_codec_cmop_ss:
|
|
|
|
+ dec->rd = rv_ireg_zero;
|
|
|
|
+ dec->rs1 = dec->rs2 = operand_crs1(inst);
|
|
|
|
+ dec->imm = 0;
|
|
|
|
+ break;
|
|
};
|
|
};
|
|
}
|
|
}
|
|
|
|
|