--- /home/antony/cvs/qemu/target-i386/helper.c Sat May 29 12:08:52 2004 +++ target-i386/helper.c Mon May 31 15:40:13 2004 @@ -2105,7 +2105,12 @@ void helper_f2xm1(void) { +#ifdef USE_X86LDOUBLE + __asm __volatile__ + ("f2xm1" : "=t" (ST0) : "0" (ST0)); +#else ST0 = pow(2.0,ST0) - 1.0; +#endif } void helper_fyl2x(void) @@ -2114,8 +2119,14 @@ fptemp = ST0; if (fptemp>0.0){ +#ifdef USE_X86LDOUBLE + __asm __volatile__ + ("fyl2x" + : "=t" (ST1) : "0" (fptemp) , "u" (ST1)); +#else fptemp = log(fptemp)/log(2.0); /* log2(ST) */ ST1 *= fptemp; +#endif fpop(); } else { env->fpus &= (~0x4700); @@ -2165,6 +2176,19 @@ void helper_fprem1(void) { +#ifdef USE_X86LDOUBLE + int flags; + __asm __volatile__ + ("fprem1\n\t" + "fnstsw %%ax\n\t" + : "=t" (ST0), "=ax" (flags) : "0" (ST0) , "u" (ST1)); + if (flags & 0x400) + env->fpus |= 0x400; + else { + env->fpus &= (~0x4700); + env->fpus |= flags & 0x07; + } +#else CPU86_LDouble dblq, fpsrcop, fptemp; CPU86_LDoubleU fpsrcop1, fptemp1; int expdif; @@ -2194,10 +2218,24 @@ floor(fpsrcop): ceil(fpsrcop); ST0 -= (ST1 * fpsrcop * fptemp); } +#endif } void helper_fprem(void) { +#ifdef USE_X86LDOUBLE + int flags; + __asm __volatile__ + ("fprem\n\t" + "fnstsw %%ax\n\t" + : "=t" (ST0), "=ax" (flags) : "0" (ST0) , "u" (ST1)); + if (flags & 0x400) + env->fpus |= 0x400; + else { + env->fpus &= (~0x4700); + env->fpus |= flags & 0x07; + } +#else CPU86_LDouble dblq, fpsrcop, fptemp; CPU86_LDoubleU fpsrcop1, fptemp1; int expdif; @@ -2205,6 +2243,7 @@ fpsrcop = ST0; fptemp = ST1; + fpsrcop1.d = fpsrcop; fptemp1.d = fptemp; expdif = EXPD(fpsrcop1) - EXPD(fptemp1); @@ -2227,6 +2266,7 @@ -(floor(fabs(fpsrcop))): floor(fpsrcop); ST0 -= (ST1 * fpsrcop * fptemp); } +#endif } void helper_fyl2xp1(void) @@ -2235,8 +2275,13 @@ fptemp = ST0; if ((fptemp+1.0)>0.0) { +#ifdef USE_X86LDOUBLE + __asm __volatile__ + ("fyl2xp1" : "=t" (ST1) : "0" (fptemp) , "u" (ST1)); +#else fptemp = log(fptemp+1.0) / log(2.0); /* log2(ST+1.0) */ ST1 *= fptemp; +#endif fpop(); } else { env->fpus &= (~0x4700); @@ -2264,11 +2309,17 @@ if ((fptemp > MAXTAN)||(fptemp < -MAXTAN)) { env->fpus |= 0x400; } else { +#ifdef USE_X86LDOUBLE + __asm __volatile__ + ("fsincos" + : "=t" (ST0) , "=u" (ST1) : "0" (ST0)); +#else ST0 = sin(fptemp); fpush(); ST0 = cos(fptemp); env->fpus &= (~0x400); /* C2 <-- 0 */ /* the above code is for |arg| < 2**63 only */ +#endif } } @@ -2301,11 +2352,18 @@ void helper_fscale(void) { +#ifdef USE_X86LDOUBLE + __asm __volatile__ + ("fscale" + : "=t" (ST0) : "0" (ST0), "u" (ST1)); +#else CPU86_LDouble fpsrcop, fptemp; fpsrcop = 2.0; fptemp = pow(fpsrcop,ST1); ST0 *= fptemp; +#endif + } void helper_fsin(void)