target/mips: Demacro LMI decoder

This makes searches for instances of opcode usages easier.

Reviewed-by: Aleksandar Rikalo <aleksandar.rikalo@rt-rk.com>
Signed-off-by: Aleksandar Markovic <amarkovic@wavecomp.com>
Message-Id: <1571826227-10583-15-git-send-email-aleksandar.markovic@rt-rk.com>
This commit is contained in:
Aleksandar Markovic 2019-10-23 12:23:47 +02:00
parent f392d1344e
commit b1cf82f020
1 changed files with 165 additions and 65 deletions

View File

@ -5546,78 +5546,181 @@ static void gen_loongson_multimedia(DisasContext *ctx, int rd, int rs, int rt)
gen_load_fpr64(ctx, t0, rs); gen_load_fpr64(ctx, t0, rs);
gen_load_fpr64(ctx, t1, rt); gen_load_fpr64(ctx, t1, rt);
#define LMI_HELPER(UP, LO) \
case OPC_##UP: gen_helper_##LO(t0, t0, t1); break
#define LMI_HELPER_1(UP, LO) \
case OPC_##UP: gen_helper_##LO(t0, t0); break
#define LMI_DIRECT(UP, LO, OP) \
case OPC_##UP: tcg_gen_##OP##_i64(t0, t0, t1); break
switch (opc) { switch (opc) {
LMI_HELPER(PADDSH, paddsh); case OPC_PADDSH:
LMI_HELPER(PADDUSH, paddush); gen_helper_paddsh(t0, t0, t1);
LMI_HELPER(PADDH, paddh); break;
LMI_HELPER(PADDW, paddw); case OPC_PADDUSH:
LMI_HELPER(PADDSB, paddsb); gen_helper_paddush(t0, t0, t1);
LMI_HELPER(PADDUSB, paddusb); break;
LMI_HELPER(PADDB, paddb); case OPC_PADDH:
gen_helper_paddh(t0, t0, t1);
break;
case OPC_PADDW:
gen_helper_paddw(t0, t0, t1);
break;
case OPC_PADDSB:
gen_helper_paddsb(t0, t0, t1);
break;
case OPC_PADDUSB:
gen_helper_paddusb(t0, t0, t1);
break;
case OPC_PADDB:
gen_helper_paddb(t0, t0, t1);
break;
LMI_HELPER(PSUBSH, psubsh); case OPC_PSUBSH:
LMI_HELPER(PSUBUSH, psubush); gen_helper_psubsh(t0, t0, t1);
LMI_HELPER(PSUBH, psubh); break;
LMI_HELPER(PSUBW, psubw); case OPC_PSUBUSH:
LMI_HELPER(PSUBSB, psubsb); gen_helper_psubush(t0, t0, t1);
LMI_HELPER(PSUBUSB, psubusb); break;
LMI_HELPER(PSUBB, psubb); case OPC_PSUBH:
gen_helper_psubh(t0, t0, t1);
break;
case OPC_PSUBW:
gen_helper_psubw(t0, t0, t1);
break;
case OPC_PSUBSB:
gen_helper_psubsb(t0, t0, t1);
break;
case OPC_PSUBUSB:
gen_helper_psubusb(t0, t0, t1);
break;
case OPC_PSUBB:
gen_helper_psubb(t0, t0, t1);
break;
LMI_HELPER(PSHUFH, pshufh); case OPC_PSHUFH:
LMI_HELPER(PACKSSWH, packsswh); gen_helper_pshufh(t0, t0, t1);
LMI_HELPER(PACKSSHB, packsshb); break;
LMI_HELPER(PACKUSHB, packushb); case OPC_PACKSSWH:
gen_helper_packsswh(t0, t0, t1);
break;
case OPC_PACKSSHB:
gen_helper_packsshb(t0, t0, t1);
break;
case OPC_PACKUSHB:
gen_helper_packushb(t0, t0, t1);
break;
LMI_HELPER(PUNPCKLHW, punpcklhw); case OPC_PUNPCKLHW:
LMI_HELPER(PUNPCKHHW, punpckhhw); gen_helper_punpcklhw(t0, t0, t1);
LMI_HELPER(PUNPCKLBH, punpcklbh); break;
LMI_HELPER(PUNPCKHBH, punpckhbh); case OPC_PUNPCKHHW:
LMI_HELPER(PUNPCKLWD, punpcklwd); gen_helper_punpckhhw(t0, t0, t1);
LMI_HELPER(PUNPCKHWD, punpckhwd); break;
case OPC_PUNPCKLBH:
gen_helper_punpcklbh(t0, t0, t1);
break;
case OPC_PUNPCKHBH:
gen_helper_punpckhbh(t0, t0, t1);
break;
case OPC_PUNPCKLWD:
gen_helper_punpcklwd(t0, t0, t1);
break;
case OPC_PUNPCKHWD:
gen_helper_punpckhwd(t0, t0, t1);
break;
LMI_HELPER(PAVGH, pavgh); case OPC_PAVGH:
LMI_HELPER(PAVGB, pavgb); gen_helper_pavgh(t0, t0, t1);
LMI_HELPER(PMAXSH, pmaxsh); break;
LMI_HELPER(PMINSH, pminsh); case OPC_PAVGB:
LMI_HELPER(PMAXUB, pmaxub); gen_helper_pavgb(t0, t0, t1);
LMI_HELPER(PMINUB, pminub); break;
case OPC_PMAXSH:
gen_helper_pmaxsh(t0, t0, t1);
break;
case OPC_PMINSH:
gen_helper_pminsh(t0, t0, t1);
break;
case OPC_PMAXUB:
gen_helper_pmaxub(t0, t0, t1);
break;
case OPC_PMINUB:
gen_helper_pminub(t0, t0, t1);
break;
LMI_HELPER(PCMPEQW, pcmpeqw); case OPC_PCMPEQW:
LMI_HELPER(PCMPGTW, pcmpgtw); gen_helper_pcmpeqw(t0, t0, t1);
LMI_HELPER(PCMPEQH, pcmpeqh); break;
LMI_HELPER(PCMPGTH, pcmpgth); case OPC_PCMPGTW:
LMI_HELPER(PCMPEQB, pcmpeqb); gen_helper_pcmpgtw(t0, t0, t1);
LMI_HELPER(PCMPGTB, pcmpgtb); break;
case OPC_PCMPEQH:
gen_helper_pcmpeqh(t0, t0, t1);
break;
case OPC_PCMPGTH:
gen_helper_pcmpgth(t0, t0, t1);
break;
case OPC_PCMPEQB:
gen_helper_pcmpeqb(t0, t0, t1);
break;
case OPC_PCMPGTB:
gen_helper_pcmpgtb(t0, t0, t1);
break;
LMI_HELPER(PSLLW, psllw); case OPC_PSLLW:
LMI_HELPER(PSLLH, psllh); gen_helper_psllw(t0, t0, t1);
LMI_HELPER(PSRLW, psrlw); break;
LMI_HELPER(PSRLH, psrlh); case OPC_PSLLH:
LMI_HELPER(PSRAW, psraw); gen_helper_psllh(t0, t0, t1);
LMI_HELPER(PSRAH, psrah); break;
case OPC_PSRLW:
gen_helper_psrlw(t0, t0, t1);
break;
case OPC_PSRLH:
gen_helper_psrlh(t0, t0, t1);
break;
case OPC_PSRAW:
gen_helper_psraw(t0, t0, t1);
break;
case OPC_PSRAH:
gen_helper_psrah(t0, t0, t1);
break;
LMI_HELPER(PMULLH, pmullh); case OPC_PMULLH:
LMI_HELPER(PMULHH, pmulhh); gen_helper_pmullh(t0, t0, t1);
LMI_HELPER(PMULHUH, pmulhuh); break;
LMI_HELPER(PMADDHW, pmaddhw); case OPC_PMULHH:
gen_helper_pmulhh(t0, t0, t1);
break;
case OPC_PMULHUH:
gen_helper_pmulhuh(t0, t0, t1);
break;
case OPC_PMADDHW:
gen_helper_pmaddhw(t0, t0, t1);
break;
LMI_HELPER(PASUBUB, pasubub); case OPC_PASUBUB:
LMI_HELPER_1(BIADD, biadd); gen_helper_pasubub(t0, t0, t1);
LMI_HELPER_1(PMOVMSKB, pmovmskb); break;
case OPC_BIADD:
gen_helper_biadd(t0, t0);
break;
case OPC_PMOVMSKB:
gen_helper_pmovmskb(t0, t0);
break;
LMI_DIRECT(PADDD, paddd, add); case OPC_PADDD:
LMI_DIRECT(PSUBD, psubd, sub); tcg_gen_add_i64(t0, t0, t1);
LMI_DIRECT(XOR_CP2, xor, xor); break;
LMI_DIRECT(NOR_CP2, nor, nor); case OPC_PSUBD:
LMI_DIRECT(AND_CP2, and, and); tcg_gen_sub_i64(t0, t0, t1);
LMI_DIRECT(OR_CP2, or, or); break;
case OPC_XOR_CP2:
tcg_gen_xor_i64(t0, t0, t1);
break;
case OPC_NOR_CP2:
tcg_gen_nor_i64(t0, t0, t1);
break;
case OPC_AND_CP2:
tcg_gen_and_i64(t0, t0, t1);
break;
case OPC_OR_CP2:
tcg_gen_or_i64(t0, t0, t1);
break;
case OPC_PANDN: case OPC_PANDN:
tcg_gen_andc_i64(t0, t1, t0); tcg_gen_andc_i64(t0, t1, t0);
@ -5770,9 +5873,6 @@ static void gen_loongson_multimedia(DisasContext *ctx, int rd, int rs, int rt)
return; return;
} }
#undef LMI_HELPER
#undef LMI_DIRECT
gen_store_fpr64(ctx, t0, rd); gen_store_fpr64(ctx, t0, rd);
tcg_temp_free_i64(t0); tcg_temp_free_i64(t0);