mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-02-02 13:41:10 +00:00
target/mips: Fix decoding mechanism of R5900 MFLO1, MFHI1, MTLO1 and MTHI1
MFLO1, MFHI1, MTLO1 and MTHI1 are generated in gen_HILO1_tx79 instead of the generic gen_HILO. Backports commit 86efbfb619a42061ac6439c074cfbf52df2ef2c2 from qemu
This commit is contained in:
parent
578172212f
commit
3d637206bd
|
@ -4407,6 +4407,44 @@ static void gen_shift(DisasContext *ctx, uint32_t opc,
|
||||||
tcg_temp_free(tcg_ctx, t1);
|
tcg_temp_free(tcg_ctx, t1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Copy GPR to and from TX79 HI1/LO1 register. */
|
||||||
|
static void gen_HILO1_tx79(DisasContext *ctx, uint32_t opc, int reg)
|
||||||
|
{
|
||||||
|
TCGContext *tcg_ctx = ctx->uc->tcg_ctx;
|
||||||
|
|
||||||
|
if (reg == 0 && (opc == TX79_MMI_MFHI1 || opc == TX79_MMI_MFLO1)) {
|
||||||
|
/* Treat as NOP. */
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
switch (opc) {
|
||||||
|
case TX79_MMI_MFHI1:
|
||||||
|
tcg_gen_mov_tl(tcg_ctx, tcg_ctx->cpu_gpr[reg], tcg_ctx->cpu_HI[1]);
|
||||||
|
break;
|
||||||
|
case TX79_MMI_MFLO1:
|
||||||
|
tcg_gen_mov_tl(tcg_ctx, tcg_ctx->cpu_gpr[reg], tcg_ctx->cpu_LO[1]);
|
||||||
|
break;
|
||||||
|
case TX79_MMI_MTHI1:
|
||||||
|
if (reg != 0) {
|
||||||
|
tcg_gen_mov_tl(tcg_ctx, tcg_ctx->cpu_HI[1], tcg_ctx->cpu_gpr[reg]);
|
||||||
|
} else {
|
||||||
|
tcg_gen_movi_tl(tcg_ctx, tcg_ctx->cpu_HI[1], 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case TX79_MMI_MTLO1:
|
||||||
|
if (reg != 0) {
|
||||||
|
tcg_gen_mov_tl(tcg_ctx, tcg_ctx->cpu_LO[1], tcg_ctx->cpu_gpr[reg]);
|
||||||
|
} else {
|
||||||
|
tcg_gen_movi_tl(tcg_ctx, tcg_ctx->cpu_LO[1], 0);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
MIPS_INVAL("mfthilo1 TX79");
|
||||||
|
generate_exception_end(ctx, EXCP_RI);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/* Arithmetic on HI/LO registers */
|
/* Arithmetic on HI/LO registers */
|
||||||
static void gen_HILO(DisasContext *ctx, uint32_t opc, int acc, int reg)
|
static void gen_HILO(DisasContext *ctx, uint32_t opc, int acc, int reg)
|
||||||
{
|
{
|
||||||
|
@ -4415,21 +4453,17 @@ static void gen_HILO(DisasContext *ctx, uint32_t opc, int acc, int reg)
|
||||||
TCGv *cpu_HI = tcg_ctx->cpu_HI;
|
TCGv *cpu_HI = tcg_ctx->cpu_HI;
|
||||||
TCGv *cpu_LO = tcg_ctx->cpu_LO;
|
TCGv *cpu_LO = tcg_ctx->cpu_LO;
|
||||||
|
|
||||||
if (reg == 0 && (opc == OPC_MFHI || opc == TX79_MMI_MFHI1 ||
|
if (reg == 0 && (opc == OPC_MFHI || opc == OPC_MFLO)) {
|
||||||
opc == OPC_MFLO || opc == TX79_MMI_MFLO1)) {
|
|
||||||
/* Treat as NOP. */
|
/* Treat as NOP. */
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (acc != 0) {
|
if (acc != 0) {
|
||||||
if (!(ctx->insn_flags & INSN_R5900)) {
|
check_dsp(ctx);
|
||||||
check_dsp(ctx);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (opc) {
|
switch (opc) {
|
||||||
case OPC_MFHI:
|
case OPC_MFHI:
|
||||||
case TX79_MMI_MFHI1:
|
|
||||||
#if defined(TARGET_MIPS64)
|
#if defined(TARGET_MIPS64)
|
||||||
if (acc != 0) {
|
if (acc != 0) {
|
||||||
tcg_gen_ext32s_tl(tcg_ctx, cpu_gpr[reg], cpu_HI[acc]);
|
tcg_gen_ext32s_tl(tcg_ctx, cpu_gpr[reg], cpu_HI[acc]);
|
||||||
|
@ -4440,7 +4474,6 @@ static void gen_HILO(DisasContext *ctx, uint32_t opc, int acc, int reg)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case OPC_MFLO:
|
case OPC_MFLO:
|
||||||
case TX79_MMI_MFLO1:
|
|
||||||
#if defined(TARGET_MIPS64)
|
#if defined(TARGET_MIPS64)
|
||||||
if (acc != 0) {
|
if (acc != 0) {
|
||||||
tcg_gen_ext32s_tl(tcg_ctx, cpu_gpr[reg], cpu_LO[acc]);
|
tcg_gen_ext32s_tl(tcg_ctx, cpu_gpr[reg], cpu_LO[acc]);
|
||||||
|
@ -4451,7 +4484,6 @@ static void gen_HILO(DisasContext *ctx, uint32_t opc, int acc, int reg)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case OPC_MTHI:
|
case OPC_MTHI:
|
||||||
case TX79_MMI_MTHI1:
|
|
||||||
if (reg != 0) {
|
if (reg != 0) {
|
||||||
#if defined(TARGET_MIPS64)
|
#if defined(TARGET_MIPS64)
|
||||||
if (acc != 0) {
|
if (acc != 0) {
|
||||||
|
@ -4466,7 +4498,6 @@ static void gen_HILO(DisasContext *ctx, uint32_t opc, int acc, int reg)
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case OPC_MTLO:
|
case OPC_MTLO:
|
||||||
case TX79_MMI_MTLO1:
|
|
||||||
if (reg != 0) {
|
if (reg != 0) {
|
||||||
#if defined(TARGET_MIPS64)
|
#if defined(TARGET_MIPS64)
|
||||||
if (acc != 0) {
|
if (acc != 0) {
|
||||||
|
@ -26659,11 +26690,11 @@ static void decode_tx79_mmi(CPUMIPSState *env, DisasContext *ctx)
|
||||||
break;
|
break;
|
||||||
case TX79_MMI_MTLO1:
|
case TX79_MMI_MTLO1:
|
||||||
case TX79_MMI_MTHI1:
|
case TX79_MMI_MTHI1:
|
||||||
gen_HILO(ctx, opc, 1, rs);
|
gen_HILO1_tx79(ctx, opc, rs);
|
||||||
break;
|
break;
|
||||||
case TX79_MMI_MFLO1:
|
case TX79_MMI_MFLO1:
|
||||||
case TX79_MMI_MFHI1:
|
case TX79_MMI_MFHI1:
|
||||||
gen_HILO(ctx, opc, 1, rd);
|
gen_HILO1_tx79(ctx, opc, rd);
|
||||||
break;
|
break;
|
||||||
case TX79_MMI_MADD: /* TODO: TX79_MMI_MADD */
|
case TX79_MMI_MADD: /* TODO: TX79_MMI_MADD */
|
||||||
case TX79_MMI_MADDU: /* TODO: TX79_MMI_MADDU */
|
case TX79_MMI_MADDU: /* TODO: TX79_MMI_MADDU */
|
||||||
|
|
Loading…
Reference in a new issue