Skip to content

Commit

Permalink
target/m68k: add explicit single and double precision operations (par…
Browse files Browse the repository at this point in the history
…t 2)

Add fsabs, fdabs, fsneg, fdneg, fsmove and fdmove.

The value is converted using the new floatx80_round() function.

Signed-off-by: Laurent Vivier <laurent@vivier.eu>
Reviewed-by: Richard Henderson <rth@twiddle.net>
Message-Id: <20170628204241.32106-7-laurent@vivier.eu>
  • Loading branch information
vivier committed Jun 29, 2017
1 parent 2f77995 commit 77bdb22
Show file tree
Hide file tree
Showing 3 changed files with 74 additions and 8 deletions.
48 changes: 45 additions & 3 deletions target/m68k/fpu_helper.c
Expand Up @@ -167,6 +167,20 @@ void HELPER(set_fpcr)(CPUM68KState *env, uint32_t val)
set_floatx80_rounding_precision(old, &env->fp_status); \
} while (0)

void HELPER(fsround)(CPUM68KState *env, FPReg *res, FPReg *val)
{
PREC_BEGIN(32);
res->d = floatx80_round(val->d, &env->fp_status);
PREC_END();
}

void HELPER(fdround)(CPUM68KState *env, FPReg *res, FPReg *val)
{
PREC_BEGIN(64);
res->d = floatx80_round(val->d, &env->fp_status);
PREC_END();
}

void HELPER(fsqrt)(CPUM68KState *env, FPReg *res, FPReg *val)
{
res->d = floatx80_sqrt(val->d, &env->fp_status);
Expand All @@ -188,12 +202,40 @@ void HELPER(fdsqrt)(CPUM68KState *env, FPReg *res, FPReg *val)

void HELPER(fabs)(CPUM68KState *env, FPReg *res, FPReg *val)
{
res->d = floatx80_abs(val->d);
res->d = floatx80_round(floatx80_abs(val->d), &env->fp_status);
}

void HELPER(fsabs)(CPUM68KState *env, FPReg *res, FPReg *val)
{
PREC_BEGIN(32);
res->d = floatx80_round(floatx80_abs(val->d), &env->fp_status);
PREC_END();
}

void HELPER(fdabs)(CPUM68KState *env, FPReg *res, FPReg *val)
{
PREC_BEGIN(64);
res->d = floatx80_round(floatx80_abs(val->d), &env->fp_status);
PREC_END();
}

void HELPER(fneg)(CPUM68KState *env, FPReg *res, FPReg *val)
{
res->d = floatx80_round(floatx80_chs(val->d), &env->fp_status);
}

void HELPER(fchs)(CPUM68KState *env, FPReg *res, FPReg *val)
void HELPER(fsneg)(CPUM68KState *env, FPReg *res, FPReg *val)
{
res->d = floatx80_chs(val->d);
PREC_BEGIN(32);
res->d = floatx80_round(floatx80_chs(val->d), &env->fp_status);
PREC_END();
}

void HELPER(fdneg)(CPUM68KState *env, FPReg *res, FPReg *val)
{
PREC_BEGIN(64);
res->d = floatx80_round(floatx80_chs(val->d), &env->fp_status);
PREC_END();
}

void HELPER(fadd)(CPUM68KState *env, FPReg *res, FPReg *val0, FPReg *val1)
Expand Down
8 changes: 7 additions & 1 deletion target/m68k/helper.h
Expand Up @@ -23,13 +23,19 @@ DEF_HELPER_2(redf32, f32, env, fp)
DEF_HELPER_2(redf64, f64, env, fp)
DEF_HELPER_2(reds32, s32, env, fp)

DEF_HELPER_3(fsround, void, env, fp, fp)
DEF_HELPER_3(fdround, void, env, fp, fp)
DEF_HELPER_3(firound, void, env, fp, fp)
DEF_HELPER_3(fitrunc, void, env, fp, fp)
DEF_HELPER_3(fsqrt, void, env, fp, fp)
DEF_HELPER_3(fssqrt, void, env, fp, fp)
DEF_HELPER_3(fdsqrt, void, env, fp, fp)
DEF_HELPER_3(fabs, void, env, fp, fp)
DEF_HELPER_3(fchs, void, env, fp, fp)
DEF_HELPER_3(fsabs, void, env, fp, fp)
DEF_HELPER_3(fdabs, void, env, fp, fp)
DEF_HELPER_3(fneg, void, env, fp, fp)
DEF_HELPER_3(fsneg, void, env, fp, fp)
DEF_HELPER_3(fdneg, void, env, fp, fp)
DEF_HELPER_4(fadd, void, env, fp, fp, fp)
DEF_HELPER_4(fsadd, void, env, fp, fp, fp)
DEF_HELPER_4(fdadd, void, env, fp, fp, fp)
Expand Down
26 changes: 22 additions & 4 deletions target/m68k/translate.c
Expand Up @@ -4595,9 +4595,15 @@ DISAS_INSN(fpu)
}
cpu_dest = gen_fp_ptr(REG(ext, 7));
switch (opmode) {
case 0: case 0x40: case 0x44: /* fmove */
case 0: /* fmove */
gen_fp_move(cpu_dest, cpu_src);
break;
case 0x40: /* fsmove */
gen_helper_fsround(cpu_env, cpu_dest, cpu_src);
break;
case 0x44: /* fdmove */
gen_helper_fdround(cpu_env, cpu_dest, cpu_src);
break;
case 1: /* fint */
gen_helper_firound(cpu_env, cpu_dest, cpu_src);
break;
Expand All @@ -4613,11 +4619,23 @@ DISAS_INSN(fpu)
case 0x45: /* fdsqrt */
gen_helper_fdsqrt(cpu_env, cpu_dest, cpu_src);
break;
case 0x18: case 0x58: case 0x5c: /* fabs */
case 0x18: /* fabs */
gen_helper_fabs(cpu_env, cpu_dest, cpu_src);
break;
case 0x1a: case 0x5a: case 0x5e: /* fneg */
gen_helper_fchs(cpu_env, cpu_dest, cpu_src);
case 0x58: /* fsabs */
gen_helper_fsabs(cpu_env, cpu_dest, cpu_src);
break;
case 0x5c: /* fdabs */
gen_helper_fdabs(cpu_env, cpu_dest, cpu_src);
break;
case 0x1a: /* fneg */
gen_helper_fneg(cpu_env, cpu_dest, cpu_src);
break;
case 0x5a: /* fsneg */
gen_helper_fsneg(cpu_env, cpu_dest, cpu_src);
break;
case 0x5e: /* fdneg */
gen_helper_fdneg(cpu_env, cpu_dest, cpu_src);
break;
case 0x20: /* fdiv */
gen_helper_fdiv(cpu_env, cpu_dest, cpu_src, cpu_dest);
Expand Down

0 comments on commit 77bdb22

Please sign in to comment.