diff --git a/qemu/target/m68k/translate.c b/qemu/target/m68k/translate.c index 2047ab37..22908632 100644 --- a/qemu/target/m68k/translate.c +++ b/qemu/target/m68k/translate.c @@ -667,6 +667,21 @@ static inline int insn_opsize(int insn) } } +static inline int ext_opsize(int ext, int pos) +{ + switch ((ext >> pos) & 7) { + case 0: return OS_LONG; + case 1: return OS_SINGLE; + case 2: return OS_EXTENDED; + case 3: return OS_PACKED; + case 4: return OS_WORD; + case 5: return OS_DOUBLE; + case 6: return OS_BYTE; + default: + g_assert_not_reached(); + } +} + /* Assign value to a register. If the width is less than the register width only the low part of the register is set. */ static void gen_partset_reg(DisasContext *s, int opsize, TCGv reg, TCGv val) @@ -4269,20 +4284,18 @@ DISAS_INSN(fpu) tmp32 = tcg_temp_new_i32(tcg_ctx); /* fmove */ /* ??? TODO: Proper behavior on overflow. */ - switch ((ext >> 10) & 7) { - case 0: - opsize = OS_LONG; + opsize = ext_opsize(ext, 10); + switch (opsize) { + case OS_LONG: gen_helper_f64_to_i32(tcg_ctx, tmp32, tcg_ctx->cpu_env, src); break; - case 1: - opsize = OS_SINGLE; + case OS_SINGLE: gen_helper_f64_to_f32(tcg_ctx, tmp32, tcg_ctx->cpu_env, src); break; - case 4: - opsize = OS_WORD; + case OS_WORD: gen_helper_f64_to_i32(tcg_ctx, tmp32, tcg_ctx->cpu_env, src); break; - case 5: /* OS_DOUBLE */ + case OS_DOUBLE: tcg_gen_mov_i32(tcg_ctx, tmp32, AREG(insn, 0)); switch ((insn >> 3) & 7) { case 2: @@ -4311,8 +4324,7 @@ DISAS_INSN(fpu) } tcg_temp_free_i32(tcg_ctx, tmp32); return; - case 6: - opsize = OS_BYTE; + case OS_BYTE: gen_helper_f64_to_i32(tcg_ctx, tmp32, tcg_ctx->cpu_env, src); break; default: @@ -4385,15 +4397,7 @@ DISAS_INSN(fpu) } if (ext & (1 << 14)) { /* Source effective address. */ - switch ((ext >> 10) & 7) { - case 0: opsize = OS_LONG; break; - case 1: opsize = OS_SINGLE; break; - case 4: opsize = OS_WORD; break; - case 5: opsize = OS_DOUBLE; break; - case 6: opsize = OS_BYTE; break; - default: - goto undef; - } + opsize = ext_opsize(ext, 10); if (opsize == OS_DOUBLE) { tmp32 = tcg_temp_new_i32(tcg_ctx); tcg_gen_mov_i32(tcg_ctx, tmp32, AREG(insn, 0));