target-i386: replace approx_rsqrt and approx_rcp by softfloat ops

Reviewed-by: Peter Maydell <peter.maydell@linaro.org>
Signed-off-by: Aurelien Jarno <aurelien@aurel32.net>
This commit is contained in:
Aurelien Jarno 2011-04-20 13:04:23 +02:00
parent fec05e4299
commit c2ef9a83be
2 changed files with 24 additions and 22 deletions

View File

@ -4794,16 +4794,6 @@ void helper_boundl(target_ulong a0, int v)
} }
} }
static float approx_rsqrt(float a)
{
return 1.0 / sqrt(a);
}
static float approx_rcp(float a)
{
return 1.0 / a;
}
#if !defined(CONFIG_USER_ONLY) #if !defined(CONFIG_USER_ONLY)
#define MMUSUFFIX _mmu #define MMUSUFFIX _mmu

View File

@ -778,28 +778,38 @@ int64_t helper_cvttsd2sq(XMMReg *s)
void helper_rsqrtps(XMMReg *d, XMMReg *s) void helper_rsqrtps(XMMReg *d, XMMReg *s)
{ {
d->XMM_S(0) = approx_rsqrt(s->XMM_S(0)); d->XMM_S(0) = float32_div(float32_one,
d->XMM_S(1) = approx_rsqrt(s->XMM_S(1)); float32_sqrt(s->XMM_S(0), &env->sse_status),
d->XMM_S(2) = approx_rsqrt(s->XMM_S(2)); &env->sse_status);
d->XMM_S(3) = approx_rsqrt(s->XMM_S(3)); d->XMM_S(1) = float32_div(float32_one,
float32_sqrt(s->XMM_S(1), &env->sse_status),
&env->sse_status);
d->XMM_S(2) = float32_div(float32_one,
float32_sqrt(s->XMM_S(2), &env->sse_status),
&env->sse_status);
d->XMM_S(3) = float32_div(float32_one,
float32_sqrt(s->XMM_S(3), &env->sse_status),
&env->sse_status);
} }
void helper_rsqrtss(XMMReg *d, XMMReg *s) void helper_rsqrtss(XMMReg *d, XMMReg *s)
{ {
d->XMM_S(0) = approx_rsqrt(s->XMM_S(0)); d->XMM_S(0) = float32_div(float32_one,
float32_sqrt(s->XMM_S(0), &env->sse_status),
&env->sse_status);
} }
void helper_rcpps(XMMReg *d, XMMReg *s) void helper_rcpps(XMMReg *d, XMMReg *s)
{ {
d->XMM_S(0) = approx_rcp(s->XMM_S(0)); d->XMM_S(0) = float32_div(float32_one, s->XMM_S(0), &env->sse_status);
d->XMM_S(1) = approx_rcp(s->XMM_S(1)); d->XMM_S(1) = float32_div(float32_one, s->XMM_S(1), &env->sse_status);
d->XMM_S(2) = approx_rcp(s->XMM_S(2)); d->XMM_S(2) = float32_div(float32_one, s->XMM_S(2), &env->sse_status);
d->XMM_S(3) = approx_rcp(s->XMM_S(3)); d->XMM_S(3) = float32_div(float32_one, s->XMM_S(3), &env->sse_status);
} }
void helper_rcpss(XMMReg *d, XMMReg *s) void helper_rcpss(XMMReg *d, XMMReg *s)
{ {
d->XMM_S(0) = approx_rcp(s->XMM_S(0)); d->XMM_S(0) = float32_div(float32_one, s->XMM_S(0), &env->sse_status);
} }
static inline uint64_t helper_extrq(uint64_t src, int shift, int len) static inline uint64_t helper_extrq(uint64_t src, int shift, int len)
@ -1272,14 +1282,16 @@ void helper_pfpnacc(MMXReg *d, MMXReg *s)
void helper_pfrcp(MMXReg *d, MMXReg *s) void helper_pfrcp(MMXReg *d, MMXReg *s)
{ {
d->MMX_S(0) = approx_rcp(s->MMX_S(0)); d->MMX_S(0) = float32_div(float32_one, s->MMX_S(0), &env->mmx_status);
d->MMX_S(1) = d->MMX_S(0); d->MMX_S(1) = d->MMX_S(0);
} }
void helper_pfrsqrt(MMXReg *d, MMXReg *s) void helper_pfrsqrt(MMXReg *d, MMXReg *s)
{ {
d->MMX_L(1) = s->MMX_L(0) & 0x7fffffff; d->MMX_L(1) = s->MMX_L(0) & 0x7fffffff;
d->MMX_S(1) = approx_rsqrt(d->MMX_S(1)); d->MMX_S(1) = float32_div(float32_one,
float32_sqrt(d->MMX_S(1), &env->mmx_status),
&env->mmx_status);
d->MMX_L(1) |= s->MMX_L(0) & 0x80000000; d->MMX_L(1) |= s->MMX_L(0) & 0x80000000;
d->MMX_L(0) = d->MMX_L(1); d->MMX_L(0) = d->MMX_L(1);
} }