From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.33) id 1BUnFu-0005LR-1w for qemu-devel@nongnu.org; Mon, 31 May 2004 09:55:10 -0400 Received: from exim by lists.gnu.org with spam-scanned (Exim 4.33) id 1BUnFs-0005KN-6W for qemu-devel@nongnu.org; Mon, 31 May 2004 09:55:09 -0400 Received: from [199.232.76.173] (helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.33) id 1BUnFs-0005Jq-3s for qemu-devel@nongnu.org; Mon, 31 May 2004 09:55:08 -0400 Received: from [62.253.162.46] (helo=mta06-svc.ntlworld.com) by monty-python.gnu.org with esmtp (Exim 4.34) id 1BUnFX-0000WU-7R for qemu-devel@nongnu.org; Mon, 31 May 2004 09:54:47 -0400 Received: from [10.10.10.100] ([81.107.87.144]) by mta06-svc.ntlworld.com (InterMail vM.4.01.03.37 201-229-121-137-20020806) with ESMTP id <20040531135451.SGVW9422.mta06-svc.ntlworld.com@[10.10.10.100]> for ; Mon, 31 May 2004 14:54:51 +0100 Subject: Re: [Qemu-devel] Running QEMU on FreeBSD From: Antony T Curtis In-Reply-To: <40BA8D68.3070204@fabianowski.de> References: <1085865953.93476.3.camel@pcgem.rdg.cyberkinetica.com> <40B902F5.30809@fabianowski.de> <1085867455.93476.10.camel@pcgem.rdg.cyberkinetica.com> <40B90776.60406@fabianowski.de> <1085868567.93476.13.camel@pcgem.rdg.cyberkinetica.com> <40B90DB2.3040508@fabianowski.de> <1085872155.93476.18.camel@pcgem.rdg.cyberkinetica.com> <20040530102509.0f234b19.markus.niemisto@gmx.net> <1085910613.94556.3.camel@pcgem.rdg.cyberkinetica.com> <40B9F2A3.5000707@fabianowski.de> <1085938065.347.1.camel@pcgem.rdg.cyberkinetica.com> <40BA2EA1.7020104@fabianowski.de> <1085947772.347.5.camel@pcgem.rdg.cyberkinetica.com> <40BA7E1A.5080005@fabianowski.de> <1085966664.347.8.camel@pcgem.rdg.cyberkinetica.com> <40BA8D68.3070204@fabianowski.de> Content-Type: multipart/mixed; boundary="=-Q4NVqiWNR04V6lkDzLub" Message-Id: <1086011679.347.75.camel@pcgem.rdg.cyberkinetica.com> Mime-Version: 1.0 Date: Mon, 31 May 2004 14:54:39 +0100 Reply-To: qemu-devel@nongnu.org List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel@nongnu.org --=-Q4NVqiWNR04V6lkDzLub Content-Type: text/plain Content-Transfer-Encoding: 7bit On Mon, 2004-05-31 at 02:42, Bartosz Fabianowski wrote: > This fixes the NaN, but reverts to what my hack did - weird rounding. > The total download size for some updates I selected is now reported as > 1.6000000000000003 (that's 14 zeros in between). Not quite sure what's > going wrong here... Ok... I am curious if the following diff helps it (or makes it worse) It is just a quick hack to use the native fpu instructions instead of manual calculation... -- Antony T Curtis --=-Q4NVqiWNR04V6lkDzLub Content-Disposition: attachment; filename=qemu-fpu.diff Content-Type: text/x-patch; name=qemu-fpu.diff; charset=iso-8859-1 Content-Transfer-Encoding: 7bit --- /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) --=-Q4NVqiWNR04V6lkDzLub--