Commit 5b7141a11e2ef24caf26af95e59b2ed9552daa0e
1 parent
1b6e5f99
sh4: Add FMAC instruction support
Signed-off-by: Laurent Desnogues <laurent.desnogues@gmail.com> Signed-off-by: Lionel Landwerlin <lionel.landwerlin@openwide.fr> Signed-off-by: Aurelien Jarno <aurelien@aurel32.net> git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@6309 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
23 additions
and
0 deletions
target-sh4/helper.h
| ... | ... | @@ -35,6 +35,7 @@ DEF_HELPER_2(fdiv_FT, i32, i32, i32) |
| 35 | 35 | DEF_HELPER_2(fdiv_DT, i64, i64, i64) |
| 36 | 36 | DEF_HELPER_1(float_FT, i32, i32) |
| 37 | 37 | DEF_HELPER_1(float_DT, i64, i32) |
| 38 | +DEF_HELPER_3(fmac_FT, i32, i32, i32, i32) | |
| 38 | 39 | DEF_HELPER_2(fmul_FT, i32, i32, i32) |
| 39 | 40 | DEF_HELPER_2(fmul_DT, i64, i64, i64) |
| 40 | 41 | DEF_HELPER_1(fneg_T, i32, i32) | ... | ... |
target-sh4/op_helper.c
| ... | ... | @@ -531,6 +531,17 @@ uint64_t helper_float_DT(uint32_t t0) |
| 531 | 531 | return d.ll; |
| 532 | 532 | } |
| 533 | 533 | |
| 534 | +uint32_t helper_fmac_FT(uint32_t t0, uint32_t t1, uint32_t t2) | |
| 535 | +{ | |
| 536 | + CPU_FloatU f0, f1, f2; | |
| 537 | + f0.l = t0; | |
| 538 | + f1.l = t1; | |
| 539 | + f2.l = t2; | |
| 540 | + f0.f = float32_mul(f0.f, f1.f, &env->fp_status); | |
| 541 | + f0.f = float32_add(f0.f, f2.f, &env->fp_status); | |
| 542 | + return f0.l; | |
| 543 | +} | |
| 544 | + | |
| 534 | 545 | uint32_t helper_fmul_FT(uint32_t t0, uint32_t t1) |
| 535 | 546 | { |
| 536 | 547 | CPU_FloatU f0, f1; | ... | ... |
target-sh4/translate.c
| ... | ... | @@ -1176,6 +1176,17 @@ static void _decode_opc(DisasContext * ctx) |
| 1176 | 1176 | } |
| 1177 | 1177 | } |
| 1178 | 1178 | return; |
| 1179 | + case 0xf00e: /* fmac FR0,RM,Rn */ | |
| 1180 | + { | |
| 1181 | + CHECK_FPU_ENABLED | |
| 1182 | + if (ctx->fpscr & FPSCR_PR) { | |
| 1183 | + break; /* illegal instruction */ | |
| 1184 | + } else { | |
| 1185 | + gen_helper_fmac_FT(cpu_fregs[FREG(B11_8)], | |
| 1186 | + cpu_fregs[FREG(0)], cpu_fregs[FREG(B7_4)], cpu_fregs[FREG(B11_8)]); | |
| 1187 | + return; | |
| 1188 | + } | |
| 1189 | + } | |
| 1179 | 1190 | } |
| 1180 | 1191 | |
| 1181 | 1192 | switch (ctx->opcode & 0xff00) { | ... | ... |