[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PATCH v5 43/94] target/sparc: Move POPC to decodetree
|
From: |
Richard Henderson |
|
Subject: |
[PATCH v5 43/94] target/sparc: Move POPC to decodetree |
|
Date: |
Sun, 22 Oct 2023 16:28:41 -0700 |
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>
---
target/sparc/insns.decode | 3 +++
target/sparc/translate.c | 56 +++++++--------------------------------
2 files changed, 12 insertions(+), 47 deletions(-)
diff --git a/target/sparc/insns.decode b/target/sparc/insns.decode
index cb21405e1a..a596b0fc85 100644
--- a/target/sparc/insns.decode
+++ b/target/sparc/insns.decode
@@ -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
diff --git a/target/sparc/translate.c b/target/sparc/translate.c
index 1e9f5c660a..2050193cb0 100644
--- a/target/sparc/translate.c
+++ b/target/sparc/translate.c
@@ -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)
{
@@ -4168,6 +4160,9 @@ TRANS(TSUBcc, ALL, do_arith, a, CC_OP_TSUB, NULL, NULL,
gen_op_sub_cc)
TRANS(TADDccTV, ALL, do_arith, a, CC_OP_TADDTV, NULL, NULL, gen_op_taddcctv)
TRANS(TSUBccTV, ALL, do_arith, a, CC_OP_TSUBTV, NULL, NULL, gen_op_tsubcctv)
+/* 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. */
@@ -4728,40 +4723,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);
--
2.34.1
- [PATCH v5 35/94] target/sparc: Move MULX to decodetree, (continued)
- [PATCH v5 35/94] target/sparc: Move MULX to decodetree, Richard Henderson, 2023/10/22
- [PATCH v5 37/94] target/sparc: Move SUBC to decodetree, Richard Henderson, 2023/10/22
- [PATCH v5 39/94] target/sparc: Move UDIV, SDIV to decodetree, Richard Henderson, 2023/10/22
- [PATCH v5 40/94] target/sparc: Move TADD, TSUB, MULS to decodetree, Richard Henderson, 2023/10/22
- [PATCH v5 41/94] target/sparc: Move SLL, SRL, SRA to decodetree, Richard Henderson, 2023/10/22
- [PATCH v5 45/94] target/sparc: Move JMPL, RETT, RETURN to decodetree, Richard Henderson, 2023/10/22
- [PATCH v5 42/94] target/sparc: Move MOVcc, MOVR to decodetree, Richard Henderson, 2023/10/22
- [PATCH v5 46/94] target/sparc: Move FLUSH, SAVE, RESTORE to decodetree, Richard Henderson, 2023/10/22
- [PATCH v5 44/94] target/sparc: Convert remaining v8 coproc insns to decodetree, Richard Henderson, 2023/10/22
- [PATCH v5 49/94] target/sparc: Drop ifdef around get_asi and friends, Richard Henderson, 2023/10/22
- [PATCH v5 43/94] target/sparc: Move POPC to decodetree,
Richard Henderson <=
- [PATCH v5 48/94] target/sparc: Split out resolve_asi, Richard Henderson, 2023/10/22
- [PATCH v5 51/94] target/sparc: Use tcg_gen_qemu_{ld, st}_i128 for GET_ASI_DTWINX, Richard Henderson, 2023/10/22
- [PATCH v5 52/94] target/sparc: Move simple integer load/store to decodetree, Richard Henderson, 2023/10/22
- [PATCH v5 47/94] target/sparc: Move DONE, RETRY to decodetree, Richard Henderson, 2023/10/22
- [PATCH v5 58/94] target/sparc: Split out fp ldst functions with asi precomputed, Richard Henderson, 2023/10/22
- [PATCH v5 50/94] target/sparc: Split out ldst functions with asi pre-computed, Richard Henderson, 2023/10/22
- [PATCH v5 53/94] target/sparc: Move asi integer load/store to decodetree, Richard Henderson, 2023/10/22
- [PATCH v5 56/94] target/sparc: Move CASA, CASXA to decodetree, Richard Henderson, 2023/10/22
- [PATCH v5 61/94] target/sparc: Move LDFSR, STFSR to decodetree, Richard Henderson, 2023/10/22
- [PATCH v5 55/94] target/sparc: Move SWAP, SWAPA to decodetree, Richard Henderson, 2023/10/22