1431 lines
61 KiB
C
1431 lines
61 KiB
C
/* This file is autogenerated by scripts/decodetree.py. */
|
|
|
|
typedef struct {
|
|
int aq;
|
|
int rd;
|
|
int rl;
|
|
int rs1;
|
|
int rs2;
|
|
} arg_atomic;
|
|
|
|
typedef struct {
|
|
int imm;
|
|
int rs1;
|
|
int rs2;
|
|
} arg_b;
|
|
|
|
typedef struct {
|
|
int rd;
|
|
int rm;
|
|
int rs1;
|
|
int rs2;
|
|
int rs3;
|
|
} arg_decode_insn3210;
|
|
|
|
typedef struct {
|
|
int rd;
|
|
int rm;
|
|
int rs1;
|
|
int rs2;
|
|
} arg_decode_insn3211;
|
|
|
|
typedef struct {
|
|
int rd;
|
|
int rm;
|
|
int rs1;
|
|
} arg_decode_insn3212;
|
|
|
|
typedef struct {
|
|
int rd;
|
|
int rs1;
|
|
} arg_decode_insn3213;
|
|
|
|
typedef struct {
|
|
int rs1;
|
|
int rs2;
|
|
} arg_decode_insn3214;
|
|
|
|
typedef struct {
|
|
int rs1;
|
|
} arg_decode_insn3215;
|
|
|
|
typedef struct {
|
|
int pred;
|
|
int succ;
|
|
} arg_decode_insn3216;
|
|
|
|
typedef struct {
|
|
int csr;
|
|
int rd;
|
|
int rs1;
|
|
} arg_decode_insn329;
|
|
|
|
typedef struct {
|
|
#ifdef _MSC_VER
|
|
int dummy; // MSVC does not allow empty struct
|
|
#endif
|
|
} arg_empty;
|
|
|
|
typedef struct {
|
|
int imm;
|
|
int rd;
|
|
int rs1;
|
|
} arg_i;
|
|
|
|
typedef struct {
|
|
int imm;
|
|
int rd;
|
|
} arg_j;
|
|
|
|
typedef struct {
|
|
int rd;
|
|
int rs1;
|
|
int rs2;
|
|
} arg_r;
|
|
|
|
typedef struct {
|
|
int imm;
|
|
int rs1;
|
|
int rs2;
|
|
} arg_s;
|
|
|
|
typedef struct {
|
|
int rd;
|
|
int rs1;
|
|
int shamt;
|
|
} arg_shift;
|
|
|
|
typedef struct {
|
|
int imm;
|
|
int rd;
|
|
} arg_u;
|
|
|
|
typedef arg_empty arg_ecall;
|
|
static bool trans_ecall(DisasContext *ctx, arg_ecall *a);
|
|
typedef arg_empty arg_ebreak;
|
|
static bool trans_ebreak(DisasContext *ctx, arg_ebreak *a);
|
|
typedef arg_empty arg_uret;
|
|
static bool trans_uret(DisasContext *ctx, arg_uret *a);
|
|
typedef arg_empty arg_sret;
|
|
static bool trans_sret(DisasContext *ctx, arg_sret *a);
|
|
typedef arg_empty arg_mret;
|
|
static bool trans_mret(DisasContext *ctx, arg_mret *a);
|
|
typedef arg_empty arg_wfi;
|
|
static bool trans_wfi(DisasContext *ctx, arg_wfi *a);
|
|
typedef arg_decode_insn3214 arg_hfence_gvma;
|
|
static bool trans_hfence_gvma(DisasContext *ctx, arg_hfence_gvma *a);
|
|
typedef arg_decode_insn3214 arg_hfence_bvma;
|
|
static bool trans_hfence_bvma(DisasContext *ctx, arg_hfence_bvma *a);
|
|
typedef arg_decode_insn3214 arg_sfence_vma;
|
|
static bool trans_sfence_vma(DisasContext *ctx, arg_sfence_vma *a);
|
|
typedef arg_decode_insn3215 arg_sfence_vm;
|
|
static bool trans_sfence_vm(DisasContext *ctx, arg_sfence_vm *a);
|
|
typedef arg_u arg_lui;
|
|
static bool trans_lui(DisasContext *ctx, arg_lui *a);
|
|
typedef arg_u arg_auipc;
|
|
static bool trans_auipc(DisasContext *ctx, arg_auipc *a);
|
|
typedef arg_j arg_jal;
|
|
static bool trans_jal(DisasContext *ctx, arg_jal *a);
|
|
typedef arg_i arg_jalr;
|
|
static bool trans_jalr(DisasContext *ctx, arg_jalr *a);
|
|
typedef arg_b arg_beq;
|
|
static bool trans_beq(DisasContext *ctx, arg_beq *a);
|
|
typedef arg_b arg_bne;
|
|
static bool trans_bne(DisasContext *ctx, arg_bne *a);
|
|
typedef arg_b arg_blt;
|
|
static bool trans_blt(DisasContext *ctx, arg_blt *a);
|
|
typedef arg_b arg_bge;
|
|
static bool trans_bge(DisasContext *ctx, arg_bge *a);
|
|
typedef arg_b arg_bltu;
|
|
static bool trans_bltu(DisasContext *ctx, arg_bltu *a);
|
|
typedef arg_b arg_bgeu;
|
|
static bool trans_bgeu(DisasContext *ctx, arg_bgeu *a);
|
|
typedef arg_i arg_lb;
|
|
static bool trans_lb(DisasContext *ctx, arg_lb *a);
|
|
typedef arg_i arg_lh;
|
|
static bool trans_lh(DisasContext *ctx, arg_lh *a);
|
|
typedef arg_i arg_lw;
|
|
static bool trans_lw(DisasContext *ctx, arg_lw *a);
|
|
typedef arg_i arg_lbu;
|
|
static bool trans_lbu(DisasContext *ctx, arg_lbu *a);
|
|
typedef arg_i arg_lhu;
|
|
static bool trans_lhu(DisasContext *ctx, arg_lhu *a);
|
|
typedef arg_s arg_sb;
|
|
static bool trans_sb(DisasContext *ctx, arg_sb *a);
|
|
typedef arg_s arg_sh;
|
|
static bool trans_sh(DisasContext *ctx, arg_sh *a);
|
|
typedef arg_s arg_sw;
|
|
static bool trans_sw(DisasContext *ctx, arg_sw *a);
|
|
typedef arg_i arg_addi;
|
|
static bool trans_addi(DisasContext *ctx, arg_addi *a);
|
|
typedef arg_i arg_slti;
|
|
static bool trans_slti(DisasContext *ctx, arg_slti *a);
|
|
typedef arg_i arg_sltiu;
|
|
static bool trans_sltiu(DisasContext *ctx, arg_sltiu *a);
|
|
typedef arg_i arg_xori;
|
|
static bool trans_xori(DisasContext *ctx, arg_xori *a);
|
|
typedef arg_i arg_ori;
|
|
static bool trans_ori(DisasContext *ctx, arg_ori *a);
|
|
typedef arg_i arg_andi;
|
|
static bool trans_andi(DisasContext *ctx, arg_andi *a);
|
|
typedef arg_shift arg_slli;
|
|
static bool trans_slli(DisasContext *ctx, arg_slli *a);
|
|
typedef arg_shift arg_srli;
|
|
static bool trans_srli(DisasContext *ctx, arg_srli *a);
|
|
typedef arg_shift arg_srai;
|
|
static bool trans_srai(DisasContext *ctx, arg_srai *a);
|
|
typedef arg_r arg_add;
|
|
static bool trans_add(DisasContext *ctx, arg_add *a);
|
|
typedef arg_r arg_sub;
|
|
static bool trans_sub(DisasContext *ctx, arg_sub *a);
|
|
typedef arg_r arg_sll;
|
|
static bool trans_sll(DisasContext *ctx, arg_sll *a);
|
|
typedef arg_r arg_slt;
|
|
static bool trans_slt(DisasContext *ctx, arg_slt *a);
|
|
typedef arg_r arg_sltu;
|
|
static bool trans_sltu(DisasContext *ctx, arg_sltu *a);
|
|
typedef arg_r arg_xor;
|
|
static bool trans_xor(DisasContext *ctx, arg_xor *a);
|
|
typedef arg_r arg_srl;
|
|
static bool trans_srl(DisasContext *ctx, arg_srl *a);
|
|
typedef arg_r arg_sra;
|
|
static bool trans_sra(DisasContext *ctx, arg_sra *a);
|
|
typedef arg_r arg_or;
|
|
static bool trans_or(DisasContext *ctx, arg_or *a);
|
|
typedef arg_r arg_and;
|
|
static bool trans_and(DisasContext *ctx, arg_and *a);
|
|
typedef arg_decode_insn3216 arg_fence;
|
|
static bool trans_fence(DisasContext *ctx, arg_fence *a);
|
|
typedef arg_empty arg_fence_i;
|
|
static bool trans_fence_i(DisasContext *ctx, arg_fence_i *a);
|
|
typedef arg_decode_insn329 arg_csrrw;
|
|
static bool trans_csrrw(DisasContext *ctx, arg_csrrw *a);
|
|
typedef arg_decode_insn329 arg_csrrs;
|
|
static bool trans_csrrs(DisasContext *ctx, arg_csrrs *a);
|
|
typedef arg_decode_insn329 arg_csrrc;
|
|
static bool trans_csrrc(DisasContext *ctx, arg_csrrc *a);
|
|
typedef arg_decode_insn329 arg_csrrwi;
|
|
static bool trans_csrrwi(DisasContext *ctx, arg_csrrwi *a);
|
|
typedef arg_decode_insn329 arg_csrrsi;
|
|
static bool trans_csrrsi(DisasContext *ctx, arg_csrrsi *a);
|
|
typedef arg_decode_insn329 arg_csrrci;
|
|
static bool trans_csrrci(DisasContext *ctx, arg_csrrci *a);
|
|
typedef arg_r arg_mul;
|
|
static bool trans_mul(DisasContext *ctx, arg_mul *a);
|
|
typedef arg_r arg_mulh;
|
|
static bool trans_mulh(DisasContext *ctx, arg_mulh *a);
|
|
typedef arg_r arg_mulhsu;
|
|
static bool trans_mulhsu(DisasContext *ctx, arg_mulhsu *a);
|
|
typedef arg_r arg_mulhu;
|
|
static bool trans_mulhu(DisasContext *ctx, arg_mulhu *a);
|
|
typedef arg_r arg_div;
|
|
static bool trans_div(DisasContext *ctx, arg_div *a);
|
|
typedef arg_r arg_divu;
|
|
static bool trans_divu(DisasContext *ctx, arg_divu *a);
|
|
typedef arg_r arg_rem;
|
|
static bool trans_rem(DisasContext *ctx, arg_rem *a);
|
|
typedef arg_r arg_remu;
|
|
static bool trans_remu(DisasContext *ctx, arg_remu *a);
|
|
typedef arg_atomic arg_lr_w;
|
|
static bool trans_lr_w(DisasContext *ctx, arg_lr_w *a);
|
|
typedef arg_atomic arg_sc_w;
|
|
static bool trans_sc_w(DisasContext *ctx, arg_sc_w *a);
|
|
typedef arg_atomic arg_amoswap_w;
|
|
static bool trans_amoswap_w(DisasContext *ctx, arg_amoswap_w *a);
|
|
typedef arg_atomic arg_amoadd_w;
|
|
static bool trans_amoadd_w(DisasContext *ctx, arg_amoadd_w *a);
|
|
typedef arg_atomic arg_amoxor_w;
|
|
static bool trans_amoxor_w(DisasContext *ctx, arg_amoxor_w *a);
|
|
typedef arg_atomic arg_amoand_w;
|
|
static bool trans_amoand_w(DisasContext *ctx, arg_amoand_w *a);
|
|
typedef arg_atomic arg_amoor_w;
|
|
static bool trans_amoor_w(DisasContext *ctx, arg_amoor_w *a);
|
|
typedef arg_atomic arg_amomin_w;
|
|
static bool trans_amomin_w(DisasContext *ctx, arg_amomin_w *a);
|
|
typedef arg_atomic arg_amomax_w;
|
|
static bool trans_amomax_w(DisasContext *ctx, arg_amomax_w *a);
|
|
typedef arg_atomic arg_amominu_w;
|
|
static bool trans_amominu_w(DisasContext *ctx, arg_amominu_w *a);
|
|
typedef arg_atomic arg_amomaxu_w;
|
|
static bool trans_amomaxu_w(DisasContext *ctx, arg_amomaxu_w *a);
|
|
typedef arg_i arg_flw;
|
|
static bool trans_flw(DisasContext *ctx, arg_flw *a);
|
|
typedef arg_s arg_fsw;
|
|
static bool trans_fsw(DisasContext *ctx, arg_fsw *a);
|
|
typedef arg_decode_insn3210 arg_fmadd_s;
|
|
static bool trans_fmadd_s(DisasContext *ctx, arg_fmadd_s *a);
|
|
typedef arg_decode_insn3210 arg_fmsub_s;
|
|
static bool trans_fmsub_s(DisasContext *ctx, arg_fmsub_s *a);
|
|
typedef arg_decode_insn3210 arg_fnmsub_s;
|
|
static bool trans_fnmsub_s(DisasContext *ctx, arg_fnmsub_s *a);
|
|
typedef arg_decode_insn3210 arg_fnmadd_s;
|
|
static bool trans_fnmadd_s(DisasContext *ctx, arg_fnmadd_s *a);
|
|
typedef arg_decode_insn3211 arg_fadd_s;
|
|
static bool trans_fadd_s(DisasContext *ctx, arg_fadd_s *a);
|
|
typedef arg_decode_insn3211 arg_fsub_s;
|
|
static bool trans_fsub_s(DisasContext *ctx, arg_fsub_s *a);
|
|
typedef arg_decode_insn3211 arg_fmul_s;
|
|
static bool trans_fmul_s(DisasContext *ctx, arg_fmul_s *a);
|
|
typedef arg_decode_insn3211 arg_fdiv_s;
|
|
static bool trans_fdiv_s(DisasContext *ctx, arg_fdiv_s *a);
|
|
typedef arg_decode_insn3212 arg_fsqrt_s;
|
|
static bool trans_fsqrt_s(DisasContext *ctx, arg_fsqrt_s *a);
|
|
typedef arg_r arg_fsgnj_s;
|
|
static bool trans_fsgnj_s(DisasContext *ctx, arg_fsgnj_s *a);
|
|
typedef arg_r arg_fsgnjn_s;
|
|
static bool trans_fsgnjn_s(DisasContext *ctx, arg_fsgnjn_s *a);
|
|
typedef arg_r arg_fsgnjx_s;
|
|
static bool trans_fsgnjx_s(DisasContext *ctx, arg_fsgnjx_s *a);
|
|
typedef arg_r arg_fmin_s;
|
|
static bool trans_fmin_s(DisasContext *ctx, arg_fmin_s *a);
|
|
typedef arg_r arg_fmax_s;
|
|
static bool trans_fmax_s(DisasContext *ctx, arg_fmax_s *a);
|
|
typedef arg_decode_insn3212 arg_fcvt_w_s;
|
|
static bool trans_fcvt_w_s(DisasContext *ctx, arg_fcvt_w_s *a);
|
|
typedef arg_decode_insn3212 arg_fcvt_wu_s;
|
|
static bool trans_fcvt_wu_s(DisasContext *ctx, arg_fcvt_wu_s *a);
|
|
typedef arg_decode_insn3213 arg_fmv_x_w;
|
|
static bool trans_fmv_x_w(DisasContext *ctx, arg_fmv_x_w *a);
|
|
typedef arg_r arg_feq_s;
|
|
static bool trans_feq_s(DisasContext *ctx, arg_feq_s *a);
|
|
typedef arg_r arg_flt_s;
|
|
static bool trans_flt_s(DisasContext *ctx, arg_flt_s *a);
|
|
typedef arg_r arg_fle_s;
|
|
static bool trans_fle_s(DisasContext *ctx, arg_fle_s *a);
|
|
typedef arg_decode_insn3213 arg_fclass_s;
|
|
static bool trans_fclass_s(DisasContext *ctx, arg_fclass_s *a);
|
|
typedef arg_decode_insn3212 arg_fcvt_s_w;
|
|
static bool trans_fcvt_s_w(DisasContext *ctx, arg_fcvt_s_w *a);
|
|
typedef arg_decode_insn3212 arg_fcvt_s_wu;
|
|
static bool trans_fcvt_s_wu(DisasContext *ctx, arg_fcvt_s_wu *a);
|
|
typedef arg_decode_insn3213 arg_fmv_w_x;
|
|
static bool trans_fmv_w_x(DisasContext *ctx, arg_fmv_w_x *a);
|
|
typedef arg_i arg_fld;
|
|
static bool trans_fld(DisasContext *ctx, arg_fld *a);
|
|
typedef arg_s arg_fsd;
|
|
static bool trans_fsd(DisasContext *ctx, arg_fsd *a);
|
|
typedef arg_decode_insn3210 arg_fmadd_d;
|
|
static bool trans_fmadd_d(DisasContext *ctx, arg_fmadd_d *a);
|
|
typedef arg_decode_insn3210 arg_fmsub_d;
|
|
static bool trans_fmsub_d(DisasContext *ctx, arg_fmsub_d *a);
|
|
typedef arg_decode_insn3210 arg_fnmsub_d;
|
|
static bool trans_fnmsub_d(DisasContext *ctx, arg_fnmsub_d *a);
|
|
typedef arg_decode_insn3210 arg_fnmadd_d;
|
|
static bool trans_fnmadd_d(DisasContext *ctx, arg_fnmadd_d *a);
|
|
typedef arg_decode_insn3211 arg_fadd_d;
|
|
static bool trans_fadd_d(DisasContext *ctx, arg_fadd_d *a);
|
|
typedef arg_decode_insn3211 arg_fsub_d;
|
|
static bool trans_fsub_d(DisasContext *ctx, arg_fsub_d *a);
|
|
typedef arg_decode_insn3211 arg_fmul_d;
|
|
static bool trans_fmul_d(DisasContext *ctx, arg_fmul_d *a);
|
|
typedef arg_decode_insn3211 arg_fdiv_d;
|
|
static bool trans_fdiv_d(DisasContext *ctx, arg_fdiv_d *a);
|
|
typedef arg_decode_insn3212 arg_fsqrt_d;
|
|
static bool trans_fsqrt_d(DisasContext *ctx, arg_fsqrt_d *a);
|
|
typedef arg_r arg_fsgnj_d;
|
|
static bool trans_fsgnj_d(DisasContext *ctx, arg_fsgnj_d *a);
|
|
typedef arg_r arg_fsgnjn_d;
|
|
static bool trans_fsgnjn_d(DisasContext *ctx, arg_fsgnjn_d *a);
|
|
typedef arg_r arg_fsgnjx_d;
|
|
static bool trans_fsgnjx_d(DisasContext *ctx, arg_fsgnjx_d *a);
|
|
typedef arg_r arg_fmin_d;
|
|
static bool trans_fmin_d(DisasContext *ctx, arg_fmin_d *a);
|
|
typedef arg_r arg_fmax_d;
|
|
static bool trans_fmax_d(DisasContext *ctx, arg_fmax_d *a);
|
|
typedef arg_decode_insn3212 arg_fcvt_s_d;
|
|
static bool trans_fcvt_s_d(DisasContext *ctx, arg_fcvt_s_d *a);
|
|
typedef arg_decode_insn3212 arg_fcvt_d_s;
|
|
static bool trans_fcvt_d_s(DisasContext *ctx, arg_fcvt_d_s *a);
|
|
typedef arg_r arg_feq_d;
|
|
static bool trans_feq_d(DisasContext *ctx, arg_feq_d *a);
|
|
typedef arg_r arg_flt_d;
|
|
static bool trans_flt_d(DisasContext *ctx, arg_flt_d *a);
|
|
typedef arg_r arg_fle_d;
|
|
static bool trans_fle_d(DisasContext *ctx, arg_fle_d *a);
|
|
typedef arg_decode_insn3213 arg_fclass_d;
|
|
static bool trans_fclass_d(DisasContext *ctx, arg_fclass_d *a);
|
|
typedef arg_decode_insn3212 arg_fcvt_w_d;
|
|
static bool trans_fcvt_w_d(DisasContext *ctx, arg_fcvt_w_d *a);
|
|
typedef arg_decode_insn3212 arg_fcvt_wu_d;
|
|
static bool trans_fcvt_wu_d(DisasContext *ctx, arg_fcvt_wu_d *a);
|
|
typedef arg_decode_insn3212 arg_fcvt_d_w;
|
|
static bool trans_fcvt_d_w(DisasContext *ctx, arg_fcvt_d_w *a);
|
|
typedef arg_decode_insn3212 arg_fcvt_d_wu;
|
|
static bool trans_fcvt_d_wu(DisasContext *ctx, arg_fcvt_d_wu *a);
|
|
|
|
static void decode_insn32_extract_atom_ld(DisasContext *ctx, arg_atomic *a, uint32_t insn)
|
|
{
|
|
a->aq = extract32(insn, 26, 1);
|
|
a->rl = extract32(insn, 25, 1);
|
|
a->rs2 = 0;
|
|
a->rs1 = extract32(insn, 15, 5);
|
|
a->rd = extract32(insn, 7, 5);
|
|
}
|
|
|
|
static void decode_insn32_extract_atom_st(DisasContext *ctx, arg_atomic *a, uint32_t insn)
|
|
{
|
|
a->aq = extract32(insn, 26, 1);
|
|
a->rl = extract32(insn, 25, 1);
|
|
a->rs2 = extract32(insn, 20, 5);
|
|
a->rs1 = extract32(insn, 15, 5);
|
|
a->rd = extract32(insn, 7, 5);
|
|
}
|
|
|
|
static void decode_insn32_extract_b(DisasContext *ctx, arg_b *a, uint32_t insn)
|
|
{
|
|
a->imm = ex_shift_1(ctx, deposit32(deposit32(deposit32(extract32(insn, 8, 4), 4, 28, extract32(insn, 25, 6)), 10, 22, extract32(insn, 7, 1)), 11, 21, sextract32(insn, 31, 1)));
|
|
a->rs2 = extract32(insn, 20, 5);
|
|
a->rs1 = extract32(insn, 15, 5);
|
|
}
|
|
|
|
static void decode_insn32_extract_csr(DisasContext *ctx, arg_decode_insn329 *a, uint32_t insn)
|
|
{
|
|
a->csr = extract32(insn, 20, 12);
|
|
a->rs1 = extract32(insn, 15, 5);
|
|
a->rd = extract32(insn, 7, 5);
|
|
}
|
|
|
|
static void decode_insn32_extract_decode_insn32_Fmt_18(DisasContext *ctx, arg_empty *a, uint32_t insn)
|
|
{
|
|
}
|
|
|
|
static void decode_insn32_extract_decode_insn32_Fmt_19(DisasContext *ctx, arg_decode_insn3216 *a, uint32_t insn)
|
|
{
|
|
a->pred = extract32(insn, 24, 4);
|
|
a->succ = extract32(insn, 20, 4);
|
|
}
|
|
|
|
static void decode_insn32_extract_hfence_bvma(DisasContext *ctx, arg_decode_insn3214 *a, uint32_t insn)
|
|
{
|
|
a->rs2 = extract32(insn, 20, 5);
|
|
a->rs1 = extract32(insn, 15, 5);
|
|
}
|
|
|
|
static void decode_insn32_extract_hfence_gvma(DisasContext *ctx, arg_decode_insn3214 *a, uint32_t insn)
|
|
{
|
|
a->rs2 = extract32(insn, 20, 5);
|
|
a->rs1 = extract32(insn, 15, 5);
|
|
}
|
|
|
|
static void decode_insn32_extract_i(DisasContext *ctx, arg_i *a, uint32_t insn)
|
|
{
|
|
a->imm = sextract32(insn, 20, 12);
|
|
a->rs1 = extract32(insn, 15, 5);
|
|
a->rd = extract32(insn, 7, 5);
|
|
}
|
|
|
|
static void decode_insn32_extract_j(DisasContext *ctx, arg_j *a, uint32_t insn)
|
|
{
|
|
a->imm = ex_shift_1(ctx, deposit32(deposit32(deposit32(extract32(insn, 21, 10), 10, 22, extract32(insn, 20, 1)), 11, 21, extract32(insn, 12, 8)), 19, 13, sextract32(insn, 31, 1)));
|
|
a->rd = extract32(insn, 7, 5);
|
|
}
|
|
|
|
static void decode_insn32_extract_r(DisasContext *ctx, arg_r *a, uint32_t insn)
|
|
{
|
|
a->rs2 = extract32(insn, 20, 5);
|
|
a->rs1 = extract32(insn, 15, 5);
|
|
a->rd = extract32(insn, 7, 5);
|
|
}
|
|
|
|
static void decode_insn32_extract_r2(DisasContext *ctx, arg_decode_insn3213 *a, uint32_t insn)
|
|
{
|
|
a->rs1 = extract32(insn, 15, 5);
|
|
a->rd = extract32(insn, 7, 5);
|
|
}
|
|
|
|
static void decode_insn32_extract_r2_rm(DisasContext *ctx, arg_decode_insn3212 *a, uint32_t insn)
|
|
{
|
|
a->rs1 = extract32(insn, 15, 5);
|
|
a->rm = extract32(insn, 12, 3);
|
|
a->rd = extract32(insn, 7, 5);
|
|
}
|
|
|
|
static void decode_insn32_extract_r4_rm(DisasContext *ctx, arg_decode_insn3210 *a, uint32_t insn)
|
|
{
|
|
a->rs3 = extract32(insn, 27, 5);
|
|
a->rs2 = extract32(insn, 20, 5);
|
|
a->rs1 = extract32(insn, 15, 5);
|
|
a->rm = extract32(insn, 12, 3);
|
|
a->rd = extract32(insn, 7, 5);
|
|
}
|
|
|
|
static void decode_insn32_extract_r_rm(DisasContext *ctx, arg_decode_insn3211 *a, uint32_t insn)
|
|
{
|
|
a->rs2 = extract32(insn, 20, 5);
|
|
a->rs1 = extract32(insn, 15, 5);
|
|
a->rm = extract32(insn, 12, 3);
|
|
a->rd = extract32(insn, 7, 5);
|
|
}
|
|
|
|
static void decode_insn32_extract_s(DisasContext *ctx, arg_s *a, uint32_t insn)
|
|
{
|
|
a->imm = deposit32(extract32(insn, 7, 5), 5, 27, sextract32(insn, 25, 7));
|
|
a->rs2 = extract32(insn, 20, 5);
|
|
a->rs1 = extract32(insn, 15, 5);
|
|
}
|
|
|
|
static void decode_insn32_extract_sfence_vm(DisasContext *ctx, arg_decode_insn3215 *a, uint32_t insn)
|
|
{
|
|
a->rs1 = extract32(insn, 15, 5);
|
|
}
|
|
|
|
static void decode_insn32_extract_sfence_vma(DisasContext *ctx, arg_decode_insn3214 *a, uint32_t insn)
|
|
{
|
|
a->rs2 = extract32(insn, 20, 5);
|
|
a->rs1 = extract32(insn, 15, 5);
|
|
}
|
|
|
|
static void decode_insn32_extract_sh(DisasContext *ctx, arg_shift *a, uint32_t insn)
|
|
{
|
|
a->shamt = extract32(insn, 20, 10);
|
|
a->rs1 = extract32(insn, 15, 5);
|
|
a->rd = extract32(insn, 7, 5);
|
|
}
|
|
|
|
static void decode_insn32_extract_u(DisasContext *ctx, arg_u *a, uint32_t insn)
|
|
{
|
|
a->imm = ex_shift_12(ctx, sextract32(insn, 12, 20));
|
|
a->rd = extract32(insn, 7, 5);
|
|
}
|
|
|
|
static bool decode_insn32(DisasContext *ctx, uint32_t insn)
|
|
{
|
|
union {
|
|
arg_atomic f_atomic;
|
|
arg_b f_b;
|
|
arg_decode_insn3210 f_decode_insn3210;
|
|
arg_decode_insn3211 f_decode_insn3211;
|
|
arg_decode_insn3212 f_decode_insn3212;
|
|
arg_decode_insn3213 f_decode_insn3213;
|
|
arg_decode_insn3214 f_decode_insn3214;
|
|
arg_decode_insn3215 f_decode_insn3215;
|
|
arg_decode_insn3216 f_decode_insn3216;
|
|
arg_decode_insn329 f_decode_insn329;
|
|
arg_empty f_empty;
|
|
arg_i f_i;
|
|
arg_j f_j;
|
|
arg_r f_r;
|
|
arg_s f_s;
|
|
arg_shift f_shift;
|
|
arg_u f_u;
|
|
} u;
|
|
|
|
switch (insn & 0x0000007f) {
|
|
case 0x00000003:
|
|
/* ........ ........ ........ .0000011 */
|
|
decode_insn32_extract_i(ctx, &u.f_i, insn);
|
|
switch ((insn >> 12) & 0x7) {
|
|
case 0x0:
|
|
/* ........ ........ .000.... .0000011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:96 */
|
|
if (trans_lb(ctx, &u.f_i)) return true;
|
|
return false;
|
|
case 0x1:
|
|
/* ........ ........ .001.... .0000011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:97 */
|
|
if (trans_lh(ctx, &u.f_i)) return true;
|
|
return false;
|
|
case 0x2:
|
|
/* ........ ........ .010.... .0000011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:98 */
|
|
if (trans_lw(ctx, &u.f_i)) return true;
|
|
return false;
|
|
case 0x4:
|
|
/* ........ ........ .100.... .0000011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:99 */
|
|
if (trans_lbu(ctx, &u.f_i)) return true;
|
|
return false;
|
|
case 0x5:
|
|
/* ........ ........ .101.... .0000011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:100 */
|
|
if (trans_lhu(ctx, &u.f_i)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x00000007:
|
|
/* ........ ........ ........ .0000111 */
|
|
decode_insn32_extract_i(ctx, &u.f_i, insn);
|
|
switch ((insn >> 12) & 0x7) {
|
|
case 0x2:
|
|
/* ........ ........ .010.... .0000111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:156 */
|
|
if (trans_flw(ctx, &u.f_i)) return true;
|
|
return false;
|
|
case 0x3:
|
|
/* ........ ........ .011.... .0000111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:184 */
|
|
if (trans_fld(ctx, &u.f_i)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x0000000f:
|
|
/* ........ ........ ........ .0001111 */
|
|
switch ((insn >> 12) & 0x7) {
|
|
case 0x0:
|
|
/* ........ ........ .000.... .0001111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:123 */
|
|
decode_insn32_extract_decode_insn32_Fmt_19(ctx, &u.f_decode_insn3216, insn);
|
|
if (trans_fence(ctx, &u.f_decode_insn3216)) return true;
|
|
return false;
|
|
case 0x1:
|
|
/* ........ ........ .001.... .0001111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:124 */
|
|
decode_insn32_extract_decode_insn32_Fmt_18(ctx, &u.f_empty, insn);
|
|
if (trans_fence_i(ctx, &u.f_empty)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x00000013:
|
|
/* ........ ........ ........ .0010011 */
|
|
switch ((insn >> 12) & 0x7) {
|
|
case 0x0:
|
|
/* ........ ........ .000.... .0010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:104 */
|
|
decode_insn32_extract_i(ctx, &u.f_i, insn);
|
|
if (trans_addi(ctx, &u.f_i)) return true;
|
|
return false;
|
|
case 0x1:
|
|
/* ........ ........ .001.... .0010011 */
|
|
decode_insn32_extract_sh(ctx, &u.f_shift, insn);
|
|
switch ((insn >> 30) & 0x3) {
|
|
case 0x0:
|
|
/* 00...... ........ .001.... .0010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:110 */
|
|
if (trans_slli(ctx, &u.f_shift)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x2:
|
|
/* ........ ........ .010.... .0010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:105 */
|
|
decode_insn32_extract_i(ctx, &u.f_i, insn);
|
|
if (trans_slti(ctx, &u.f_i)) return true;
|
|
return false;
|
|
case 0x3:
|
|
/* ........ ........ .011.... .0010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:106 */
|
|
decode_insn32_extract_i(ctx, &u.f_i, insn);
|
|
if (trans_sltiu(ctx, &u.f_i)) return true;
|
|
return false;
|
|
case 0x4:
|
|
/* ........ ........ .100.... .0010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:107 */
|
|
decode_insn32_extract_i(ctx, &u.f_i, insn);
|
|
if (trans_xori(ctx, &u.f_i)) return true;
|
|
return false;
|
|
case 0x5:
|
|
/* ........ ........ .101.... .0010011 */
|
|
decode_insn32_extract_sh(ctx, &u.f_shift, insn);
|
|
switch ((insn >> 30) & 0x3) {
|
|
case 0x0:
|
|
/* 00...... ........ .101.... .0010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:111 */
|
|
if (trans_srli(ctx, &u.f_shift)) return true;
|
|
return false;
|
|
case 0x1:
|
|
/* 01...... ........ .101.... .0010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:112 */
|
|
if (trans_srai(ctx, &u.f_shift)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x6:
|
|
/* ........ ........ .110.... .0010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:108 */
|
|
decode_insn32_extract_i(ctx, &u.f_i, insn);
|
|
if (trans_ori(ctx, &u.f_i)) return true;
|
|
return false;
|
|
case 0x7:
|
|
/* ........ ........ .111.... .0010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:109 */
|
|
decode_insn32_extract_i(ctx, &u.f_i, insn);
|
|
if (trans_andi(ctx, &u.f_i)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x00000017:
|
|
/* ........ ........ ........ .0010111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:87 */
|
|
decode_insn32_extract_u(ctx, &u.f_u, insn);
|
|
if (trans_auipc(ctx, &u.f_u)) return true;
|
|
return false;
|
|
case 0x00000023:
|
|
/* ........ ........ ........ .0100011 */
|
|
decode_insn32_extract_s(ctx, &u.f_s, insn);
|
|
switch ((insn >> 12) & 0x7) {
|
|
case 0x0:
|
|
/* ........ ........ .000.... .0100011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:101 */
|
|
if (trans_sb(ctx, &u.f_s)) return true;
|
|
return false;
|
|
case 0x1:
|
|
/* ........ ........ .001.... .0100011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:102 */
|
|
if (trans_sh(ctx, &u.f_s)) return true;
|
|
return false;
|
|
case 0x2:
|
|
/* ........ ........ .010.... .0100011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:103 */
|
|
if (trans_sw(ctx, &u.f_s)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x00000027:
|
|
/* ........ ........ ........ .0100111 */
|
|
decode_insn32_extract_s(ctx, &u.f_s, insn);
|
|
switch ((insn >> 12) & 0x7) {
|
|
case 0x2:
|
|
/* ........ ........ .010.... .0100111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:157 */
|
|
if (trans_fsw(ctx, &u.f_s)) return true;
|
|
return false;
|
|
case 0x3:
|
|
/* ........ ........ .011.... .0100111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:185 */
|
|
if (trans_fsd(ctx, &u.f_s)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x0000002f:
|
|
/* ........ ........ ........ .0101111 */
|
|
switch (insn & 0xf8007000) {
|
|
case 0x00002000:
|
|
/* 00000... ........ .010.... .0101111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:146 */
|
|
decode_insn32_extract_atom_st(ctx, &u.f_atomic, insn);
|
|
if (trans_amoadd_w(ctx, &u.f_atomic)) return true;
|
|
return false;
|
|
case 0x08002000:
|
|
/* 00001... ........ .010.... .0101111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:145 */
|
|
decode_insn32_extract_atom_st(ctx, &u.f_atomic, insn);
|
|
if (trans_amoswap_w(ctx, &u.f_atomic)) return true;
|
|
return false;
|
|
case 0x10002000:
|
|
/* 00010... ........ .010.... .0101111 */
|
|
decode_insn32_extract_atom_ld(ctx, &u.f_atomic, insn);
|
|
switch ((insn >> 20) & 0x1f) {
|
|
case 0x0:
|
|
/* 00010..0 0000.... .010.... .0101111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:143 */
|
|
if (trans_lr_w(ctx, &u.f_atomic)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x18002000:
|
|
/* 00011... ........ .010.... .0101111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:144 */
|
|
decode_insn32_extract_atom_st(ctx, &u.f_atomic, insn);
|
|
if (trans_sc_w(ctx, &u.f_atomic)) return true;
|
|
return false;
|
|
case 0x20002000:
|
|
/* 00100... ........ .010.... .0101111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:147 */
|
|
decode_insn32_extract_atom_st(ctx, &u.f_atomic, insn);
|
|
if (trans_amoxor_w(ctx, &u.f_atomic)) return true;
|
|
return false;
|
|
case 0x40002000:
|
|
/* 01000... ........ .010.... .0101111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:149 */
|
|
decode_insn32_extract_atom_st(ctx, &u.f_atomic, insn);
|
|
if (trans_amoor_w(ctx, &u.f_atomic)) return true;
|
|
return false;
|
|
case 0x60002000:
|
|
/* 01100... ........ .010.... .0101111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:148 */
|
|
decode_insn32_extract_atom_st(ctx, &u.f_atomic, insn);
|
|
if (trans_amoand_w(ctx, &u.f_atomic)) return true;
|
|
return false;
|
|
case 0x80002000:
|
|
/* 10000... ........ .010.... .0101111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:150 */
|
|
decode_insn32_extract_atom_st(ctx, &u.f_atomic, insn);
|
|
if (trans_amomin_w(ctx, &u.f_atomic)) return true;
|
|
return false;
|
|
case 0xa0002000:
|
|
/* 10100... ........ .010.... .0101111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:151 */
|
|
decode_insn32_extract_atom_st(ctx, &u.f_atomic, insn);
|
|
if (trans_amomax_w(ctx, &u.f_atomic)) return true;
|
|
return false;
|
|
case 0xc0002000:
|
|
/* 11000... ........ .010.... .0101111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:152 */
|
|
decode_insn32_extract_atom_st(ctx, &u.f_atomic, insn);
|
|
if (trans_amominu_w(ctx, &u.f_atomic)) return true;
|
|
return false;
|
|
case 0xe0002000:
|
|
/* 11100... ........ .010.... .0101111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:153 */
|
|
decode_insn32_extract_atom_st(ctx, &u.f_atomic, insn);
|
|
if (trans_amomaxu_w(ctx, &u.f_atomic)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x00000033:
|
|
/* ........ ........ ........ .0110011 */
|
|
decode_insn32_extract_r(ctx, &u.f_r, insn);
|
|
switch (insn & 0xfe007000) {
|
|
case 0x00000000:
|
|
/* 0000000. ........ .000.... .0110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:113 */
|
|
if (trans_add(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x00001000:
|
|
/* 0000000. ........ .001.... .0110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:115 */
|
|
if (trans_sll(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x00002000:
|
|
/* 0000000. ........ .010.... .0110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:116 */
|
|
if (trans_slt(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x00003000:
|
|
/* 0000000. ........ .011.... .0110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:117 */
|
|
if (trans_sltu(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x00004000:
|
|
/* 0000000. ........ .100.... .0110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:118 */
|
|
if (trans_xor(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x00005000:
|
|
/* 0000000. ........ .101.... .0110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:119 */
|
|
if (trans_srl(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x00006000:
|
|
/* 0000000. ........ .110.... .0110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:121 */
|
|
if (trans_or(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x00007000:
|
|
/* 0000000. ........ .111.... .0110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:122 */
|
|
if (trans_and(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x02000000:
|
|
/* 0000001. ........ .000.... .0110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:133 */
|
|
if (trans_mul(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x02001000:
|
|
/* 0000001. ........ .001.... .0110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:134 */
|
|
if (trans_mulh(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x02002000:
|
|
/* 0000001. ........ .010.... .0110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:135 */
|
|
if (trans_mulhsu(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x02003000:
|
|
/* 0000001. ........ .011.... .0110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:136 */
|
|
if (trans_mulhu(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x02004000:
|
|
/* 0000001. ........ .100.... .0110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:137 */
|
|
if (trans_div(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x02005000:
|
|
/* 0000001. ........ .101.... .0110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:138 */
|
|
if (trans_divu(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x02006000:
|
|
/* 0000001. ........ .110.... .0110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:139 */
|
|
if (trans_rem(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x02007000:
|
|
/* 0000001. ........ .111.... .0110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:140 */
|
|
if (trans_remu(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x40000000:
|
|
/* 0100000. ........ .000.... .0110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:114 */
|
|
if (trans_sub(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x40005000:
|
|
/* 0100000. ........ .101.... .0110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:120 */
|
|
if (trans_sra(ctx, &u.f_r)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x00000037:
|
|
/* ........ ........ ........ .0110111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:86 */
|
|
decode_insn32_extract_u(ctx, &u.f_u, insn);
|
|
if (trans_lui(ctx, &u.f_u)) return true;
|
|
return false;
|
|
case 0x00000043:
|
|
/* ........ ........ ........ .1000011 */
|
|
decode_insn32_extract_r4_rm(ctx, &u.f_decode_insn3210, insn);
|
|
switch ((insn >> 25) & 0x3) {
|
|
case 0x0:
|
|
/* .....00. ........ ........ .1000011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:158 */
|
|
if (trans_fmadd_s(ctx, &u.f_decode_insn3210)) return true;
|
|
return false;
|
|
case 0x1:
|
|
/* .....01. ........ ........ .1000011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:186 */
|
|
if (trans_fmadd_d(ctx, &u.f_decode_insn3210)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x00000047:
|
|
/* ........ ........ ........ .1000111 */
|
|
decode_insn32_extract_r4_rm(ctx, &u.f_decode_insn3210, insn);
|
|
switch ((insn >> 25) & 0x3) {
|
|
case 0x0:
|
|
/* .....00. ........ ........ .1000111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:159 */
|
|
if (trans_fmsub_s(ctx, &u.f_decode_insn3210)) return true;
|
|
return false;
|
|
case 0x1:
|
|
/* .....01. ........ ........ .1000111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:187 */
|
|
if (trans_fmsub_d(ctx, &u.f_decode_insn3210)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x0000004b:
|
|
/* ........ ........ ........ .1001011 */
|
|
decode_insn32_extract_r4_rm(ctx, &u.f_decode_insn3210, insn);
|
|
switch ((insn >> 25) & 0x3) {
|
|
case 0x0:
|
|
/* .....00. ........ ........ .1001011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:160 */
|
|
if (trans_fnmsub_s(ctx, &u.f_decode_insn3210)) return true;
|
|
return false;
|
|
case 0x1:
|
|
/* .....01. ........ ........ .1001011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:188 */
|
|
if (trans_fnmsub_d(ctx, &u.f_decode_insn3210)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x0000004f:
|
|
/* ........ ........ ........ .1001111 */
|
|
decode_insn32_extract_r4_rm(ctx, &u.f_decode_insn3210, insn);
|
|
switch ((insn >> 25) & 0x3) {
|
|
case 0x0:
|
|
/* .....00. ........ ........ .1001111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:161 */
|
|
if (trans_fnmadd_s(ctx, &u.f_decode_insn3210)) return true;
|
|
return false;
|
|
case 0x1:
|
|
/* .....01. ........ ........ .1001111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:189 */
|
|
if (trans_fnmadd_d(ctx, &u.f_decode_insn3210)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x00000053:
|
|
/* ........ ........ ........ .1010011 */
|
|
switch ((insn >> 25) & 0x7f) {
|
|
case 0x0:
|
|
/* 0000000. ........ ........ .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:162 */
|
|
decode_insn32_extract_r_rm(ctx, &u.f_decode_insn3211, insn);
|
|
if (trans_fadd_s(ctx, &u.f_decode_insn3211)) return true;
|
|
return false;
|
|
case 0x1:
|
|
/* 0000001. ........ ........ .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:190 */
|
|
decode_insn32_extract_r_rm(ctx, &u.f_decode_insn3211, insn);
|
|
if (trans_fadd_d(ctx, &u.f_decode_insn3211)) return true;
|
|
return false;
|
|
case 0x4:
|
|
/* 0000100. ........ ........ .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:163 */
|
|
decode_insn32_extract_r_rm(ctx, &u.f_decode_insn3211, insn);
|
|
if (trans_fsub_s(ctx, &u.f_decode_insn3211)) return true;
|
|
return false;
|
|
case 0x5:
|
|
/* 0000101. ........ ........ .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:191 */
|
|
decode_insn32_extract_r_rm(ctx, &u.f_decode_insn3211, insn);
|
|
if (trans_fsub_d(ctx, &u.f_decode_insn3211)) return true;
|
|
return false;
|
|
case 0x8:
|
|
/* 0001000. ........ ........ .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:164 */
|
|
decode_insn32_extract_r_rm(ctx, &u.f_decode_insn3211, insn);
|
|
if (trans_fmul_s(ctx, &u.f_decode_insn3211)) return true;
|
|
return false;
|
|
case 0x9:
|
|
/* 0001001. ........ ........ .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:192 */
|
|
decode_insn32_extract_r_rm(ctx, &u.f_decode_insn3211, insn);
|
|
if (trans_fmul_d(ctx, &u.f_decode_insn3211)) return true;
|
|
return false;
|
|
case 0xc:
|
|
/* 0001100. ........ ........ .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:165 */
|
|
decode_insn32_extract_r_rm(ctx, &u.f_decode_insn3211, insn);
|
|
if (trans_fdiv_s(ctx, &u.f_decode_insn3211)) return true;
|
|
return false;
|
|
case 0xd:
|
|
/* 0001101. ........ ........ .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:193 */
|
|
decode_insn32_extract_r_rm(ctx, &u.f_decode_insn3211, insn);
|
|
if (trans_fdiv_d(ctx, &u.f_decode_insn3211)) return true;
|
|
return false;
|
|
case 0x10:
|
|
/* 0010000. ........ ........ .1010011 */
|
|
decode_insn32_extract_r(ctx, &u.f_r, insn);
|
|
switch ((insn >> 12) & 0x7) {
|
|
case 0x0:
|
|
/* 0010000. ........ .000.... .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:167 */
|
|
if (trans_fsgnj_s(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x1:
|
|
/* 0010000. ........ .001.... .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:168 */
|
|
if (trans_fsgnjn_s(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x2:
|
|
/* 0010000. ........ .010.... .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:169 */
|
|
if (trans_fsgnjx_s(ctx, &u.f_r)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x11:
|
|
/* 0010001. ........ ........ .1010011 */
|
|
decode_insn32_extract_r(ctx, &u.f_r, insn);
|
|
switch ((insn >> 12) & 0x7) {
|
|
case 0x0:
|
|
/* 0010001. ........ .000.... .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:195 */
|
|
if (trans_fsgnj_d(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x1:
|
|
/* 0010001. ........ .001.... .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:196 */
|
|
if (trans_fsgnjn_d(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x2:
|
|
/* 0010001. ........ .010.... .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:197 */
|
|
if (trans_fsgnjx_d(ctx, &u.f_r)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x14:
|
|
/* 0010100. ........ ........ .1010011 */
|
|
decode_insn32_extract_r(ctx, &u.f_r, insn);
|
|
switch ((insn >> 12) & 0x7) {
|
|
case 0x0:
|
|
/* 0010100. ........ .000.... .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:170 */
|
|
if (trans_fmin_s(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x1:
|
|
/* 0010100. ........ .001.... .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:171 */
|
|
if (trans_fmax_s(ctx, &u.f_r)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x15:
|
|
/* 0010101. ........ ........ .1010011 */
|
|
decode_insn32_extract_r(ctx, &u.f_r, insn);
|
|
switch ((insn >> 12) & 0x7) {
|
|
case 0x0:
|
|
/* 0010101. ........ .000.... .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:198 */
|
|
if (trans_fmin_d(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x1:
|
|
/* 0010101. ........ .001.... .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:199 */
|
|
if (trans_fmax_d(ctx, &u.f_r)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x20:
|
|
/* 0100000. ........ ........ .1010011 */
|
|
decode_insn32_extract_r2_rm(ctx, &u.f_decode_insn3212, insn);
|
|
switch ((insn >> 20) & 0x1f) {
|
|
case 0x1:
|
|
/* 01000000 0001.... ........ .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:200 */
|
|
if (trans_fcvt_s_d(ctx, &u.f_decode_insn3212)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x21:
|
|
/* 0100001. ........ ........ .1010011 */
|
|
decode_insn32_extract_r2_rm(ctx, &u.f_decode_insn3212, insn);
|
|
switch ((insn >> 20) & 0x1f) {
|
|
case 0x0:
|
|
/* 01000010 0000.... ........ .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:201 */
|
|
if (trans_fcvt_d_s(ctx, &u.f_decode_insn3212)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x2c:
|
|
/* 0101100. ........ ........ .1010011 */
|
|
decode_insn32_extract_r2_rm(ctx, &u.f_decode_insn3212, insn);
|
|
switch ((insn >> 20) & 0x1f) {
|
|
case 0x0:
|
|
/* 01011000 0000.... ........ .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:166 */
|
|
if (trans_fsqrt_s(ctx, &u.f_decode_insn3212)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x2d:
|
|
/* 0101101. ........ ........ .1010011 */
|
|
decode_insn32_extract_r2_rm(ctx, &u.f_decode_insn3212, insn);
|
|
switch ((insn >> 20) & 0x1f) {
|
|
case 0x0:
|
|
/* 01011010 0000.... ........ .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:194 */
|
|
if (trans_fsqrt_d(ctx, &u.f_decode_insn3212)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x50:
|
|
/* 1010000. ........ ........ .1010011 */
|
|
decode_insn32_extract_r(ctx, &u.f_r, insn);
|
|
switch ((insn >> 12) & 0x7) {
|
|
case 0x0:
|
|
/* 1010000. ........ .000.... .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:177 */
|
|
if (trans_fle_s(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x1:
|
|
/* 1010000. ........ .001.... .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:176 */
|
|
if (trans_flt_s(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x2:
|
|
/* 1010000. ........ .010.... .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:175 */
|
|
if (trans_feq_s(ctx, &u.f_r)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x51:
|
|
/* 1010001. ........ ........ .1010011 */
|
|
decode_insn32_extract_r(ctx, &u.f_r, insn);
|
|
switch ((insn >> 12) & 0x7) {
|
|
case 0x0:
|
|
/* 1010001. ........ .000.... .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:204 */
|
|
if (trans_fle_d(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x1:
|
|
/* 1010001. ........ .001.... .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:203 */
|
|
if (trans_flt_d(ctx, &u.f_r)) return true;
|
|
return false;
|
|
case 0x2:
|
|
/* 1010001. ........ .010.... .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:202 */
|
|
if (trans_feq_d(ctx, &u.f_r)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x60:
|
|
/* 1100000. ........ ........ .1010011 */
|
|
decode_insn32_extract_r2_rm(ctx, &u.f_decode_insn3212, insn);
|
|
switch ((insn >> 20) & 0x1f) {
|
|
case 0x0:
|
|
/* 11000000 0000.... ........ .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:172 */
|
|
if (trans_fcvt_w_s(ctx, &u.f_decode_insn3212)) return true;
|
|
return false;
|
|
case 0x1:
|
|
/* 11000000 0001.... ........ .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:173 */
|
|
if (trans_fcvt_wu_s(ctx, &u.f_decode_insn3212)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x61:
|
|
/* 1100001. ........ ........ .1010011 */
|
|
decode_insn32_extract_r2_rm(ctx, &u.f_decode_insn3212, insn);
|
|
switch ((insn >> 20) & 0x1f) {
|
|
case 0x0:
|
|
/* 11000010 0000.... ........ .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:206 */
|
|
if (trans_fcvt_w_d(ctx, &u.f_decode_insn3212)) return true;
|
|
return false;
|
|
case 0x1:
|
|
/* 11000010 0001.... ........ .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:207 */
|
|
if (trans_fcvt_wu_d(ctx, &u.f_decode_insn3212)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x68:
|
|
/* 1101000. ........ ........ .1010011 */
|
|
decode_insn32_extract_r2_rm(ctx, &u.f_decode_insn3212, insn);
|
|
switch ((insn >> 20) & 0x1f) {
|
|
case 0x0:
|
|
/* 11010000 0000.... ........ .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:179 */
|
|
if (trans_fcvt_s_w(ctx, &u.f_decode_insn3212)) return true;
|
|
return false;
|
|
case 0x1:
|
|
/* 11010000 0001.... ........ .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:180 */
|
|
if (trans_fcvt_s_wu(ctx, &u.f_decode_insn3212)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x69:
|
|
/* 1101001. ........ ........ .1010011 */
|
|
decode_insn32_extract_r2_rm(ctx, &u.f_decode_insn3212, insn);
|
|
switch ((insn >> 20) & 0x1f) {
|
|
case 0x0:
|
|
/* 11010010 0000.... ........ .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:208 */
|
|
if (trans_fcvt_d_w(ctx, &u.f_decode_insn3212)) return true;
|
|
return false;
|
|
case 0x1:
|
|
/* 11010010 0001.... ........ .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:209 */
|
|
if (trans_fcvt_d_wu(ctx, &u.f_decode_insn3212)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x70:
|
|
/* 1110000. ........ ........ .1010011 */
|
|
decode_insn32_extract_r2(ctx, &u.f_decode_insn3213, insn);
|
|
switch (insn & 0x01f07000) {
|
|
case 0x00000000:
|
|
/* 11100000 0000.... .000.... .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:174 */
|
|
if (trans_fmv_x_w(ctx, &u.f_decode_insn3213)) return true;
|
|
return false;
|
|
case 0x00001000:
|
|
/* 11100000 0000.... .001.... .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:178 */
|
|
if (trans_fclass_s(ctx, &u.f_decode_insn3213)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x71:
|
|
/* 1110001. ........ ........ .1010011 */
|
|
decode_insn32_extract_r2(ctx, &u.f_decode_insn3213, insn);
|
|
switch (insn & 0x01f07000) {
|
|
case 0x00001000:
|
|
/* 11100010 0000.... .001.... .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:205 */
|
|
if (trans_fclass_d(ctx, &u.f_decode_insn3213)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x78:
|
|
/* 1111000. ........ ........ .1010011 */
|
|
decode_insn32_extract_r2(ctx, &u.f_decode_insn3213, insn);
|
|
switch (insn & 0x01f07000) {
|
|
case 0x00000000:
|
|
/* 11110000 0000.... .000.... .1010011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:181 */
|
|
if (trans_fmv_w_x(ctx, &u.f_decode_insn3213)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x00000063:
|
|
/* ........ ........ ........ .1100011 */
|
|
decode_insn32_extract_b(ctx, &u.f_b, insn);
|
|
switch ((insn >> 12) & 0x7) {
|
|
case 0x0:
|
|
/* ........ ........ .000.... .1100011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:90 */
|
|
if (trans_beq(ctx, &u.f_b)) return true;
|
|
return false;
|
|
case 0x1:
|
|
/* ........ ........ .001.... .1100011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:91 */
|
|
if (trans_bne(ctx, &u.f_b)) return true;
|
|
return false;
|
|
case 0x4:
|
|
/* ........ ........ .100.... .1100011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:92 */
|
|
if (trans_blt(ctx, &u.f_b)) return true;
|
|
return false;
|
|
case 0x5:
|
|
/* ........ ........ .101.... .1100011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:93 */
|
|
if (trans_bge(ctx, &u.f_b)) return true;
|
|
return false;
|
|
case 0x6:
|
|
/* ........ ........ .110.... .1100011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:94 */
|
|
if (trans_bltu(ctx, &u.f_b)) return true;
|
|
return false;
|
|
case 0x7:
|
|
/* ........ ........ .111.... .1100011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:95 */
|
|
if (trans_bgeu(ctx, &u.f_b)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x00000067:
|
|
/* ........ ........ ........ .1100111 */
|
|
decode_insn32_extract_i(ctx, &u.f_i, insn);
|
|
switch ((insn >> 12) & 0x7) {
|
|
case 0x0:
|
|
/* ........ ........ .000.... .1100111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:89 */
|
|
if (trans_jalr(ctx, &u.f_i)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x0000006f:
|
|
/* ........ ........ ........ .1101111 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:88 */
|
|
decode_insn32_extract_j(ctx, &u.f_j, insn);
|
|
if (trans_jal(ctx, &u.f_j)) return true;
|
|
return false;
|
|
case 0x00000073:
|
|
/* ........ ........ ........ .1110011 */
|
|
switch ((insn >> 12) & 0x7) {
|
|
case 0x0:
|
|
/* ........ ........ .000.... .1110011 */
|
|
switch (insn & 0xfe000f80) {
|
|
case 0x00000000:
|
|
/* 0000000. ........ .0000000 01110011 */
|
|
decode_insn32_extract_decode_insn32_Fmt_18(ctx, &u.f_empty, insn);
|
|
switch ((insn >> 15) & 0x3ff) {
|
|
case 0x0:
|
|
/* 00000000 00000000 00000000 01110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:74 */
|
|
if (trans_ecall(ctx, &u.f_empty)) return true;
|
|
return false;
|
|
case 0x20:
|
|
/* 00000000 00010000 00000000 01110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:75 */
|
|
if (trans_ebreak(ctx, &u.f_empty)) return true;
|
|
return false;
|
|
case 0x40:
|
|
/* 00000000 00100000 00000000 01110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:76 */
|
|
if (trans_uret(ctx, &u.f_empty)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x10000000:
|
|
/* 0001000. ........ .0000000 01110011 */
|
|
switch ((insn >> 20) & 0x1f) {
|
|
case 0x2:
|
|
/* 00010000 0010.... .0000000 01110011 */
|
|
decode_insn32_extract_decode_insn32_Fmt_18(ctx, &u.f_empty, insn);
|
|
switch ((insn >> 15) & 0x1f) {
|
|
case 0x0:
|
|
/* 00010000 00100000 00000000 01110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:77 */
|
|
if (trans_sret(ctx, &u.f_empty)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x4:
|
|
/* 00010000 0100.... .0000000 01110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:83 */
|
|
decode_insn32_extract_sfence_vm(ctx, &u.f_decode_insn3215, insn);
|
|
if (trans_sfence_vm(ctx, &u.f_decode_insn3215)) return true;
|
|
return false;
|
|
case 0x5:
|
|
/* 00010000 0101.... .0000000 01110011 */
|
|
decode_insn32_extract_decode_insn32_Fmt_18(ctx, &u.f_empty, insn);
|
|
switch ((insn >> 15) & 0x1f) {
|
|
case 0x0:
|
|
/* 00010000 01010000 00000000 01110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:79 */
|
|
if (trans_wfi(ctx, &u.f_empty)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x12000000:
|
|
/* 0001001. ........ .0000000 01110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:82 */
|
|
decode_insn32_extract_sfence_vma(ctx, &u.f_decode_insn3214, insn);
|
|
if (trans_sfence_vma(ctx, &u.f_decode_insn3214)) return true;
|
|
return false;
|
|
case 0x22000000:
|
|
/* 0010001. ........ .0000000 01110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:81 */
|
|
decode_insn32_extract_hfence_bvma(ctx, &u.f_decode_insn3214, insn);
|
|
if (trans_hfence_bvma(ctx, &u.f_decode_insn3214)) return true;
|
|
return false;
|
|
case 0x30000000:
|
|
/* 0011000. ........ .0000000 01110011 */
|
|
decode_insn32_extract_decode_insn32_Fmt_18(ctx, &u.f_empty, insn);
|
|
switch ((insn >> 15) & 0x3ff) {
|
|
case 0x40:
|
|
/* 00110000 00100000 00000000 01110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:78 */
|
|
if (trans_mret(ctx, &u.f_empty)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x62000000:
|
|
/* 0110001. ........ .0000000 01110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:80 */
|
|
decode_insn32_extract_hfence_gvma(ctx, &u.f_decode_insn3214, insn);
|
|
if (trans_hfence_gvma(ctx, &u.f_decode_insn3214)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
case 0x1:
|
|
/* ........ ........ .001.... .1110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:125 */
|
|
decode_insn32_extract_csr(ctx, &u.f_decode_insn329, insn);
|
|
if (trans_csrrw(ctx, &u.f_decode_insn329)) return true;
|
|
return false;
|
|
case 0x2:
|
|
/* ........ ........ .010.... .1110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:126 */
|
|
decode_insn32_extract_csr(ctx, &u.f_decode_insn329, insn);
|
|
if (trans_csrrs(ctx, &u.f_decode_insn329)) return true;
|
|
return false;
|
|
case 0x3:
|
|
/* ........ ........ .011.... .1110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:127 */
|
|
decode_insn32_extract_csr(ctx, &u.f_decode_insn329, insn);
|
|
if (trans_csrrc(ctx, &u.f_decode_insn329)) return true;
|
|
return false;
|
|
case 0x5:
|
|
/* ........ ........ .101.... .1110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:128 */
|
|
decode_insn32_extract_csr(ctx, &u.f_decode_insn329, insn);
|
|
if (trans_csrrwi(ctx, &u.f_decode_insn329)) return true;
|
|
return false;
|
|
case 0x6:
|
|
/* ........ ........ .110.... .1110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:129 */
|
|
decode_insn32_extract_csr(ctx, &u.f_decode_insn329, insn);
|
|
if (trans_csrrsi(ctx, &u.f_decode_insn329)) return true;
|
|
return false;
|
|
case 0x7:
|
|
/* ........ ........ .111.... .1110011 */
|
|
/* /home/me/projects/unicorn2/qemu-5.0.0-build/target/riscv/insn32.decode:130 */
|
|
decode_insn32_extract_csr(ctx, &u.f_decode_insn329, insn);
|
|
if (trans_csrrci(ctx, &u.f_decode_insn329)) return true;
|
|
return false;
|
|
}
|
|
return false;
|
|
}
|
|
return false;
|
|
}
|