qemu-devel
[Top][All Lists]
Advanced

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

[Qemu-devel] [PATCH 072/111] m68k: add flog10


From: Bryce Lanham
Subject: [Qemu-devel] [PATCH 072/111] m68k: add flog10
Date: Wed, 17 Aug 2011 15:47:17 -0500

From: Laurent Vivier <address@hidden>

Signed-off-by: Laurent Vivier <address@hidden>
---
 fpu/softfloat.h         |    1 +
 target-m68k/helper.c    |   23 ++++++++++++++++++++++-
 target-m68k/helpers.h   |    1 +
 target-m68k/translate.c |    3 +++
 4 files changed, 27 insertions(+), 1 deletions(-)

diff --git a/fpu/softfloat.h b/fpu/softfloat.h
index f6d5fce..9ff6b4d 100644
--- a/fpu/softfloat.h
+++ b/fpu/softfloat.h
@@ -534,6 +534,7 @@ INLINE int floatx80_is_any_nan(floatx80 a)
 #define floatx80_infinity make_floatx80(0x7fff, 0x8000000000000000LL)
 #define floatx80_e make_floatx80(0x4000, 0xadf85458a2bb4a9aULL)
 #define floatx80_log2e make_floatx80(0x3fff, 0xb8aa3b295c17f0bcULL)
+#define floatx80_10 make_floatx80(0x4002, 0xa000000000000000ULL)
 
 /*----------------------------------------------------------------------------
 | The pattern for a default generated extended double-precision NaN.
diff --git a/target-m68k/helper.c b/target-m68k/helper.c
index 14a6ae6..f6e446a 100644
--- a/target-m68k/helper.c
+++ b/target-m68k/helper.c
@@ -1016,7 +1016,7 @@ static const floatx80 fpu_rom[128] = {
     [0x30] = floatx80_ln2,                                      /* ln(2)    */
     [0x31] = { .high = 0x4000, .low = 0x935d8dddaaa8ac17ULL },  /* ln(10)   */
     [0x32] = floatx80_one,                                      /* 10^0     */
-    [0x33] = { .high = 0x4002, .low = 0xa000000000000000ULL },  /* 10^1     */
+    [0x33] = floatx80_10,                                       /* 10^1     */
     [0x34] = { .high = 0x4005, .low = 0xc800000000000000ULL },  /* 10^2     */
     [0x35] = { .high = 0x400c, .low = 0x9c40000000000000ULL },  /* 10^4     */
     [0x36] = { .high = 0x4019, .low = 0xbebc200000000000ULL },  /* 10^8     */
@@ -1284,6 +1284,27 @@ void HELPER(ln_FP0)(CPUState *env)
     floatx80_to_FP0(env, res);
 }
 
+void HELPER(log10_FP0)(CPUState *env)
+{
+    float64 f, log2, log210;
+    floatx80 res;
+
+    /* log10(x) = log2(x) / log2(10) */
+
+    DBG_FPU("log10_FP0(%Lg)\n", LDOUBLE(FP0_to_floatx80(env)));
+    f = floatx80_to_float64(FP0_to_floatx80(env), &env->fp_status);
+
+    log2 = float64_log2(f, &env->fp_status);
+    log210 = float64_log2(floatx80_to_float64(floatx80_10, &env->fp_status),
+                          &env->fp_status);
+    res = floatx80_div(float64_to_floatx80(log2, &env->fp_status),
+                       float64_to_floatx80(log210, &env->fp_status),
+                       &env->fp_status);
+    DBG_FPU("    = %Lg\n", LDOUBLE(res));
+
+    floatx80_to_FP0(env, res);
+}
+
 void HELPER(exp_FP0)(CPUState *env)
 {
     floatx80 f;
diff --git a/target-m68k/helpers.h b/target-m68k/helpers.h
index 53ab1a9..138b4a4 100644
--- a/target-m68k/helpers.h
+++ b/target-m68k/helpers.h
@@ -67,6 +67,7 @@ DEF_HELPER_1(itrunc_FP0, void, env)
 DEF_HELPER_1(sqrt_FP0, void, env)
 DEF_HELPER_1(exp_FP0, void, env)
 DEF_HELPER_1(ln_FP0, void, env)
+DEF_HELPER_1(log10_FP0, void, env)
 DEF_HELPER_1(abs_FP0, void, env)
 DEF_HELPER_1(chs_FP0, void, env)
 DEF_HELPER_1(getexp_FP0, void, env)
diff --git a/target-m68k/translate.c b/target-m68k/translate.c
index 5591873..1196508 100644
--- a/target-m68k/translate.c
+++ b/target-m68k/translate.c
@@ -3647,6 +3647,9 @@ DISAS_INSN(fpu)
     case 0x14:                       /* flogn */
         gen_helper_ln_FP0(cpu_env);
         break;
+    case 0x15:                       /* flog10 */
+        gen_helper_log10_FP0(cpu_env);
+        break;
     case 0x18: case 0x58: case 0x5c: /* fabs */
         gen_helper_abs_FP0(cpu_env);
         break;
-- 
1.7.2.3




reply via email to

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