mirror of https://github.com/xqemu/xqemu.git
Convert movr and (partially) movcc to TCG
git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@4010 c046a42c-6fe2-441c-8c8c-71466251a162
This commit is contained in:
parent
38bc628b08
commit
00f219bf50
|
@ -1589,12 +1589,6 @@ void OPPROTO op_fmovq_cc(void)
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void OPPROTO op_mov_cc(void)
|
|
||||||
{
|
|
||||||
if (T2)
|
|
||||||
T0 = T1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void OPPROTO op_flushw(void)
|
void OPPROTO op_flushw(void)
|
||||||
{
|
{
|
||||||
if (env->cansave != NWINDOWS - 2) {
|
if (env->cansave != NWINDOWS - 2) {
|
||||||
|
|
|
@ -577,6 +577,18 @@ static void gen_cond_reg(int cond)
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Inverted logic
|
||||||
|
static const int gen_tcg_cond_reg[8] = {
|
||||||
|
-1,
|
||||||
|
TCG_COND_NE,
|
||||||
|
TCG_COND_GT,
|
||||||
|
TCG_COND_GE,
|
||||||
|
-1,
|
||||||
|
TCG_COND_EQ,
|
||||||
|
TCG_COND_LE,
|
||||||
|
TCG_COND_LT,
|
||||||
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* XXX: potentially incorrect if dynamic npc */
|
/* XXX: potentially incorrect if dynamic npc */
|
||||||
|
@ -2452,15 +2464,9 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||||
{
|
{
|
||||||
int cc = GET_FIELD_SP(insn, 11, 12);
|
int cc = GET_FIELD_SP(insn, 11, 12);
|
||||||
int cond = GET_FIELD_SP(insn, 14, 17);
|
int cond = GET_FIELD_SP(insn, 14, 17);
|
||||||
if (IS_IMM) { /* immediate */
|
TCGv r_zero;
|
||||||
rs2 = GET_FIELD_SPs(insn, 0, 10);
|
int l1;
|
||||||
gen_movl_simm_T1(rs2);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
rs2 = GET_FIELD_SP(insn, 0, 4);
|
|
||||||
gen_movl_reg_T1(rs2);
|
|
||||||
}
|
|
||||||
gen_movl_reg_T0(rd);
|
|
||||||
flush_T2(dc);
|
flush_T2(dc);
|
||||||
if (insn & (1 << 18)) {
|
if (insn & (1 << 18)) {
|
||||||
if (cc == 0)
|
if (cc == 0)
|
||||||
|
@ -2472,8 +2478,21 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||||
} else {
|
} else {
|
||||||
gen_fcond[cc][cond]();
|
gen_fcond[cc][cond]();
|
||||||
}
|
}
|
||||||
gen_op_mov_cc();
|
|
||||||
gen_movl_T0_reg(rd);
|
l1 = gen_new_label();
|
||||||
|
|
||||||
|
r_zero = tcg_temp_new(TCG_TYPE_TL);
|
||||||
|
tcg_gen_movi_tl(r_zero, 0);
|
||||||
|
tcg_gen_brcond_tl(TCG_COND_EQ, cpu_T[2], r_zero, l1);
|
||||||
|
if (IS_IMM) { /* immediate */
|
||||||
|
rs2 = GET_FIELD_SPs(insn, 0, 10);
|
||||||
|
gen_movl_simm_T1(rs2);
|
||||||
|
} else {
|
||||||
|
rs2 = GET_FIELD_SP(insn, 0, 4);
|
||||||
|
gen_movl_reg_T1(rs2);
|
||||||
|
}
|
||||||
|
gen_movl_T1_reg(rd);
|
||||||
|
gen_set_label(l1);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case 0x2d: /* V9 sdivx */
|
case 0x2d: /* V9 sdivx */
|
||||||
|
@ -2498,21 +2517,26 @@ static void disas_sparc_insn(DisasContext * dc)
|
||||||
case 0x2f: /* V9 movr */
|
case 0x2f: /* V9 movr */
|
||||||
{
|
{
|
||||||
int cond = GET_FIELD_SP(insn, 10, 12);
|
int cond = GET_FIELD_SP(insn, 10, 12);
|
||||||
|
TCGv r_zero;
|
||||||
|
int l1;
|
||||||
|
|
||||||
rs1 = GET_FIELD(insn, 13, 17);
|
rs1 = GET_FIELD(insn, 13, 17);
|
||||||
flush_T2(dc);
|
|
||||||
gen_movl_reg_T0(rs1);
|
gen_movl_reg_T0(rs1);
|
||||||
gen_cond_reg(cond);
|
|
||||||
|
l1 = gen_new_label();
|
||||||
|
|
||||||
|
r_zero = tcg_temp_new(TCG_TYPE_TL);
|
||||||
|
tcg_gen_movi_tl(r_zero, 0);
|
||||||
|
tcg_gen_brcond_tl(gen_tcg_cond_reg[cond], cpu_T[0], r_zero, l1);
|
||||||
if (IS_IMM) { /* immediate */
|
if (IS_IMM) { /* immediate */
|
||||||
rs2 = GET_FIELD_SPs(insn, 0, 9);
|
rs2 = GET_FIELD_SPs(insn, 0, 9);
|
||||||
gen_movl_simm_T1(rs2);
|
gen_movl_simm_T1(rs2);
|
||||||
}
|
} else {
|
||||||
else {
|
|
||||||
rs2 = GET_FIELD_SP(insn, 0, 4);
|
rs2 = GET_FIELD_SP(insn, 0, 4);
|
||||||
gen_movl_reg_T1(rs2);
|
gen_movl_reg_T1(rs2);
|
||||||
}
|
}
|
||||||
gen_movl_reg_T0(rd);
|
gen_movl_T1_reg(rd);
|
||||||
gen_op_mov_cc();
|
gen_set_label(l1);
|
||||||
gen_movl_T0_reg(rd);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
Loading…
Reference in New Issue