mirror of
https://github.com/yuzu-emu/unicorn.git
synced 2025-05-04 22:02:16 +00:00
target-m68k: move fmove CR to a function
Move code of fmove to/from control register to a function Backports commit 860b9ac779615fe9315cd58165652052ac165a92 from qemu
This commit is contained in:
parent
ca25248ecd
commit
d92621522a
|
@ -4256,6 +4256,36 @@ DISAS_INSN(trap)
|
||||||
gen_exception(s, s->pc - 2, EXCP_TRAP0 + (insn & 0xf));
|
gen_exception(s, s->pc - 2, EXCP_TRAP0 + (insn & 0xf));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void gen_op_fmove_fcr(CPUM68KState *env, DisasContext *s,
|
||||||
|
uint32_t insn, uint32_t ext)
|
||||||
|
{
|
||||||
|
TCGContext *tcg_ctx = s->uc->tcg_ctx;
|
||||||
|
int mask = (ext >> 10) & 7;
|
||||||
|
int is_write = (ext >> 13) & 1;
|
||||||
|
TCGv val;
|
||||||
|
|
||||||
|
switch (mask) {
|
||||||
|
case 1: /* FPIAR */
|
||||||
|
case 2: /* FPSR */
|
||||||
|
default:
|
||||||
|
qemu_log_mask(LOG_UNIMP, "Unimplemented: fmove to/from control %d",
|
||||||
|
mask);
|
||||||
|
goto undef;
|
||||||
|
case 4: /* FPCR */
|
||||||
|
if (is_write) {
|
||||||
|
val = tcg_const_i32(tcg_ctx, 0);
|
||||||
|
DEST_EA(env, insn, OS_LONG, val, NULL);
|
||||||
|
tcg_temp_free(tcg_ctx, val);
|
||||||
|
}
|
||||||
|
/* Not implemented. Ignore register update */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
undef:
|
||||||
|
s->pc -= 2;
|
||||||
|
disas_undef_fpu(env, s, insn);
|
||||||
|
}
|
||||||
|
|
||||||
/* ??? FP exceptions are not implemented. Most exceptions are deferred until
|
/* ??? FP exceptions are not implemented. Most exceptions are deferred until
|
||||||
immediately before the next FP instruction is executed. */
|
immediately before the next FP instruction is executed. */
|
||||||
DISAS_INSN(fpu)
|
DISAS_INSN(fpu)
|
||||||
|
@ -4334,32 +4364,9 @@ DISAS_INSN(fpu)
|
||||||
tcg_temp_free_i32(tcg_ctx, tmp32);
|
tcg_temp_free_i32(tcg_ctx, tmp32);
|
||||||
return;
|
return;
|
||||||
case 4: /* fmove to control register. */
|
case 4: /* fmove to control register. */
|
||||||
switch ((ext >> 10) & 7) {
|
|
||||||
case 4: /* FPCR */
|
|
||||||
/* Not implemented. Ignore writes. */
|
|
||||||
break;
|
|
||||||
case 1: /* FPIAR */
|
|
||||||
case 2: /* FPSR */
|
|
||||||
default:
|
|
||||||
cpu_abort(NULL, "Unimplemented: fmove to control %d",
|
|
||||||
(ext >> 10) & 7);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case 5: /* fmove from control register. */
|
case 5: /* fmove from control register. */
|
||||||
switch ((ext >> 10) & 7) {
|
gen_op_fmove_fcr(env, s, insn, ext);
|
||||||
case 4: /* FPCR */
|
return;
|
||||||
/* Not implemented. Always return zero. */
|
|
||||||
tmp32 = tcg_const_i32(tcg_ctx, 0);
|
|
||||||
break;
|
|
||||||
case 1: /* FPIAR */
|
|
||||||
case 2: /* FPSR */
|
|
||||||
default:
|
|
||||||
cpu_abort(NULL, "Unimplemented: fmove from control %d",
|
|
||||||
(ext >> 10) & 7);
|
|
||||||
goto undef;
|
|
||||||
}
|
|
||||||
DEST_EA(env, insn, OS_LONG, tmp32, NULL);
|
|
||||||
break;
|
|
||||||
case 6: /* fmovem */
|
case 6: /* fmovem */
|
||||||
case 7:
|
case 7:
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in a new issue