qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Qemu-devel] [PATCH] SH4, Add more float instructions.


From: Takashi Yoshii
Subject: [Qemu-devel] [PATCH] SH4, Add more float instructions.
Date: Wed, 12 Dec 2007 02:59:02 +0900

Hi,
I found some instructions missing on SH4, and added some.
Graphics extentions(like sin/cos/sqrt/vector op) are still missing,
 but I believe no one need them, at least, so far.

"fneg" is implemented as 32bit op, according to the programming manual.
/yoshii

diff -u -p -r1.10 op.c
--- a/target-sh4/op.c   2 Dec 2007 06:18:24 -0000       1.10
+++ b/target-sh4/op.c   11 Dec 2007 17:24:31 -0000
@@ -797,6 +797,36 @@ void OPPROTO op_ftrc_DT(void)
     RETURN();
 }
 
+void OPPROTO op_fneg_frN(void)
+{
+    env->fregs[PARAM1] = float32_chs(env->fregs[PARAM1]);
+    RETURN();
+}
+
+void OPPROTO op_fabs_FT(void)
+{
+    FT0 = float32_abs(FT0);
+    RETURN();
+}
+
+void OPPROTO op_fabs_DT(void)
+{
+    DT0 = float64_abs(DT0);
+    RETURN();
+}
+
+void OPPROTO op_fcnvsd_DT(void)
+{
+    DT0 = float32_to_float64(env->fpul, &env->fp_status);
+    RETURN();
+}
+
+void OPPROTO op_fcnvds_DT(void)
+{
+    env->fpul = float64_to_float32(DT0, &env->fp_status);
+    RETURN();
+}
+
 void OPPROTO op_fmov_T0_frN(void)
 {
     *(unsigned int *)&env->fregs[PARAM1] = T0;
diff -u -p -r1.21 translate.c
--- a/target-sh4/translate.c    2 Dec 2007 06:10:04 -0000       1.21
+++ b/target-sh4/translate.c    11 Dec 2007 17:24:31 -0000
@@ -1123,6 +1123,23 @@ void _decode_opc(DisasContext * ctx)
            gen_op_ftrc_FT();
        }
        return;
+    case 0xf04d: /* fneg FRn/DRn - FPSCR: Nothing */
+       gen_op_fneg_frN(FREG(B11_8));
+       return;
+    case 0xf05d: /* fabs FRn/DRn */
+       if (ctx->fpscr & FPSCR_PR) {
+           if (ctx->opcode & 0x0100)
+               break; /* illegal instruction */
+           gen_op_fmov_drN_DT0(DREG(B11_8));
+           gen_op_fabs_DT();
+           gen_op_fmov_DT0_drN(DREG(B11_8));
+       }
+       else {
+           gen_op_fmov_frN_FT0(FREG(B11_8));
+           gen_op_fabs_FT();
+           gen_op_fmov_FT0_frN(FREG(B11_8));
+       }
+       return;
     case 0xf08d: /* fldi0 FRn - FPSCR: R[PR] */
        if (!(ctx->fpscr & FPSCR_PR)) {
            gen_op_movl_imm_T0(0);
@@ -1137,6 +1154,14 @@ void _decode_opc(DisasContext * ctx)
            return;
        }
        break;
+    case 0xf0ad: /* cnvsd FPUL,DRn */
+       gen_op_fcnvsd_DT();
+       gen_op_fmov_DT0_drN(DREG(B11_8));
+       return;
+    case 0xf0bd: /* cnvds DRn,FPUL */
+       gen_op_fmov_drN_DT0(DREG(B11_8));
+       gen_op_fcnvds_DT();
+       return;
     }
 
     fprintf(stderr, "unknown instruction 0x%04x at pc 0x%08x\n",




reply via email to

[Prev in Thread] Current Thread [Next in Thread]