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:
		
							parent
							
								
									fec05e4299
								
							
						
					
					
						commit
						c2ef9a83be
					
				@ -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
 | 
				
			||||||
 | 
				
			|||||||
@ -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);
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user