Skip to content

Commit

Permalink
target-m68k: define ext_opsize
Browse files Browse the repository at this point in the history
Signed-off-by: Laurent Vivier <[email protected]>
Reviewed-by: Richard Henderson <[email protected]>
Message-Id: <[email protected]>
  • Loading branch information
vivier committed Jun 15, 2017
1 parent c88f810 commit 69e6982
Showing 1 changed file with 24 additions and 19 deletions.
43 changes: 24 additions & 19 deletions target/m68k/translate.c
Original file line number Diff line number Diff line change
Expand Up @@ -669,6 +669,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(int opsize, TCGv reg, TCGv val)
Expand Down Expand Up @@ -4111,20 +4126,19 @@ DISAS_INSN(fpu)
tmp32 = tcg_temp_new_i32();
/* 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(tmp32, cpu_env, src);
break;
case 1:
opsize = OS_SINGLE;
case OS_SINGLE:
gen_helper_f64_to_f32(tmp32, cpu_env, src);
break;
case 4:
opsize = OS_WORD;
case OS_WORD:
gen_helper_f64_to_i32(tmp32, cpu_env, src);
break;
case 5: /* OS_DOUBLE */
case OS_DOUBLE:
tcg_gen_mov_i32(tmp32, AREG(insn, 0));
switch ((insn >> 3) & 7) {
case 2:
Expand Down Expand Up @@ -4153,8 +4167,7 @@ DISAS_INSN(fpu)
}
tcg_temp_free_i32(tmp32);
return;
case 6:
opsize = OS_BYTE;
case OS_BYTE:
gen_helper_f64_to_i32(tmp32, cpu_env, src);
break;
default:
Expand Down Expand Up @@ -4227,15 +4240,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_gen_mov_i32(tmp32, AREG(insn, 0));
Expand Down

0 comments on commit 69e6982

Please sign in to comment.