mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-05 16:53:55 -06:00
target/openrisc: Add print_insn_or1k
Rather than emit disassembly while translating, reuse the generated decoder to build a separate disassembler. Reviewed-by: Philippe Mathieu-Daudé <f4bug@amsat.org> Signed-off-by: Richard Henderson <richard.henderson@linaro.org> Signed-off-by: Stafford Horne <shorne@gmail.com>
This commit is contained in:
parent
c3513c836e
commit
d5cabcce62
5 changed files with 179 additions and 115 deletions
|
@ -36,10 +36,6 @@
|
|||
#include "trace-tcg.h"
|
||||
#include "exec/log.h"
|
||||
|
||||
#define LOG_DIS(str, ...) \
|
||||
qemu_log_mask(CPU_LOG_TB_IN_ASM, "%08x: " str, dc->base.pc_next, \
|
||||
## __VA_ARGS__)
|
||||
|
||||
/* is_jmp field values */
|
||||
#define DISAS_JUMP DISAS_TARGET_0 /* only pc was modified dynamically */
|
||||
#define DISAS_UPDATE DISAS_TARGET_1 /* cpu state was modified dynamically */
|
||||
|
@ -457,7 +453,6 @@ static void gen_msbu(DisasContext *dc, TCGv srca, TCGv srcb)
|
|||
|
||||
static bool trans_l_add(DisasContext *dc, arg_dab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.add r%d, r%d, r%d\n", a->d, a->a, a->b);
|
||||
check_r0_write(a->d);
|
||||
gen_add(dc, cpu_R[a->d], cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
|
@ -465,7 +460,6 @@ static bool trans_l_add(DisasContext *dc, arg_dab *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_addc(DisasContext *dc, arg_dab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.addc r%d, r%d, r%d\n", a->d, a->a, a->b);
|
||||
check_r0_write(a->d);
|
||||
gen_addc(dc, cpu_R[a->d], cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
|
@ -473,7 +467,6 @@ static bool trans_l_addc(DisasContext *dc, arg_dab *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_sub(DisasContext *dc, arg_dab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.sub r%d, r%d, r%d\n", a->d, a->a, a->b);
|
||||
check_r0_write(a->d);
|
||||
gen_sub(dc, cpu_R[a->d], cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
|
@ -481,7 +474,6 @@ static bool trans_l_sub(DisasContext *dc, arg_dab *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_and(DisasContext *dc, arg_dab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.and r%d, r%d, r%d\n", a->d, a->a, a->b);
|
||||
check_r0_write(a->d);
|
||||
tcg_gen_and_tl(cpu_R[a->d], cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
|
@ -489,7 +481,6 @@ static bool trans_l_and(DisasContext *dc, arg_dab *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_or(DisasContext *dc, arg_dab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.or r%d, r%d, r%d\n", a->d, a->a, a->b);
|
||||
check_r0_write(a->d);
|
||||
tcg_gen_or_tl(cpu_R[a->d], cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
|
@ -497,7 +488,6 @@ static bool trans_l_or(DisasContext *dc, arg_dab *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_xor(DisasContext *dc, arg_dab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.xor r%d, r%d, r%d\n", a->d, a->a, a->b);
|
||||
check_r0_write(a->d);
|
||||
tcg_gen_xor_tl(cpu_R[a->d], cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
|
@ -505,7 +495,6 @@ static bool trans_l_xor(DisasContext *dc, arg_dab *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_sll(DisasContext *dc, arg_dab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.sll r%d, r%d, r%d\n", a->d, a->a, a->b);
|
||||
check_r0_write(a->d);
|
||||
tcg_gen_shl_tl(cpu_R[a->d], cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
|
@ -513,7 +502,6 @@ static bool trans_l_sll(DisasContext *dc, arg_dab *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_srl(DisasContext *dc, arg_dab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.srl r%d, r%d, r%d\n", a->d, a->a, a->b);
|
||||
check_r0_write(a->d);
|
||||
tcg_gen_shr_tl(cpu_R[a->d], cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
|
@ -521,7 +509,6 @@ static bool trans_l_srl(DisasContext *dc, arg_dab *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_sra(DisasContext *dc, arg_dab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.sra r%d, r%d, r%d\n", a->d, a->a, a->b);
|
||||
check_r0_write(a->d);
|
||||
tcg_gen_sar_tl(cpu_R[a->d], cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
|
@ -529,7 +516,6 @@ static bool trans_l_sra(DisasContext *dc, arg_dab *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_ror(DisasContext *dc, arg_dab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.ror r%d, r%d, r%d\n", a->d, a->a, a->b);
|
||||
check_r0_write(a->d);
|
||||
tcg_gen_rotr_tl(cpu_R[a->d], cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
|
@ -537,7 +523,6 @@ static bool trans_l_ror(DisasContext *dc, arg_dab *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_exths(DisasContext *dc, arg_da *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.exths r%d, r%d\n", a->d, a->a);
|
||||
check_r0_write(a->d);
|
||||
tcg_gen_ext16s_tl(cpu_R[a->d], cpu_R[a->a]);
|
||||
return true;
|
||||
|
@ -545,7 +530,6 @@ static bool trans_l_exths(DisasContext *dc, arg_da *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_extbs(DisasContext *dc, arg_da *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.extbs r%d, r%d\n", a->d, a->a);
|
||||
check_r0_write(a->d);
|
||||
tcg_gen_ext8s_tl(cpu_R[a->d], cpu_R[a->a]);
|
||||
return true;
|
||||
|
@ -553,7 +537,6 @@ static bool trans_l_extbs(DisasContext *dc, arg_da *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_exthz(DisasContext *dc, arg_da *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.exthz r%d, r%d\n", a->d, a->a);
|
||||
check_r0_write(a->d);
|
||||
tcg_gen_ext16u_tl(cpu_R[a->d], cpu_R[a->a]);
|
||||
return true;
|
||||
|
@ -561,7 +544,6 @@ static bool trans_l_exthz(DisasContext *dc, arg_da *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_extbz(DisasContext *dc, arg_da *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.extbz r%d, r%d\n", a->d, a->a);
|
||||
check_r0_write(a->d);
|
||||
tcg_gen_ext8u_tl(cpu_R[a->d], cpu_R[a->a]);
|
||||
return true;
|
||||
|
@ -570,7 +552,6 @@ static bool trans_l_extbz(DisasContext *dc, arg_da *a, uint32_t insn)
|
|||
static bool trans_l_cmov(DisasContext *dc, arg_dab *a, uint32_t insn)
|
||||
{
|
||||
TCGv zero;
|
||||
LOG_DIS("l.cmov r%d, r%d, r%d\n", a->d, a->a, a->b);
|
||||
|
||||
check_r0_write(a->d);
|
||||
zero = tcg_const_tl(0);
|
||||
|
@ -582,8 +563,6 @@ static bool trans_l_cmov(DisasContext *dc, arg_dab *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_ff1(DisasContext *dc, arg_da *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.ff1 r%d, r%d\n", a->d, a->a);
|
||||
|
||||
check_r0_write(a->d);
|
||||
tcg_gen_ctzi_tl(cpu_R[a->d], cpu_R[a->a], -1);
|
||||
tcg_gen_addi_tl(cpu_R[a->d], cpu_R[a->d], 1);
|
||||
|
@ -592,8 +571,6 @@ static bool trans_l_ff1(DisasContext *dc, arg_da *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_fl1(DisasContext *dc, arg_da *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.fl1 r%d, r%d\n", a->d, a->a);
|
||||
|
||||
check_r0_write(a->d);
|
||||
tcg_gen_clzi_tl(cpu_R[a->d], cpu_R[a->a], TARGET_LONG_BITS);
|
||||
tcg_gen_subfi_tl(cpu_R[a->d], TARGET_LONG_BITS, cpu_R[a->d]);
|
||||
|
@ -602,8 +579,6 @@ static bool trans_l_fl1(DisasContext *dc, arg_da *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_mul(DisasContext *dc, arg_dab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.mul r%d, r%d, r%d\n", a->d, a->a, a->b);
|
||||
|
||||
check_r0_write(a->d);
|
||||
gen_mul(dc, cpu_R[a->d], cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
|
@ -611,8 +586,6 @@ static bool trans_l_mul(DisasContext *dc, arg_dab *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_mulu(DisasContext *dc, arg_dab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.mulu r%d, r%d, r%d\n", a->d, a->a, a->b);
|
||||
|
||||
check_r0_write(a->d);
|
||||
gen_mulu(dc, cpu_R[a->d], cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
|
@ -620,8 +593,6 @@ static bool trans_l_mulu(DisasContext *dc, arg_dab *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_div(DisasContext *dc, arg_dab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.div r%d, r%d, r%d\n", a->d, a->a, a->b);
|
||||
|
||||
check_r0_write(a->d);
|
||||
gen_div(dc, cpu_R[a->d], cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
|
@ -629,8 +600,6 @@ static bool trans_l_div(DisasContext *dc, arg_dab *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_divu(DisasContext *dc, arg_dab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.divu r%d, r%d, r%d\n", a->d, a->a, a->b);
|
||||
|
||||
check_r0_write(a->d);
|
||||
gen_divu(dc, cpu_R[a->d], cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
|
@ -638,14 +607,12 @@ static bool trans_l_divu(DisasContext *dc, arg_dab *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_muld(DisasContext *dc, arg_ab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.muld r%d, r%d\n", a->a, a->b);
|
||||
gen_muld(dc, cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_muldu(DisasContext *dc, arg_ab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.muldu r%d, r%d\n", a->a, a->b);
|
||||
gen_muldu(dc, cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
}
|
||||
|
@ -654,7 +621,6 @@ static bool trans_l_j(DisasContext *dc, arg_l_j *a, uint32_t insn)
|
|||
{
|
||||
target_ulong tmp_pc = dc->base.pc_next + a->n * 4;
|
||||
|
||||
LOG_DIS("l.j %d\n", a->n);
|
||||
tcg_gen_movi_tl(jmp_pc, tmp_pc);
|
||||
dc->delayed_branch = 2;
|
||||
return true;
|
||||
|
@ -665,7 +631,6 @@ static bool trans_l_jal(DisasContext *dc, arg_l_jal *a, uint32_t insn)
|
|||
target_ulong tmp_pc = dc->base.pc_next + a->n * 4;
|
||||
target_ulong ret_pc = dc->base.pc_next + 8;
|
||||
|
||||
LOG_DIS("l.jal %d\n", a->n);
|
||||
tcg_gen_movi_tl(cpu_R[9], ret_pc);
|
||||
/* Optimize jal being used to load the PC for PIC. */
|
||||
if (tmp_pc != ret_pc) {
|
||||
|
@ -692,21 +657,18 @@ static void do_bf(DisasContext *dc, arg_l_bf *a, TCGCond cond)
|
|||
|
||||
static bool trans_l_bf(DisasContext *dc, arg_l_bf *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.bf %d\n", a->n);
|
||||
do_bf(dc, a, TCG_COND_NE);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_bnf(DisasContext *dc, arg_l_bf *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.bnf %d\n", a->n);
|
||||
do_bf(dc, a, TCG_COND_EQ);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_jr(DisasContext *dc, arg_l_jr *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.jr r%d\n", a->b);
|
||||
tcg_gen_mov_tl(jmp_pc, cpu_R[a->b]);
|
||||
dc->delayed_branch = 2;
|
||||
return true;
|
||||
|
@ -714,7 +676,6 @@ static bool trans_l_jr(DisasContext *dc, arg_l_jr *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_jalr(DisasContext *dc, arg_l_jalr *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.jalr r%d\n", a->b);
|
||||
tcg_gen_mov_tl(jmp_pc, cpu_R[a->b]);
|
||||
tcg_gen_movi_tl(cpu_R[9], dc->base.pc_next + 8);
|
||||
dc->delayed_branch = 2;
|
||||
|
@ -725,8 +686,6 @@ static bool trans_l_lwa(DisasContext *dc, arg_load *a, uint32_t insn)
|
|||
{
|
||||
TCGv ea;
|
||||
|
||||
LOG_DIS("l.lwa r%d, r%d, %d\n", a->d, a->a, a->i);
|
||||
|
||||
check_r0_write(a->d);
|
||||
ea = tcg_temp_new();
|
||||
tcg_gen_addi_tl(ea, cpu_R[a->a], a->i);
|
||||
|
@ -750,42 +709,36 @@ static void do_load(DisasContext *dc, arg_load *a, TCGMemOp mop)
|
|||
|
||||
static bool trans_l_lwz(DisasContext *dc, arg_load *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.lwz r%d, r%d, %d\n", a->d, a->a, a->i);
|
||||
do_load(dc, a, MO_TEUL);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_lws(DisasContext *dc, arg_load *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.lws r%d, r%d, %d\n", a->d, a->a, a->i);
|
||||
do_load(dc, a, MO_TESL);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_lbz(DisasContext *dc, arg_load *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.lbz r%d, r%d, %d\n", a->d, a->a, a->i);
|
||||
do_load(dc, a, MO_UB);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_lbs(DisasContext *dc, arg_load *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.lbs r%d, r%d, %d\n", a->d, a->a, a->i);
|
||||
do_load(dc, a, MO_SB);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_lhz(DisasContext *dc, arg_load *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.lhz r%d, r%d, %d\n", a->d, a->a, a->i);
|
||||
do_load(dc, a, MO_TEUW);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_lhs(DisasContext *dc, arg_load *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.lhs r%d, r%d, %d\n", a->d, a->a, a->i);
|
||||
do_load(dc, a, MO_TESW);
|
||||
return true;
|
||||
}
|
||||
|
@ -795,8 +748,6 @@ static bool trans_l_swa(DisasContext *dc, arg_store *a, uint32_t insn)
|
|||
TCGv ea, val;
|
||||
TCGLabel *lab_fail, *lab_done;
|
||||
|
||||
LOG_DIS("l.swa r%d, r%d, %d\n", a->a, a->b, a->i);
|
||||
|
||||
ea = tcg_temp_new();
|
||||
tcg_gen_addi_tl(ea, cpu_R[a->a], a->i);
|
||||
|
||||
|
@ -837,28 +788,24 @@ static void do_store(DisasContext *dc, arg_store *a, TCGMemOp mop)
|
|||
|
||||
static bool trans_l_sw(DisasContext *dc, arg_store *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.sw r%d, r%d, %d\n", a->a, a->b, a->i);
|
||||
do_store(dc, a, MO_TEUL);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_sb(DisasContext *dc, arg_store *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.sb r%d, r%d, %d\n", a->a, a->b, a->i);
|
||||
do_store(dc, a, MO_UB);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_sh(DisasContext *dc, arg_store *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.sh r%d, r%d, %d\n", a->a, a->b, a->i);
|
||||
do_store(dc, a, MO_TEUW);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_nop(DisasContext *dc, arg_l_nop *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.nop %d\n", a->k);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
@ -866,7 +813,6 @@ static bool trans_l_addi(DisasContext *dc, arg_rri *a, uint32_t insn)
|
|||
{
|
||||
TCGv t0;
|
||||
|
||||
LOG_DIS("l.addi r%d, r%d, %d\n", a->d, a->a, a->i);
|
||||
check_r0_write(a->d);
|
||||
t0 = tcg_const_tl(a->i);
|
||||
gen_add(dc, cpu_R[a->d], cpu_R[a->a], t0);
|
||||
|
@ -878,7 +824,6 @@ static bool trans_l_addic(DisasContext *dc, arg_rri *a, uint32_t insn)
|
|||
{
|
||||
TCGv t0;
|
||||
|
||||
LOG_DIS("l.addic r%d, r%d, %d\n", a->d, a->a, a->i);
|
||||
check_r0_write(a->d);
|
||||
t0 = tcg_const_tl(a->i);
|
||||
gen_addc(dc, cpu_R[a->d], cpu_R[a->a], t0);
|
||||
|
@ -890,7 +835,6 @@ static bool trans_l_muli(DisasContext *dc, arg_rri *a, uint32_t insn)
|
|||
{
|
||||
TCGv t0;
|
||||
|
||||
LOG_DIS("l.muli r%d, r%d, %d\n", a->d, a->a, a->i);
|
||||
check_r0_write(a->d);
|
||||
t0 = tcg_const_tl(a->i);
|
||||
gen_mul(dc, cpu_R[a->d], cpu_R[a->a], t0);
|
||||
|
@ -902,7 +846,6 @@ static bool trans_l_maci(DisasContext *dc, arg_l_maci *a, uint32_t insn)
|
|||
{
|
||||
TCGv t0;
|
||||
|
||||
LOG_DIS("l.maci r%d, %d\n", a->a, a->i);
|
||||
t0 = tcg_const_tl(a->i);
|
||||
gen_mac(dc, cpu_R[a->a], t0);
|
||||
tcg_temp_free(t0);
|
||||
|
@ -911,7 +854,6 @@ static bool trans_l_maci(DisasContext *dc, arg_l_maci *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_andi(DisasContext *dc, arg_rrk *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.andi r%d, r%d, %d\n", a->d, a->a, a->k);
|
||||
check_r0_write(a->d);
|
||||
tcg_gen_andi_tl(cpu_R[a->d], cpu_R[a->a], a->k);
|
||||
return true;
|
||||
|
@ -919,7 +861,6 @@ static bool trans_l_andi(DisasContext *dc, arg_rrk *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_ori(DisasContext *dc, arg_rrk *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.ori r%d, r%d, %d\n", a->d, a->a, a->k);
|
||||
check_r0_write(a->d);
|
||||
tcg_gen_ori_tl(cpu_R[a->d], cpu_R[a->a], a->k);
|
||||
return true;
|
||||
|
@ -927,7 +868,6 @@ static bool trans_l_ori(DisasContext *dc, arg_rrk *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_xori(DisasContext *dc, arg_rri *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.xori r%d, r%d, %d\n", a->d, a->a, a->i);
|
||||
check_r0_write(a->d);
|
||||
tcg_gen_xori_tl(cpu_R[a->d], cpu_R[a->a], a->i);
|
||||
return true;
|
||||
|
@ -935,7 +875,6 @@ static bool trans_l_xori(DisasContext *dc, arg_rri *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_mfspr(DisasContext *dc, arg_l_mfspr *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.mfspr r%d, r%d, %d\n", a->d, a->a, a->k);
|
||||
check_r0_write(a->d);
|
||||
|
||||
#ifdef CONFIG_USER_ONLY
|
||||
|
@ -954,8 +893,6 @@ static bool trans_l_mfspr(DisasContext *dc, arg_l_mfspr *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_mtspr(DisasContext *dc, arg_l_mtspr *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.mtspr r%d, r%d, %d\n", a->a, a->b, a->k);
|
||||
|
||||
#ifdef CONFIG_USER_ONLY
|
||||
gen_illegal_exception(dc);
|
||||
#else
|
||||
|
@ -972,35 +909,30 @@ static bool trans_l_mtspr(DisasContext *dc, arg_l_mtspr *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_mac(DisasContext *dc, arg_ab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.mac r%d, r%d\n", a->a, a->b);
|
||||
gen_mac(dc, cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_msb(DisasContext *dc, arg_ab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.msb r%d, r%d\n", a->a, a->b);
|
||||
gen_msb(dc, cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_macu(DisasContext *dc, arg_ab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.mac r%d, r%d\n", a->a, a->b);
|
||||
gen_macu(dc, cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_msbu(DisasContext *dc, arg_ab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.msb r%d, r%d\n", a->a, a->b);
|
||||
gen_msbu(dc, cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_slli(DisasContext *dc, arg_dal *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.slli r%d, r%d, %d\n", a->d, a->a, a->l);
|
||||
check_r0_write(a->d);
|
||||
tcg_gen_shli_tl(cpu_R[a->d], cpu_R[a->a], a->l & (TARGET_LONG_BITS - 1));
|
||||
return true;
|
||||
|
@ -1008,7 +940,6 @@ static bool trans_l_slli(DisasContext *dc, arg_dal *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_srli(DisasContext *dc, arg_dal *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.srli r%d, r%d, %d\n", a->d, a->a, a->l);
|
||||
check_r0_write(a->d);
|
||||
tcg_gen_shri_tl(cpu_R[a->d], cpu_R[a->a], a->l & (TARGET_LONG_BITS - 1));
|
||||
return true;
|
||||
|
@ -1016,7 +947,6 @@ static bool trans_l_srli(DisasContext *dc, arg_dal *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_srai(DisasContext *dc, arg_dal *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.srai r%d, r%d, %d\n", a->d, a->a, a->l);
|
||||
check_r0_write(a->d);
|
||||
tcg_gen_sari_tl(cpu_R[a->d], cpu_R[a->a], a->l & (TARGET_LONG_BITS - 1));
|
||||
return true;
|
||||
|
@ -1024,7 +954,6 @@ static bool trans_l_srai(DisasContext *dc, arg_dal *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_rori(DisasContext *dc, arg_dal *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.rori r%d, r%d, %d\n", a->d, a->a, a->l);
|
||||
check_r0_write(a->d);
|
||||
tcg_gen_rotri_tl(cpu_R[a->d], cpu_R[a->a], a->l & (TARGET_LONG_BITS - 1));
|
||||
return true;
|
||||
|
@ -1032,7 +961,6 @@ static bool trans_l_rori(DisasContext *dc, arg_dal *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_movhi(DisasContext *dc, arg_l_movhi *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.movhi r%d, %d\n", a->d, a->k);
|
||||
check_r0_write(a->d);
|
||||
tcg_gen_movi_tl(cpu_R[a->d], a->k << 16);
|
||||
return true;
|
||||
|
@ -1040,7 +968,6 @@ static bool trans_l_movhi(DisasContext *dc, arg_l_movhi *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_macrc(DisasContext *dc, arg_l_macrc *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.macrc r%d\n", a->d);
|
||||
check_r0_write(a->d);
|
||||
tcg_gen_trunc_i64_tl(cpu_R[a->d], cpu_mac);
|
||||
tcg_gen_movi_i64(cpu_mac, 0);
|
||||
|
@ -1049,147 +976,126 @@ static bool trans_l_macrc(DisasContext *dc, arg_l_macrc *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_sfeq(DisasContext *dc, arg_ab *a, TCGCond cond)
|
||||
{
|
||||
LOG_DIS("l.sfeq r%d, r%d\n", a->a, a->b);
|
||||
tcg_gen_setcond_tl(TCG_COND_EQ, cpu_sr_f, cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_sfne(DisasContext *dc, arg_ab *a, TCGCond cond)
|
||||
{
|
||||
LOG_DIS("l.sfne r%d, r%d\n", a->a, a->b);
|
||||
tcg_gen_setcond_tl(TCG_COND_NE, cpu_sr_f, cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_sfgtu(DisasContext *dc, arg_ab *a, TCGCond cond)
|
||||
{
|
||||
LOG_DIS("l.sfgtu r%d, r%d\n", a->a, a->b);
|
||||
tcg_gen_setcond_tl(TCG_COND_GTU, cpu_sr_f, cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_sfgeu(DisasContext *dc, arg_ab *a, TCGCond cond)
|
||||
{
|
||||
LOG_DIS("l.sfgeu r%d, r%d\n", a->a, a->b);
|
||||
tcg_gen_setcond_tl(TCG_COND_GEU, cpu_sr_f, cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_sfltu(DisasContext *dc, arg_ab *a, TCGCond cond)
|
||||
{
|
||||
LOG_DIS("l.sfltu r%d, r%d\n", a->a, a->b);
|
||||
tcg_gen_setcond_tl(TCG_COND_LTU, cpu_sr_f, cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_sfleu(DisasContext *dc, arg_ab *a, TCGCond cond)
|
||||
{
|
||||
LOG_DIS("l.sfleu r%d, r%d\n", a->a, a->b);
|
||||
tcg_gen_setcond_tl(TCG_COND_LEU, cpu_sr_f, cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_sfgts(DisasContext *dc, arg_ab *a, TCGCond cond)
|
||||
{
|
||||
LOG_DIS("l.sfgts r%d, r%d\n", a->a, a->b);
|
||||
tcg_gen_setcond_tl(TCG_COND_GT, cpu_sr_f, cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_sfges(DisasContext *dc, arg_ab *a, TCGCond cond)
|
||||
{
|
||||
LOG_DIS("l.sfges r%d, r%d\n", a->a, a->b);
|
||||
tcg_gen_setcond_tl(TCG_COND_GE, cpu_sr_f, cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_sflts(DisasContext *dc, arg_ab *a, TCGCond cond)
|
||||
{
|
||||
LOG_DIS("l.sflts r%d, r%d\n", a->a, a->b);
|
||||
tcg_gen_setcond_tl(TCG_COND_LT, cpu_sr_f, cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_sfles(DisasContext *dc, arg_ab *a, TCGCond cond)
|
||||
{
|
||||
LOG_DIS("l.sfles r%d, r%d\n", a->a, a->b);
|
||||
tcg_gen_setcond_tl(TCG_COND_LE, cpu_sr_f, cpu_R[a->a], cpu_R[a->b]);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_sfeqi(DisasContext *dc, arg_ai *a, TCGCond cond)
|
||||
{
|
||||
LOG_DIS("l.sfeqi r%d, %d\n", a->a, a->i);
|
||||
tcg_gen_setcondi_tl(TCG_COND_EQ, cpu_sr_f, cpu_R[a->a], a->i);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_sfnei(DisasContext *dc, arg_ai *a, TCGCond cond)
|
||||
{
|
||||
LOG_DIS("l.sfnei r%d, %d\n", a->a, a->i);
|
||||
tcg_gen_setcondi_tl(TCG_COND_NE, cpu_sr_f, cpu_R[a->a], a->i);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_sfgtui(DisasContext *dc, arg_ai *a, TCGCond cond)
|
||||
{
|
||||
LOG_DIS("l.sfgtui r%d, %d\n", a->a, a->i);
|
||||
tcg_gen_setcondi_tl(TCG_COND_GTU, cpu_sr_f, cpu_R[a->a], a->i);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_sfgeui(DisasContext *dc, arg_ai *a, TCGCond cond)
|
||||
{
|
||||
LOG_DIS("l.sfgeui r%d, %d\n", a->a, a->i);
|
||||
tcg_gen_setcondi_tl(TCG_COND_GEU, cpu_sr_f, cpu_R[a->a], a->i);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_sfltui(DisasContext *dc, arg_ai *a, TCGCond cond)
|
||||
{
|
||||
LOG_DIS("l.sfltui r%d, %d\n", a->a, a->i);
|
||||
tcg_gen_setcondi_tl(TCG_COND_LTU, cpu_sr_f, cpu_R[a->a], a->i);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_sfleui(DisasContext *dc, arg_ai *a, TCGCond cond)
|
||||
{
|
||||
LOG_DIS("l.sfleui r%d, %d\n", a->a, a->i);
|
||||
tcg_gen_setcondi_tl(TCG_COND_LEU, cpu_sr_f, cpu_R[a->a], a->i);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_sfgtsi(DisasContext *dc, arg_ai *a, TCGCond cond)
|
||||
{
|
||||
LOG_DIS("l.sfgtsi r%d, %d\n", a->a, a->i);
|
||||
tcg_gen_setcondi_tl(TCG_COND_GT, cpu_sr_f, cpu_R[a->a], a->i);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_sfgesi(DisasContext *dc, arg_ai *a, TCGCond cond)
|
||||
{
|
||||
LOG_DIS("l.sfgesi r%d, %d\n", a->a, a->i);
|
||||
tcg_gen_setcondi_tl(TCG_COND_GE, cpu_sr_f, cpu_R[a->a], a->i);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_sfltsi(DisasContext *dc, arg_ai *a, TCGCond cond)
|
||||
{
|
||||
LOG_DIS("l.sfltsi r%d, %d\n", a->a, a->i);
|
||||
tcg_gen_setcondi_tl(TCG_COND_LT, cpu_sr_f, cpu_R[a->a], a->i);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_sflesi(DisasContext *dc, arg_ai *a, TCGCond cond)
|
||||
{
|
||||
LOG_DIS("l.sflesi r%d, %d\n", a->a, a->i);
|
||||
tcg_gen_setcondi_tl(TCG_COND_LE, cpu_sr_f, cpu_R[a->a], a->i);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_sys(DisasContext *dc, arg_l_sys *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.sys %d\n", a->k);
|
||||
tcg_gen_movi_tl(cpu_pc, dc->base.pc_next);
|
||||
gen_exception(dc, EXCP_SYSCALL);
|
||||
dc->base.is_jmp = DISAS_NORETURN;
|
||||
|
@ -1198,7 +1104,6 @@ static bool trans_l_sys(DisasContext *dc, arg_l_sys *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_trap(DisasContext *dc, arg_l_trap *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.trap %d\n", a->k);
|
||||
tcg_gen_movi_tl(cpu_pc, dc->base.pc_next);
|
||||
gen_exception(dc, EXCP_TRAP);
|
||||
dc->base.is_jmp = DISAS_NORETURN;
|
||||
|
@ -1207,27 +1112,22 @@ static bool trans_l_trap(DisasContext *dc, arg_l_trap *a, uint32_t insn)
|
|||
|
||||
static bool trans_l_msync(DisasContext *dc, arg_l_msync *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.msync\n");
|
||||
tcg_gen_mb(TCG_MO_ALL);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_psync(DisasContext *dc, arg_l_psync *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.psync\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_csync(DisasContext *dc, arg_l_csync *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.csync\n");
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_l_rfe(DisasContext *dc, arg_l_rfe *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("l.rfe\n");
|
||||
|
||||
#ifdef CONFIG_USER_ONLY
|
||||
gen_illegal_exception(dc);
|
||||
#else
|
||||
|
@ -1274,56 +1174,48 @@ static void do_fpcmp(DisasContext *dc, arg_ab *a,
|
|||
|
||||
static bool trans_lf_add_s(DisasContext *dc, arg_dab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("lf.add.s r%d, r%d, r%d\n", a->d, a->a, a->b);
|
||||
do_fp3(dc, a, gen_helper_float_add_s);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_lf_sub_s(DisasContext *dc, arg_dab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("lf.sub.s r%d, r%d, r%d\n", a->d, a->a, a->b);
|
||||
do_fp3(dc, a, gen_helper_float_sub_s);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_lf_mul_s(DisasContext *dc, arg_dab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("lf.mul.s r%d, r%d, r%d\n", a->d, a->a, a->b);
|
||||
do_fp3(dc, a, gen_helper_float_mul_s);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_lf_div_s(DisasContext *dc, arg_dab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("lf.div.s r%d, r%d, r%d\n", a->d, a->a, a->b);
|
||||
do_fp3(dc, a, gen_helper_float_div_s);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_lf_rem_s(DisasContext *dc, arg_dab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("lf.rem.s r%d, r%d, r%d\n", a->d, a->a, a->b);
|
||||
do_fp3(dc, a, gen_helper_float_rem_s);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_lf_itof_s(DisasContext *dc, arg_da *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("lf.itof.s r%d, r%d\n", a->d, a->a);
|
||||
do_fp2(dc, a, gen_helper_itofs);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_lf_ftoi_s(DisasContext *dc, arg_da *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("lf.ftoi.s r%d, r%d\n", a->d, a->a);
|
||||
do_fp2(dc, a, gen_helper_ftois);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_lf_madd_s(DisasContext *dc, arg_dab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("lf.madd.s r%d, r%d, r%d\n", a->d, a->a, a->b);
|
||||
check_r0_write(a->d);
|
||||
gen_helper_float_madd_s(cpu_R[a->d], cpu_env, cpu_R[a->d],
|
||||
cpu_R[a->a], cpu_R[a->b]);
|
||||
|
@ -1333,42 +1225,36 @@ static bool trans_lf_madd_s(DisasContext *dc, arg_dab *a, uint32_t insn)
|
|||
|
||||
static bool trans_lf_sfeq_s(DisasContext *dc, arg_ab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("lf.sfeq.s r%d, r%d\n", a->a, a->b);
|
||||
do_fpcmp(dc, a, gen_helper_float_eq_s, false, false);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_lf_sfne_s(DisasContext *dc, arg_ab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("lf.sfne.s r%d, r%d\n", a->a, a->b);
|
||||
do_fpcmp(dc, a, gen_helper_float_eq_s, true, false);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_lf_sfgt_s(DisasContext *dc, arg_ab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("lf.sfgt.s r%d, r%d\n", a->a, a->b);
|
||||
do_fpcmp(dc, a, gen_helper_float_lt_s, false, true);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_lf_sfge_s(DisasContext *dc, arg_ab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("lf.sfge.s r%d, r%d\n", a->a, a->b);
|
||||
do_fpcmp(dc, a, gen_helper_float_le_s, false, true);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_lf_sflt_s(DisasContext *dc, arg_ab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("lf.sflt.s r%d, r%d\n", a->a, a->b);
|
||||
do_fpcmp(dc, a, gen_helper_float_lt_s, false, false);
|
||||
return true;
|
||||
}
|
||||
|
||||
static bool trans_lf_sfle_s(DisasContext *dc, arg_ab *a, uint32_t insn)
|
||||
{
|
||||
LOG_DIS("lf.sfle.s r%d, r%d\n", a->a, a->b);
|
||||
do_fpcmp(dc, a, gen_helper_float_le_s, false, false);
|
||||
return true;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue