target/sparc: Move POPC to decodetree
Tested-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Acked-by: Mark Cave-Ayland <mark.cave-ayland@ilande.co.uk> Signed-off-by: Richard Henderson <richard.henderson@linaro.org>
This commit is contained in:
parent
fb4ed7aad4
commit
9c6ec5bcad
@ -183,6 +183,9 @@ TSUBcc 10 ..... 100001 ..... . ............. @r_r_ri_cc1
|
||||
TADDccTV 10 ..... 100010 ..... . ............. @r_r_ri_cc1
|
||||
TSUBccTV 10 ..... 100011 ..... . ............. @r_r_ri_cc1
|
||||
|
||||
POPC 10 rd:5 101110 00000 imm:1 rs2_or_imm:s13 \
|
||||
&r_r_ri_cc rs1=0 cc=0
|
||||
|
||||
&shiftr rd rs1 rs2 x:bool
|
||||
@shiftr .. rd:5 ...... rs1:5 . x:1 ....... rs2:5 &shiftr
|
||||
|
||||
|
@ -740,6 +740,11 @@ static void gen_op_tsubcctv(TCGv dst, TCGv src1, TCGv src2)
|
||||
gen_helper_tsubcctv(dst, tcg_env, src1, src2);
|
||||
}
|
||||
|
||||
static void gen_op_popc(TCGv dst, TCGv src1, TCGv src2)
|
||||
{
|
||||
tcg_gen_ctpop_tl(dst, src2);
|
||||
}
|
||||
|
||||
// 1
|
||||
static void gen_op_eval_ba(TCGv dst)
|
||||
{
|
||||
@ -2733,19 +2738,6 @@ static TCGv get_src1(DisasContext *dc, unsigned int insn)
|
||||
return gen_load_gpr(dc, rs1);
|
||||
}
|
||||
|
||||
static TCGv get_src2(DisasContext *dc, unsigned int insn)
|
||||
{
|
||||
if (IS_IMM) { /* immediate */
|
||||
target_long simm = GET_FIELDs(insn, 19, 31);
|
||||
TCGv t = tcg_temp_new();
|
||||
tcg_gen_movi_tl(t, simm);
|
||||
return t;
|
||||
} else { /* register */
|
||||
unsigned int rs2 = GET_FIELD(insn, 27, 31);
|
||||
return gen_load_gpr(dc, rs2);
|
||||
}
|
||||
}
|
||||
|
||||
#ifdef TARGET_SPARC64
|
||||
static void gen_fmovs(DisasContext *dc, DisasCompare *cmp, int rd, int rs)
|
||||
{
|
||||
@ -4176,6 +4168,9 @@ TRANS(SDIVX, 64, do_arith, a, -1, gen_op_sdivx, NULL, NULL)
|
||||
TRANS(UDIV, DIV, do_arith, a, CC_OP_DIV, gen_op_udiv, NULL, gen_op_udivcc)
|
||||
TRANS(SDIV, DIV, do_arith, a, CC_OP_DIV, gen_op_sdiv, NULL, gen_op_sdivcc)
|
||||
|
||||
/* TODO: Should have feature bit -- comes in with UltraSparc T2. */
|
||||
TRANS(POPC, 64, do_arith, a, -1, gen_op_popc, NULL, NULL)
|
||||
|
||||
static bool trans_OR(DisasContext *dc, arg_r_r_ri_cc *a)
|
||||
{
|
||||
/* OR with %g0 is the canonical alias for MOV. */
|
||||
@ -4731,40 +4726,7 @@ static void disas_sparc_legacy(DisasContext *dc, unsigned int insn)
|
||||
goto illegal_insn;
|
||||
}
|
||||
} else if (xop < 0x36) {
|
||||
if (xop < 0x20) {
|
||||
goto illegal_insn;
|
||||
} else {
|
||||
cpu_src1 = get_src1(dc, insn);
|
||||
cpu_src2 = get_src2(dc, insn);
|
||||
switch (xop) {
|
||||
case 0x20: /* taddcc */
|
||||
case 0x21: /* tsubcc */
|
||||
case 0x22: /* taddcctv */
|
||||
case 0x23: /* tsubcctv */
|
||||
case 0x24: /* mulscc */
|
||||
case 0x25: /* sll */
|
||||
case 0x26: /* srl */
|
||||
case 0x27: /* sra */
|
||||
goto illegal_insn; /* in decodetree */
|
||||
case 0x30:
|
||||
goto illegal_insn; /* WRASR in decodetree */
|
||||
case 0x32:
|
||||
goto illegal_insn; /* WRPR in decodetree */
|
||||
case 0x33: /* wrtbr, UA2005 wrhpr */
|
||||
goto illegal_insn; /* WRTBR, WRHPR in decodetree */
|
||||
#ifdef TARGET_SPARC64
|
||||
case 0x2c: /* V9 movcc */
|
||||
case 0x2f: /* V9 movr */
|
||||
goto illegal_insn; /* in decodetree */
|
||||
case 0x2e: /* V9 popc */
|
||||
tcg_gen_ctpop_tl(cpu_dst, cpu_src2);
|
||||
gen_store_gpr(dc, rd, cpu_dst);
|
||||
break;
|
||||
#endif
|
||||
default:
|
||||
goto illegal_insn;
|
||||
}
|
||||
}
|
||||
goto illegal_insn; /* in decodetree */
|
||||
} else if (xop == 0x36) { /* UltraSparc shutdown, VIS, V8 CPop1 */
|
||||
#ifdef TARGET_SPARC64
|
||||
int opf = GET_FIELD_SP(insn, 5, 13);
|
||||
|
Loading…
Reference in New Issue
Block a user