From: Laurent Vivier <[email protected]>
Signed-off-by: Laurent Vivier <[email protected]>
---
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