![](https://seccdn.libravatar.org/avatar/af22e20b6884acbc89be6d7736c43e92.jpg?s=120&d=mm&r=g)
Hello community, here is the log from the commit of package aranym checked in at Fri Nov 24 15:50:43 CET 2006. -------- --- aranym/aranym.changes 2006-11-11 19:59:39.000000000 +0100 +++ /mounts/work_src_done/STABLE/STABLE/aranym/aranym.changes 2006-11-24 00:40:42.000000000 +0100 @@ -1,0 +2,6 @@ +Fri Nov 24 00:19:28 CET 2006 - schwab@suse.de + +- Make UAE fpu emulator aliasing safe and use it on ppc. +- Fix some fpu emulation bugs. + +------------------------------------------------------------------- New: ---- aliasing.diff mathlib.diff ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Other differences: ------------------ ++++++ aranym.spec ++++++ --- /var/tmp/diff_new_pack.2CUjdq/_old 2006-11-24 15:50:23.000000000 +0100 +++ /var/tmp/diff_new_pack.2CUjdq/_new 2006-11-24 15:50:23.000000000 +0100 @@ -15,15 +15,17 @@ URL: http://aranym.atari.org/ Summary: ARAnyM (Atari Running on Any Machine) Version: 0.9.4beta -Release: 20 +Release: 26 Group: System/Emulators/Other -License: GNU General Public License (GPL) - all versions, GNU Library General Public License v. 2.0 and 2.1 (LGPL) +License: GNU General Public License (GPL), GNU Library General Public License v. 2.0 and 2.1 (LGPL) Source: %{name}-%{version}.tar.gz Source1: afros-%{version}-1.zip Patch: %{name}-%{version}.diff Patch1: gmtime.diff Patch2: gencpu.diff Patch3: predecrement.diff +Patch4: aliasing.diff +Patch5: mathlib.diff BuildRoot: %{_tmppath}/%{name}-%{version}-build %description @@ -89,6 +91,8 @@ %patch1 %patch2 %patch3 +%patch4 +%patch5 %build autoreconf -fi @@ -105,6 +109,9 @@ --prefix=/usr --mandir=%{_mandir} --disable-nat-debug \ --enable-protect2k --enable-addressing=direct \ --enable-lilo --enable-fullmmu --enable-fixedvideoram \ +%ifarch ppc ppc64 + --enable-fpe=uae \ +%endif --enable-cxx-exceptions make depend make %{?jobs:-j%jobs} @@ -113,6 +120,9 @@ ./configure CFLAGS="$RPM_OPT_FLAGS" CXXFLAGS="$RPM_OPT_FLAGS" \ --prefix=/usr --mandir=%{_mandir} --disable-nat-debug \ --enable-protect2k --enable-addressing=direct \ +%ifarch ppc ppc64 + --enable-fpe=uae \ +%endif --enable-cxx-exceptions make depend make %{?jobs:-j%jobs} @@ -144,6 +154,9 @@ %{_datadir}/aranym %changelog -n aranym +* Fri Nov 24 2006 - schwab@suse.de +- Make UAE fpu emulator aliasing safe and use it on ppc. +- Fix some fpu emulation bugs. * Sat Nov 11 2006 - schwab@suse.de - Fix another emulation bug. * Fri Nov 10 2006 - schwab@suse.de ++++++ aliasing.diff ++++++ --- src/uae_cpu/fpu/fpu_uae.cpp 20 Nov 2005 22:17:54 +0100 1.13 +++ src/uae_cpu/fpu/fpu_uae.cpp 23 Nov 2006 23:29:00 +0100 @@ -240,7 +240,8 @@ PRIVATE inline fpu_register FFPU round_t PRIVATE inline bool FFPU do_isnan(fpu_register const & r) { - uae_u32 * p = (uae_u32 *)&r; + union { fpu_register const *f; uae_u32 const *u; } fu = { &r }; + uae_u32 const * p = fu.u; if ((p[FHI] & 0x7FF00000) == 0x7FF00000) { // logical or is faster here. if ((p[FHI] & 0x000FFFFF) || p[FLO]) { @@ -256,7 +257,8 @@ PRIVATE inline bool FFPU do_isnan(fpu_re PRIVATE inline bool FFPU do_isinf(fpu_register const & r) { - uae_u32 * p = (uae_u32 *)&r; + union { fpu_register const *f; uae_u32 const *u; } fu = { &r }; + uae_u32 const * p = fu.u; if (((p[FHI] & 0x7FF00000) == 0x7FF00000) && p[FLO] == 0) { return true; } @@ -269,7 +271,8 @@ PRIVATE inline bool FFPU do_isinf(fpu_re PRIVATE inline bool FFPU do_isneg(fpu_register const & r) { - uae_u32 * p = (uae_u32 *)&r; + union { fpu_register const *f; uae_u32 const *u; } fu = { &r }; + uae_u32 const * p = fu.u; return ((p[FHI] & 0x80000000) != 0); } @@ -279,7 +282,8 @@ PRIVATE inline bool FFPU do_isneg(fpu_re PRIVATE inline bool FFPU do_iszero(fpu_register const & r) { - uae_u32 * p = (uae_u32 *)&r; + union { fpu_register const *f; uae_u32 const *u; } fu = { &r }; + uae_u32 const * p = fu.u; return (((p[FHI] & 0x7FF00000) == 0) && p[FLO] == 0); } @@ -316,41 +320,47 @@ PRIVATE inline void FFPU get_source_flag PRIVATE inline void FFPU make_nan(fpu_register & r) { - uae_u32 * const p = (uae_u32 *)&r; + union { fpu_register *f; uae_u32 *u; } fu = { &r }; + uae_u32 *p = fu.u; p[FLO] = 0xffffffff; p[FHI] = 0x7fffffff; } PRIVATE inline void FFPU make_zero_positive(fpu_register & r) { - uae_u32 * const p = (uae_u32 *)&r; + union { fpu_register *f; uae_u32 *u; } fu = { &r }; + uae_u32 *p = fu.u; p[FLO] = p[FHI] = 0; } PRIVATE inline void FFPU make_zero_negative(fpu_register & r) { - uae_u32 * const p = (uae_u32 *)&r; + union { fpu_register *f; uae_u32 *u; } fu = { &r }; + uae_u32 *p = fu.u; p[FLO] = 0; p[FHI] = 0x80000000; } PRIVATE inline void FFPU make_inf_positive(fpu_register & r) { - uae_u32 * const p = (uae_u32 *)&r; + union { fpu_register *f; uae_u32 *u; } fu = { &r }; + uae_u32 *p = fu.u; p[FLO] = 0; p[FHI] = 0x7FF00000; } PRIVATE inline void FFPU make_inf_negative(fpu_register & r) { - uae_u32 * const p = (uae_u32 *)&r; + union { fpu_register *f; uae_u32 *u; } fu = { &r }; + uae_u32 *p = fu.u; p[FLO] = 0; p[FHI] = 0xFFF00000; } PRIVATE inline void FFPU fast_scale(fpu_register & r, int add) { - uae_u32 * const p = (uae_u32 *)&r; + union { fpu_register *f; uae_u32 *u; } fu = { &r }; + uae_u32 *p = fu.u; int exp = (p[FHI] & 0x7FF00000) >> 20; // TODO: overflow flags exp += add; @@ -366,7 +376,8 @@ PRIVATE inline void FFPU fast_scale(fpu_ PRIVATE inline fpu_register FFPU fast_fgetexp(fpu_register const & r) { - uae_u32 * const p = (uae_u32 *)&r; + union { fpu_register const *f; uae_u32 const *u; } fu = { &r }; + uae_u32 const *p = fu.u; int exp = (p[FHI] & 0x7FF00000) >> 20; return( exp - 1023 ); } @@ -374,7 +385,8 @@ PRIVATE inline fpu_register FFPU fast_fg // Normalize to range 1..2 PRIVATE inline void FFPU fast_remove_exponent(fpu_register & r) { - uae_u32 * const p = (uae_u32 *)&r; + union { fpu_register *f; uae_u32 *u; } fu = { &r }; + uae_u32 *p = fu.u; p[FHI] = (p[FHI] & 0x800FFFFF) | 0x3FF00000; } @@ -382,8 +394,10 @@ PRIVATE inline void FFPU fast_remove_exp // of the source and destination operands. PRIVATE inline uae_u32 FFPU get_quotient_sign(fpu_register const & ra, fpu_register const & rb) { - uae_u32 * const a = (uae_u32 *)&ra; - uae_u32 * const b = (uae_u32 *)&rb; + union { fpu_register const *f; uae_u32 const *u; } fu = { &ra }; + uae_u32 const *a = fu.u; + fu.f = &rb; + uae_u32 const *b = fu.u; return (((a[FHI] ^ b[FHI]) & 0x80000000) ? FPSR_QUOTIENT_SIGN : 0); } @@ -402,7 +416,8 @@ PRIVATE inline fpu_register FFPU make_si return (0.0); fpu_register result; - uae_u32 * p = (uae_u32 *)&result; + union { fpu_register *f; uae_u32 *u; } fu = { &result }; + uae_u32 * p = fu.u; uae_u32 sign = (value & 0x80000000); uae_u32 exp = ((value & 0x7F800000) >> 23) + 1023 - 127; @@ -422,7 +437,8 @@ PRIVATE inline uae_u32 FFPU extract_sing return 0; uae_u32 result; - uae_u32 *p = (uae_u32 *)&src; + union { fpu_register const *f; uae_u32 const *u; } fu = { &src }; + uae_u32 const *p = fu.u; uae_u32 sign = (p[FHI] & 0x80000000); uae_u32 exp = (p[FHI] & 0x7FF00000) >> 20; @@ -449,8 +465,9 @@ PRIVATE inline fpu_register FFPU make_ex return 0.0; fpu_register result; - uae_u32 *p = (uae_u32 *)&result; - + union { fpu_register *f; uae_u32 *u; } fu = { &result }; + uae_u32 *p = fu.u; + uae_u32 sign = wrd1 & 0x80000000; uae_u32 exp = (wrd1 >> 16) & 0x7fff; @@ -532,7 +549,8 @@ PRIVATE inline void FFPU make_extended_n } // drop the explicit integer bit. - uae_u32 *p = (uae_u32 *)&result; + union { fpu_register *f; uae_u32 *u; } fu = { &result }; + uae_u32 *p = fu.u; p[FLO] = (wrd2 << 21) | (wrd3 >> 11); p[FHI] = sign | (exp << 20) | ((wrd2 & 0x7FFFFFFF) >> 11); @@ -549,8 +567,9 @@ PRIVATE inline void FFPU extract_extende return; } - uae_u32 *p = (uae_u32 *)&src; - + union { fpu_register const *f; uae_u32 const *u; } fu = { &src }; + uae_u32 const *p = fu.u; + fpu_debug(("extract_extended (%X,%X)\n",p[FLO],p[FHI])); uae_u32 sign = p[FHI] & 0x80000000; @@ -578,7 +597,8 @@ PRIVATE inline fpu_register FFPU make_do return 0.0; fpu_register result; - uae_u32 *p = (uae_u32 *)&result; + union { fpu_register *f; uae_u32 *u; } fu = { &result }; + uae_u32 *p = fu.u; p[FLO] = wrd2; p[FHI] = wrd1; @@ -598,7 +618,8 @@ PRIVATE inline void FFPU extract_double( return; } */ - uae_u32 *p = (uae_u32 *)&src; + union { fpu_register const *f; uae_u32 const *u; } fu = { &src }; + uae_u32 const *p = fu.u; *wrd2 = p[FLO]; *wrd1 = p[FHI]; @@ -643,25 +664,25 @@ PRIVATE inline uae_u32 FFPU extract_sing fpu_register src0 = src; #endif - if (src == 0.0) + if (src == 0.0) return 0; - if (src < 0) { + if (src < 0) { tmp = 0x80000000; src = -src; - } else { + } else { tmp = 0; - } - frac = frexp (src, &expon); - frac += 0.5 / 16777216.0; - if (frac >= 1.0) { + } + frac = frexp (src, &expon); + frac += 0.5 / 16777216.0; + if (frac >= 1.0) { frac /= 2.0; expon++; - } + } result = tmp | (((expon + 127 - 1) & 0xff) << 23) | (((int) (frac * 16777216.0)) & 0x7fffff); // fpu_debug(("extract_single (%.04f) = %X\n",(float)src0,result)); - return (result); + return (result); } // to exten @@ -874,8 +895,8 @@ PRIVATE inline int FFPU get_fp_value (ua int mode; int reg; uae_u32 ad = 0; - static int sz1[8] = {4, 4, 12, 12, 2, 8, 1, 0}; - static int sz2[8] = {4, 4, 12, 12, 2, 8, 2, 0}; + static const int sz1[8] = {4, 4, 12, 12, 2, 8, 1, 0}; + static const int sz2[8] = {4, 4, 12, 12, 2, 8, 2, 0}; // fpu_debug(("get_fp_value(%X,%X)\n",(int)opcode,(int)extra)); // dump_first_bytes( regs.pc_p-4, 16 ); @@ -1021,8 +1042,8 @@ PRIVATE inline int FFPU put_fp_value (ua int mode; int reg; uae_u32 ad; - static int sz1[8] = {4, 4, 12, 12, 2, 8, 1, 0}; - static int sz2[8] = {4, 4, 12, 12, 2, 8, 2, 0}; + static const int sz1[8] = {4, 4, 12, 12, 2, 8, 1, 0}; + static const int sz2[8] = {4, 4, 12, 12, 2, 8, 2, 0}; // fpu_debug(("put_fp_value(%.04f,%X,%X)\n",(float)value,(int)opcode,(int)extra)); @@ -2466,10 +2487,10 @@ void FFPU fpuop_arithmetic(uae_u32 opcod m68k_setpc (m68k_getpc () - 4); op_illg (opcode); break; - } - fpu_debug(("END m68k_getpc()=%X\n",m68k_getpc())); - dump_registers( "END "); - return; + } + fpu_debug(("END m68k_getpc()=%X\n",m68k_getpc())); + dump_registers( "END "); + return; } fpu_debug(("ILLEGAL F OP 2 %X\n",opcode)); ++++++ mathlib.diff ++++++ 2006/11/18 - Petr - Bill Allombert's patches fix several FPU emulation errors: FCMP (Octave didn't even start), FETOX and ATANH (the latest fixed by correcting function fp_sgn1()). Index: src/uae_cpu/fpu/mathlib.h =================================================================== RCS file: /var/repos/aranym/src/uae_cpu/fpu/mathlib.h,v retrieving revision 1.10 retrieving revision 1.13 diff -u -a -p -a -u -p -r1.10 -r1.13 --- src/uae_cpu/fpu/mathlib.h 12 Jan 2005 10:56:03 -0000 1.10 +++ src/uae_cpu/fpu/mathlib.h 19 Nov 2006 12:03:06 -0000 1.13 @@ -833,6 +833,13 @@ PRIVATE fpu_extended fp_do_exp(fpu_exten PRIVATE inline fpu_extended fp_do_exp(fpu_extended x) { fpu_extended value, exponent; + if (isinf(x)) + { + if(isneg(x)) + return 0.; + else + return x; + } __asm__ __volatile__("fldl2e # e^x = 2^(x * log2(e))\n\t" "fmul %%st(1) # x * log2(e)\n\t" "fst %%st(1)\n\t" @@ -909,6 +916,13 @@ PRIVATE inline fpu_extended fp_do_tan(fp PRIVATE inline fpu_extended fp_do_expm1(fpu_extended x) { fpu_extended value, exponent, temp; + if (isinf(x)) + { + if(isneg(x)) + return -1.; + else + return x; + } __asm__ __volatile__("fldl2e # e^x - 1 = 2^(x * log2(e)) - 1\n\t" "fmul %%st(1) # x * log2(e)\n\t" "fst %%st(1)\n\t" @@ -930,11 +944,11 @@ PRIVATE inline fpu_extended fp_do_sgn1(f { #if USE_LONG_DOUBLE || USE_QUAD_DOUBLE fp_declare_init_shape(sxp, x, extended); - sxp->ieee_nan.exponent = FP_EXTENDED_EXP_MAX; + sxp->ieee_nan.exponent = FP_EXTENDED_EXP_MAX>>1; sxp->ieee_nan.one = 1; #else fp_declare_init_shape(sxp, x, double); - sxp->ieee_nan.exponent = FP_DOUBLE_EXP_MAX; + sxp->ieee_nan.exponent = FP_DOUBLE_EXP_MAX>>1; #endif sxp->ieee_nan.quiet_nan = 0; sxp->ieee_nan.mantissa0 = 0; @@ -951,10 +965,9 @@ PRIVATE fpu_extended fp_do_sinh(fpu_exte #else PRIVATE inline fpu_extended fp_do_sinh(fpu_extended x) { - fpu_extended ex = fp_exp(x); - return 0.5 * (ex - 1.0 / ex); -/* fpu_extended exm1 = fp_expm1(fp_fabs(x)); - return 0.5 * (exm1 / (exm1 + 1.0) + exm1) * fp_sgn1(x); */ + if (isinf(x)) return x; + fpu_extended exm1 = fp_expm1(fp_fabs(x)); + return 0.5 * (exm1 / (exm1 + 1.0) + exm1) * fp_sgn1(x); } #endif @@ -981,10 +994,8 @@ PRIVATE fpu_extended fp_do_tanh(fpu_exte #else PRIVATE inline fpu_extended fp_do_tanh(fpu_extended x) { - fpu_extended ex = fp_exp(2.0 * x); - return (ex - 1.0) / (ex + 1.0); -/* fpu_extended exm1 = fp_expm1(-fp_fabs(x + x)); - return exm1 / (exm1 + 2.0) * fp_sgn1(-x); */ + fpu_extended exm1 = fp_expm1(-fp_fabs(x + x)); + return exm1 / (exm1 + 2.0) * fp_sgn1(-x); } #endif ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ Remember to have fun... --------------------------------------------------------------------- To unsubscribe, e-mail: opensuse-commit+unsubscribe@opensuse.org For additional commands, e-mail: opensuse-commit+help@opensuse.org
participants (1)
-
root@suse.de