From nobody Mon Apr 29 13:47:32 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1520605709501749.401958756247; Fri, 9 Mar 2018 06:28:29 -0800 (PST) Received: from localhost ([::1]:45577 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euJ0W-000275-Mi for importer@patchew.org; Fri, 09 Mar 2018 09:28:28 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58908) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euIyq-0000vf-1H for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:26:44 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1euIym-0007Bb-0I for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:26:43 -0500 Received: from mout.kundenserver.de ([217.72.192.75]:50665) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1euIyl-0007AR-NJ for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:26:39 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue105 [212.227.15.183]) with ESMTPSA (Nemesis) id 0LxwHc-1eZMJl0Bz2-015HCH; Fri, 09 Mar 2018 15:26:37 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Fri, 9 Mar 2018 15:26:23 +0100 Message-Id: <20180309142630.2170-2-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180309142630.2170-1-laurent@vivier.eu> References: <20180309142630.2170-1-laurent@vivier.eu> X-Provags-ID: V03:K0:dwpV5mhn2taJ0Z3UIXH3vVba2sQmYl2x7+0zyCYNM4+H+tDvpeC CsXV6OzGZ3vXhfeMNIa4n02kdcDcsF6HJECrie/JzvglCMAIkl35mZ2q1D9sTAs+q0ZRGti mE7FupliNpjLTY9fkfJsUvwlVRYuXiE5JA6Eexmgmy7kjg1vBc9IKUSx51aRS30abI6ZDTn kkI5QEkroIOJ0rthsTYEQ== X-UI-Out-Filterresults: notjunk:1;V01:K0:MCwzZ6xI4y8=:smQCRD13+vvCpPhaVtkI0e 3TigoXYkqKJ+u+Axg5Kho+EBsA0UAnt3eOt8hc5B5KWgGfXoTIOFy0yhYj/fWZXQQCgH6DWH0 132EpBF5LL85oKdCsh3Hs+8QjaDcepoG60VCSOAGD247lm6hap9A8x+utXgP9xr223YOzk/TR py63leWFOxcUclfTZKNhmps9zFiaRtacvmGYpzFjLC8X0FwzFgAG3JwnouLnEzHxmasHnSzUr kD61NzZ2b6rzWKBqr5gnLGKRuGa9UDMUgfaR4kizo9wjcC3VoGk6kKgitMahJFgv7UrVleKrA HyMxXLwMM8QBsf16W61d3x1Gz+cw+rNl/4A8ze9tARR0KLh1+sALByry9gnekmy6cGnUPBGBf z9e7ftbah5QtIfyR6NcMKkZpJ4uP6kSTIGDjRdsJLrMqqhqFfWLCypLVxZ/5WdLtKx7ve7ddY 7yz/KbzFiq3qZWUXGDlmFZXXXbt6K6Bnb4bfXceeJhyTbT9fW5dylkINovPlWzCjBsCz3hx8M Gvvx1alExn6maTAGWRZBOy84o50CTI4PF/rBsrGzCjOzKkGTNUWqdFmc3IGLjpu/Qnx/U3G+q jXrOHna/Ugi9HAlgMo+RzusgyzR9XvVeTwApKAnpT5K/QpbaU50+CnhcsCKvttrZRsE2NZV/7 gjmfSDVERu0CPeT2GSlEFOfRiycAjzMFJXl4MdgVgN+S3i7LHzOWzoUZd0Q0tD2HKbQm1y6z/ BRyvo7IA016VBwWg8wp/kfuPC77DK7t680EXOg== X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 217.72.192.75 Subject: [Qemu-devel] [PULL 1/8] target/m68k: define floatx80_move() X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laurent Vivier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" This functions is needed by upcoming m68k softfloat functions. Source code copied for WinUAE (tag 3500) (The WinUAE file has been copied from QEMU and has the QEMU licensing notice) Signed-off-by: Laurent Vivier Message-Id: <20180305203910.10391-2-laurent@vivier.eu> --- target/m68k/softfloat.c | 27 +++++++++++++++++++++++++++ target/m68k/softfloat.h | 1 + 2 files changed, 28 insertions(+) diff --git a/target/m68k/softfloat.c b/target/m68k/softfloat.c index 9cb141900c..55eb7a260a 100644 --- a/target/m68k/softfloat.c +++ b/target/m68k/softfloat.c @@ -247,3 +247,30 @@ floatx80 floatx80_scale(floatx80 a, floatx80 b, float_= status *status) return roundAndPackFloatx80(status->floatx80_rounding_precision, aSign, aExp, aSig, 0, status); } + +floatx80 floatx80_move(floatx80 a, float_status *status) +{ + flag aSign; + int32_t aExp; + uint64_t aSig; + + aSig =3D extractFloatx80Frac(a); + aExp =3D extractFloatx80Exp(a); + aSign =3D extractFloatx80Sign(a); + + if (aExp =3D=3D 0x7FFF) { + if ((uint64_t)(aSig << 1)) { + return propagateFloatx80NaNOneArg(a, status); + } + return a; + } + if (aExp =3D=3D 0) { + if (aSig =3D=3D 0) { + return a; + } + normalizeRoundAndPackFloatx80(status->floatx80_rounding_precision, + aSign, aExp, aSig, 0, status); + } + return roundAndPackFloatx80(status->floatx80_rounding_precision, aSign, + aExp, aSig, 0, status); +} diff --git a/target/m68k/softfloat.h b/target/m68k/softfloat.h index 78fbc0cd0c..18561b870d 100644 --- a/target/m68k/softfloat.h +++ b/target/m68k/softfloat.h @@ -26,4 +26,5 @@ floatx80 floatx80_mod(floatx80 a, floatx80 b, float_statu= s *status); floatx80 floatx80_getman(floatx80 a, float_status *status); floatx80 floatx80_getexp(floatx80 a, float_status *status); floatx80 floatx80_scale(floatx80 a, floatx80 b, float_status *status); +floatx80 floatx80_move(floatx80 a, float_status *status); #endif --=20 2.14.3 From nobody Mon Apr 29 13:47:32 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1520605997645439.31478103045924; Fri, 9 Mar 2018 06:33:17 -0800 (PST) Received: from localhost ([::1]:45606 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euJ55-0005w9-OQ for importer@patchew.org; Fri, 09 Mar 2018 09:33:11 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58932) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euIyq-0000w4-PD for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:26:47 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1euIym-0007Bs-Mf for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:26:44 -0500 Received: from mout.kundenserver.de ([217.72.192.74]:36887) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1euIyl-0007Ai-VU for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:26:40 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue105 [212.227.15.183]) with ESMTPSA (Nemesis) id 0MDPjh-1etUZ6274v-00GsRA; Fri, 09 Mar 2018 15:26:38 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Fri, 9 Mar 2018 15:26:24 +0100 Message-Id: <20180309142630.2170-3-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180309142630.2170-1-laurent@vivier.eu> References: <20180309142630.2170-1-laurent@vivier.eu> X-Provags-ID: V03:K0:1CQtluVbMSaeHR/RktzXCiYU2rESgLtqzAha7+DAM2qdmECC4UB S5FwVA21xty95DJsh1poTDFJX6m499MJtnGbDMMD0Fd18Ma6RR909A0q640P3H4g+zGb74a chU3Ox0RXu5QD4Z6r0o4R/wZuiY0a3YpoP1rLZ3ZOiGfh5Vk4YoGB7tAYLIHYmsm902USVu aXJy2QMjjAvzCOmI+9XPw== X-UI-Out-Filterresults: notjunk:1;V01:K0:j6oDzRG4Hzw=:Ob7hwGuT2v651Wd4WN7fff KRkyO9Ms9XtKyF1PtjJw/QvMWf5cRk704RVPf6kR9DkAo+JIkJTPI6Tt22lSamsdmloo7jbvj VKVoNlR+gvI3dY7tB0X80GgsY8Y66p9gz4VbhXuTUcFpHN6zM8nKAZy0p/P2QEocvFUhMGXoG a93HlHz1zZzKwbL5iiQXmQDDl1XFBoDlw87wNgp8m4FvR4NqMJnuwES190N/Omn8wi0a2D8qD OAoVN3okZ5wUTobFw7SHHm1FQWXcijdmlpawEdrbUnEXIWj8+q/wWs/6KvVArDumnnX4lhGl5 GxDUAGgvEB4Su//vnIsX5yE1Wyov9o3Mp42sdjbWdIjXszOq/8jZTfoWydD6f/VnH5+h07QgE F1fb7BJN6ynLHtPTuWibrZkD6aW0/B7WLbMxmT6+6DB81SWeaPUSdjJaejXmMdpGn0GHmXfI3 ThX3D9GlBrRQDRW67C1VEHCTvjjteQIoGJ+vhjtycvM7VTvYbzUvVjMYwrWdIt/tIk9QUmodq cZNCHJUYvIjTEkrQ7STL2tcEAfU7HcUbf3LBnTWoxjLWxt6IZA4RGVc8XvLTn6Tfbei6NL4QR PNg9Lre/kl37fuVROYfWzU+8yN4r6oPZV8LtjZzLwFqAZRe6fEyXLHMWVYmVpv9ClOTg7k2N2 SFXA858C3mANnrF5e3eJA6yjDHA6CIzRai2QqY9KJR6rVCdnaexQZsNgNmENG4WBCcvn05bEd bmYnovH8prQCo+jqp/dRhml84xVGJMt+Eqrx5A== X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 217.72.192.74 Subject: [Qemu-devel] [PULL 2/8] target/m68k: implement flognp1 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laurent Vivier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Using a local m68k floatx80_lognp1() [copied from previous: Written by Andreas Grabher for Previous, NeXT Computer Emulator.] Signed-off-by: Laurent Vivier Message-Id: <20180305203910.10391-3-laurent@vivier.eu> --- target/m68k/fpu_helper.c | 5 + target/m68k/helper.h | 1 + target/m68k/softfloat.c | 216 ++++++++++++++++++++++++++++++++= ++++ target/m68k/softfloat.h | 1 + target/m68k/softfloat_fpsp_tables.h | 154 +++++++++++++++++++++++++ target/m68k/translate.c | 3 + 6 files changed, 380 insertions(+) create mode 100755 target/m68k/softfloat_fpsp_tables.h diff --git a/target/m68k/fpu_helper.c b/target/m68k/fpu_helper.c index cdb9b50462..614064612e 100644 --- a/target/m68k/fpu_helper.c +++ b/target/m68k/fpu_helper.c @@ -557,3 +557,8 @@ void HELPER(fscale)(CPUM68KState *env, FPReg *res, FPRe= g *val0, FPReg *val1) { res->d =3D floatx80_scale(val1->d, val0->d, &env->fp_status); } + +void HELPER(flognp1)(CPUM68KState *env, FPReg *res, FPReg *val) +{ + res->d =3D floatx80_lognp1(val->d, &env->fp_status); +} diff --git a/target/m68k/helper.h b/target/m68k/helper.h index c348dced3a..f7e6fc8c40 100644 --- a/target/m68k/helper.h +++ b/target/m68k/helper.h @@ -68,6 +68,7 @@ DEF_HELPER_4(frem, void, env, fp, fp, fp) DEF_HELPER_3(fgetexp, void, env, fp, fp) DEF_HELPER_3(fgetman, void, env, fp, fp) DEF_HELPER_4(fscale, void, env, fp, fp, fp) +DEF_HELPER_3(flognp1, void, env, fp, fp) =20 DEF_HELPER_3(mac_move, void, env, i32, i32) DEF_HELPER_3(macmulf, i64, env, i32, i32) diff --git a/target/m68k/softfloat.c b/target/m68k/softfloat.c index 55eb7a260a..834db12964 100644 --- a/target/m68k/softfloat.c +++ b/target/m68k/softfloat.c @@ -21,6 +21,7 @@ #include "qemu/osdep.h" #include "softfloat.h" #include "fpu/softfloat-macros.h" +#include "softfloat_fpsp_tables.h" =20 static floatx80 propagateFloatx80NaNOneArg(floatx80 a, float_status *statu= s) { @@ -274,3 +275,218 @@ floatx80 floatx80_move(floatx80 a, float_status *stat= us) return roundAndPackFloatx80(status->floatx80_rounding_precision, aSign, aExp, aSig, 0, status); } + +/*------------------------------------------------------------------------= ---- +| Algorithms for transcendental functions supported by MC68881 and MC68882 +| mathematical coprocessors. The functions are derived from FPSP library. +*-------------------------------------------------------------------------= ---*/ + +#define one_exp 0x3FFF +#define one_sig LIT64(0x8000000000000000) + +/*------------------------------------------------------------------------= ---- + | Function for compactifying extended double-precision floating point val= ues. + *------------------------------------------------------------------------= ----*/ + +static int32_t floatx80_make_compact(int32_t aExp, uint64_t aSig) +{ + return (aExp << 16) | (aSig >> 48); +} + +/*------------------------------------------------------------------------= ---- + | Log base e of x plus 1 + *------------------------------------------------------------------------= ----*/ + +floatx80 floatx80_lognp1(floatx80 a, float_status *status) +{ + flag aSign; + int32_t aExp; + uint64_t aSig, fSig; + + int8_t user_rnd_mode, user_rnd_prec; + + int32_t compact, j, k; + floatx80 fp0, fp1, fp2, fp3, f, logof2, klog2, saveu; + + aSig =3D extractFloatx80Frac(a); + aExp =3D extractFloatx80Exp(a); + aSign =3D extractFloatx80Sign(a); + + if (aExp =3D=3D 0x7FFF) { + if ((uint64_t) (aSig << 1)) { + propagateFloatx80NaNOneArg(a, status); + } + if (aSign) { + float_raise(float_flag_invalid, status); + return floatx80_default_nan(status); + } + return packFloatx80(0, floatx80_infinity.high, floatx80_infinity.l= ow); + } + + if (aExp =3D=3D 0 && aSig =3D=3D 0) { + return packFloatx80(aSign, 0, 0); + } + + if (aSign && aExp >=3D one_exp) { + if (aExp =3D=3D one_exp && aSig =3D=3D one_sig) { + float_raise(float_flag_divbyzero, status); + packFloatx80(aSign, floatx80_infinity.high, floatx80_infinity.= low); + } + float_raise(float_flag_invalid, status); + return floatx80_default_nan(status); + } + + if (aExp < 0x3f99 || (aExp =3D=3D 0x3f99 && aSig =3D=3D one_sig)) { + /* <=3D min threshold */ + float_raise(float_flag_inexact, status); + return floatx80_move(a, status); + } + + user_rnd_mode =3D status->float_rounding_mode; + user_rnd_prec =3D status->floatx80_rounding_precision; + status->float_rounding_mode =3D float_round_nearest_even; + status->floatx80_rounding_precision =3D 80; + + compact =3D floatx80_make_compact(aExp, aSig); + + fp0 =3D a; /* Z */ + fp1 =3D a; + + fp0 =3D floatx80_add(fp0, float32_to_floatx80(make_float32(0x3F800000), + status), status); /* X =3D (1+Z) */ + + aExp =3D extractFloatx80Exp(fp0); + aSig =3D extractFloatx80Frac(fp0); + + compact =3D floatx80_make_compact(aExp, aSig); + + if (compact < 0x3FFE8000 || compact > 0x3FFFC000) { + /* |X| < 1/2 or |X| > 3/2 */ + k =3D aExp - 0x3FFF; + fp1 =3D int32_to_floatx80(k, status); + + fSig =3D (aSig & LIT64(0xFE00000000000000)) | LIT64(0x010000000000= 0000); + j =3D (fSig >> 56) & 0x7E; /* DISPLACEMENT FOR 1/F */ + + f =3D packFloatx80(0, 0x3FFF, fSig); /* F */ + fp0 =3D packFloatx80(0, 0x3FFF, aSig); /* Y */ + + fp0 =3D floatx80_sub(fp0, f, status); /* Y-F */ + + lp1cont1: + /* LP1CONT1 */ + fp0 =3D floatx80_mul(fp0, log_tbl[j], status); /* FP0 IS U =3D (Y-= F)/F */ + logof2 =3D packFloatx80(0, 0x3FFE, LIT64(0xB17217F7D1CF79AC)); + klog2 =3D floatx80_mul(fp1, logof2, status); /* FP1 IS K*LOG2 */ + fp2 =3D floatx80_mul(fp0, fp0, status); /* FP2 IS V=3DU*U */ + + fp3 =3D fp2; + fp1 =3D fp2; + + fp1 =3D floatx80_mul(fp1, float64_to_floatx80( + make_float64(0x3FC2499AB5E4040B), status), + status); /* V*A6 */ + fp2 =3D floatx80_mul(fp2, float64_to_floatx80( + make_float64(0xBFC555B5848CB7DB), status), + status); /* V*A5 */ + fp1 =3D floatx80_add(fp1, float64_to_floatx80( + make_float64(0x3FC99999987D8730), status), + status); /* A4+V*A6 */ + fp2 =3D floatx80_add(fp2, float64_to_floatx80( + make_float64(0xBFCFFFFFFF6F7E97), status), + status); /* A3+V*A5 */ + fp1 =3D floatx80_mul(fp1, fp3, status); /* V*(A4+V*A6) */ + fp2 =3D floatx80_mul(fp2, fp3, status); /* V*(A3+V*A5) */ + fp1 =3D floatx80_add(fp1, float64_to_floatx80( + make_float64(0x3FD55555555555A4), status), + status); /* A2+V*(A4+V*A6) */ + fp2 =3D floatx80_add(fp2, float64_to_floatx80( + make_float64(0xBFE0000000000008), status), + status); /* A1+V*(A3+V*A5) */ + fp1 =3D floatx80_mul(fp1, fp3, status); /* V*(A2+V*(A4+V*A6)) */ + fp2 =3D floatx80_mul(fp2, fp3, status); /* V*(A1+V*(A3+V*A5)) */ + fp1 =3D floatx80_mul(fp1, fp0, status); /* U*V*(A2+V*(A4+V*A6)) */ + fp0 =3D floatx80_add(fp0, fp2, status); /* U+V*(A1+V*(A3+V*A5)) */ + + fp1 =3D floatx80_add(fp1, log_tbl[j + 1], + status); /* LOG(F)+U*V*(A2+V*(A4+V*A6)) */ + fp0 =3D floatx80_add(fp0, fp1, status); /* FP0 IS LOG(F) + LOG(1+U= ) */ + + status->float_rounding_mode =3D user_rnd_mode; + status->floatx80_rounding_precision =3D user_rnd_prec; + + a =3D floatx80_add(fp0, klog2, status); + + float_raise(float_flag_inexact, status); + + return a; + } else if (compact < 0x3FFEF07D || compact > 0x3FFF8841) { + /* |X| < 1/16 or |X| > -1/16 */ + /* LP1CARE */ + fSig =3D (aSig & LIT64(0xFE00000000000000)) | LIT64(0x010000000000= 0000); + f =3D packFloatx80(0, 0x3FFF, fSig); /* F */ + j =3D (fSig >> 56) & 0x7E; /* DISPLACEMENT FOR 1/F */ + + if (compact >=3D 0x3FFF8000) { /* 1+Z >=3D 1 */ + /* KISZERO */ + fp0 =3D floatx80_sub(float32_to_floatx80(make_float32(0x3F8000= 00), + status), f, status); /* 1-F */ + fp0 =3D floatx80_add(fp0, fp1, status); /* FP0 IS Y-F =3D (1-F= )+Z */ + fp1 =3D packFloatx80(0, 0, 0); /* K =3D 0 */ + } else { + /* KISNEG */ + fp0 =3D floatx80_sub(float32_to_floatx80(make_float32(0x400000= 00), + status), f, status); /* 2-F */ + fp1 =3D floatx80_add(fp1, fp1, status); /* 2Z */ + fp0 =3D floatx80_add(fp0, fp1, status); /* FP0 IS Y-F =3D (2-F= )+2Z */ + fp1 =3D packFloatx80(1, one_exp, one_sig); /* K =3D -1 */ + } + goto lp1cont1; + } else { + /* LP1ONE16 */ + fp1 =3D floatx80_add(fp1, fp1, status); /* FP1 IS 2Z */ + fp0 =3D floatx80_add(fp0, float32_to_floatx80(make_float32(0x3F800= 000), + status), status); /* FP0 IS 1+X */ + + /* LP1CONT2 */ + fp1 =3D floatx80_div(fp1, fp0, status); /* U */ + saveu =3D fp1; + fp0 =3D floatx80_mul(fp1, fp1, status); /* FP0 IS V =3D U*U */ + fp1 =3D floatx80_mul(fp0, fp0, status); /* FP1 IS W =3D V*V */ + + fp3 =3D float64_to_floatx80(make_float64(0x3F175496ADD7DAD6), + status); /* B5 */ + fp2 =3D float64_to_floatx80(make_float64(0x3F3C71C2FE80C7E0), + status); /* B4 */ + fp3 =3D floatx80_mul(fp3, fp1, status); /* W*B5 */ + fp2 =3D floatx80_mul(fp2, fp1, status); /* W*B4 */ + fp3 =3D floatx80_add(fp3, float64_to_floatx80( + make_float64(0x3F624924928BCCFF), status), + status); /* B3+W*B5 */ + fp2 =3D floatx80_add(fp2, float64_to_floatx80( + make_float64(0x3F899999999995EC), status), + status); /* B2+W*B4 */ + fp1 =3D floatx80_mul(fp1, fp3, status); /* W*(B3+W*B5) */ + fp2 =3D floatx80_mul(fp2, fp0, status); /* V*(B2+W*B4) */ + fp1 =3D floatx80_add(fp1, float64_to_floatx80( + make_float64(0x3FB5555555555555), status), + status); /* B1+W*(B3+W*B5) */ + + fp0 =3D floatx80_mul(fp0, saveu, status); /* FP0 IS U*V */ + fp1 =3D floatx80_add(fp1, fp2, + status); /* B1+W*(B3+W*B5) + V*(B2+W*B4) */ + fp0 =3D floatx80_mul(fp0, fp1, + status); /* U*V*([B1+W*(B3+W*B5)] + [V*(B2+W*B4= )]) */ + + status->float_rounding_mode =3D user_rnd_mode; + status->floatx80_rounding_precision =3D user_rnd_prec; + + a =3D floatx80_add(fp0, saveu, status); + + /*if (!floatx80_is_zero(a)) { */ + float_raise(float_flag_inexact, status); + /*} */ + + return a; + } +} diff --git a/target/m68k/softfloat.h b/target/m68k/softfloat.h index 18561b870d..4d74eaf862 100644 --- a/target/m68k/softfloat.h +++ b/target/m68k/softfloat.h @@ -27,4 +27,5 @@ floatx80 floatx80_getman(floatx80 a, float_status *status= ); floatx80 floatx80_getexp(floatx80 a, float_status *status); floatx80 floatx80_scale(floatx80 a, floatx80 b, float_status *status); floatx80 floatx80_move(floatx80 a, float_status *status); +floatx80 floatx80_lognp1(floatx80 a, float_status *status); #endif diff --git a/target/m68k/softfloat_fpsp_tables.h b/target/m68k/softfloat_fp= sp_tables.h new file mode 100755 index 0000000000..a87179e11e --- /dev/null +++ b/target/m68k/softfloat_fpsp_tables.h @@ -0,0 +1,154 @@ +/* + * Ported from a work by Andreas Grabher for Previous, NeXT Computer Emula= tor, + * derived from NetBSD M68040 FPSP functions, + * derived from release 2a of the SoftFloat IEC/IEEE Floating-point Arithm= etic + * Package. Those parts of the code (and some later contributions) are + * provided under that license, as detailed below. + * It has subsequently been modified by contributors to the QEMU Project, + * so some portions are provided under: + * the SoftFloat-2a license + * the BSD license + * GPL-v2-or-later + * + * Any future contributions to this file will be taken to be licensed under + * the Softfloat-2a license unless specifically indicated otherwise. + */ + +/* Portions of this work are licensed under the terms of the GNU GPL, + * version 2 or later. See the COPYING file in the top-level directory. + */ + +#ifndef TARGET_M68K_SOFTFLOAT_FPSP_TABLES_H +#define TARGET_M68K_SOFTFLOAT_FPSP_TABLES_H + +static const floatx80 log_tbl[128] =3D { + make_floatx80_init(0x3FFE, 0xFE03F80FE03F80FE), + make_floatx80_init(0x3FF7, 0xFF015358833C47E2), + make_floatx80_init(0x3FFE, 0xFA232CF252138AC0), + make_floatx80_init(0x3FF9, 0xBDC8D83EAD88D549), + make_floatx80_init(0x3FFE, 0xF6603D980F6603DA), + make_floatx80_init(0x3FFA, 0x9CF43DCFF5EAFD48), + make_floatx80_init(0x3FFE, 0xF2B9D6480F2B9D65), + make_floatx80_init(0x3FFA, 0xDA16EB88CB8DF614), + make_floatx80_init(0x3FFE, 0xEF2EB71FC4345238), + make_floatx80_init(0x3FFB, 0x8B29B7751BD70743), + make_floatx80_init(0x3FFE, 0xEBBDB2A5C1619C8C), + make_floatx80_init(0x3FFB, 0xA8D839F830C1FB49), + make_floatx80_init(0x3FFE, 0xE865AC7B7603A197), + make_floatx80_init(0x3FFB, 0xC61A2EB18CD907AD), + make_floatx80_init(0x3FFE, 0xE525982AF70C880E), + make_floatx80_init(0x3FFB, 0xE2F2A47ADE3A18AF), + make_floatx80_init(0x3FFE, 0xE1FC780E1FC780E2), + make_floatx80_init(0x3FFB, 0xFF64898EDF55D551), + make_floatx80_init(0x3FFE, 0xDEE95C4CA037BA57), + make_floatx80_init(0x3FFC, 0x8DB956A97B3D0148), + make_floatx80_init(0x3FFE, 0xDBEB61EED19C5958), + make_floatx80_init(0x3FFC, 0x9B8FE100F47BA1DE), + make_floatx80_init(0x3FFE, 0xD901B2036406C80E), + make_floatx80_init(0x3FFC, 0xA9372F1D0DA1BD17), + make_floatx80_init(0x3FFE, 0xD62B80D62B80D62C), + make_floatx80_init(0x3FFC, 0xB6B07F38CE90E46B), + make_floatx80_init(0x3FFE, 0xD3680D3680D3680D), + make_floatx80_init(0x3FFC, 0xC3FD032906488481), + make_floatx80_init(0x3FFE, 0xD0B69FCBD2580D0B), + make_floatx80_init(0x3FFC, 0xD11DE0FF15AB18CA), + make_floatx80_init(0x3FFE, 0xCE168A7725080CE1), + make_floatx80_init(0x3FFC, 0xDE1433A16C66B150), + make_floatx80_init(0x3FFE, 0xCB8727C065C393E0), + make_floatx80_init(0x3FFC, 0xEAE10B5A7DDC8ADD), + make_floatx80_init(0x3FFE, 0xC907DA4E871146AD), + make_floatx80_init(0x3FFC, 0xF7856E5EE2C9B291), + make_floatx80_init(0x3FFE, 0xC6980C6980C6980C), + make_floatx80_init(0x3FFD, 0x82012CA5A68206D7), + make_floatx80_init(0x3FFE, 0xC4372F855D824CA6), + make_floatx80_init(0x3FFD, 0x882C5FCD7256A8C5), + make_floatx80_init(0x3FFE, 0xC1E4BBD595F6E947), + make_floatx80_init(0x3FFD, 0x8E44C60B4CCFD7DE), + make_floatx80_init(0x3FFE, 0xBFA02FE80BFA02FF), + make_floatx80_init(0x3FFD, 0x944AD09EF4351AF6), + make_floatx80_init(0x3FFE, 0xBD69104707661AA3), + make_floatx80_init(0x3FFD, 0x9A3EECD4C3EAA6B2), + make_floatx80_init(0x3FFE, 0xBB3EE721A54D880C), + make_floatx80_init(0x3FFD, 0xA0218434353F1DE8), + make_floatx80_init(0x3FFE, 0xB92143FA36F5E02E), + make_floatx80_init(0x3FFD, 0xA5F2FCABBBC506DA), + make_floatx80_init(0x3FFE, 0xB70FBB5A19BE3659), + make_floatx80_init(0x3FFD, 0xABB3B8BA2AD362A5), + make_floatx80_init(0x3FFE, 0xB509E68A9B94821F), + make_floatx80_init(0x3FFD, 0xB1641795CE3CA97B), + make_floatx80_init(0x3FFE, 0xB30F63528917C80B), + make_floatx80_init(0x3FFD, 0xB70475515D0F1C61), + make_floatx80_init(0x3FFE, 0xB11FD3B80B11FD3C), + make_floatx80_init(0x3FFD, 0xBC952AFEEA3D13E1), + make_floatx80_init(0x3FFE, 0xAF3ADDC680AF3ADE), + make_floatx80_init(0x3FFD, 0xC2168ED0F458BA4A), + make_floatx80_init(0x3FFE, 0xAD602B580AD602B6), + make_floatx80_init(0x3FFD, 0xC788F439B3163BF1), + make_floatx80_init(0x3FFE, 0xAB8F69E28359CD11), + make_floatx80_init(0x3FFD, 0xCCECAC08BF04565D), + make_floatx80_init(0x3FFE, 0xA9C84A47A07F5638), + make_floatx80_init(0x3FFD, 0xD24204872DD85160), + make_floatx80_init(0x3FFE, 0xA80A80A80A80A80B), + make_floatx80_init(0x3FFD, 0xD78949923BC3588A), + make_floatx80_init(0x3FFE, 0xA655C4392D7B73A8), + make_floatx80_init(0x3FFD, 0xDCC2C4B49887DACC), + make_floatx80_init(0x3FFE, 0xA4A9CF1D96833751), + make_floatx80_init(0x3FFD, 0xE1EEBD3E6D6A6B9E), + make_floatx80_init(0x3FFE, 0xA3065E3FAE7CD0E0), + make_floatx80_init(0x3FFD, 0xE70D785C2F9F5BDC), + make_floatx80_init(0x3FFE, 0xA16B312EA8FC377D), + make_floatx80_init(0x3FFD, 0xEC1F392C5179F283), + make_floatx80_init(0x3FFE, 0x9FD809FD809FD80A), + make_floatx80_init(0x3FFD, 0xF12440D3E36130E6), + make_floatx80_init(0x3FFE, 0x9E4CAD23DD5F3A20), + make_floatx80_init(0x3FFD, 0xF61CCE92346600BB), + make_floatx80_init(0x3FFE, 0x9CC8E160C3FB19B9), + make_floatx80_init(0x3FFD, 0xFB091FD38145630A), + make_floatx80_init(0x3FFE, 0x9B4C6F9EF03A3CAA), + make_floatx80_init(0x3FFD, 0xFFE97042BFA4C2AD), + make_floatx80_init(0x3FFE, 0x99D722DABDE58F06), + make_floatx80_init(0x3FFE, 0x825EFCED49369330), + make_floatx80_init(0x3FFE, 0x9868C809868C8098), + make_floatx80_init(0x3FFE, 0x84C37A7AB9A905C9), + make_floatx80_init(0x3FFE, 0x97012E025C04B809), + make_floatx80_init(0x3FFE, 0x87224C2E8E645FB7), + make_floatx80_init(0x3FFE, 0x95A02568095A0257), + make_floatx80_init(0x3FFE, 0x897B8CAC9F7DE298), + make_floatx80_init(0x3FFE, 0x9445809445809446), + make_floatx80_init(0x3FFE, 0x8BCF55DEC4CD05FE), + make_floatx80_init(0x3FFE, 0x92F113840497889C), + make_floatx80_init(0x3FFE, 0x8E1DC0FB89E125E5), + make_floatx80_init(0x3FFE, 0x91A2B3C4D5E6F809), + make_floatx80_init(0x3FFE, 0x9066E68C955B6C9B), + make_floatx80_init(0x3FFE, 0x905A38633E06C43B), + make_floatx80_init(0x3FFE, 0x92AADE74C7BE59E0), + make_floatx80_init(0x3FFE, 0x8F1779D9FDC3A219), + make_floatx80_init(0x3FFE, 0x94E9BFF615845643), + make_floatx80_init(0x3FFE, 0x8DDA520237694809), + make_floatx80_init(0x3FFE, 0x9723A1B720134203), + make_floatx80_init(0x3FFE, 0x8CA29C046514E023), + make_floatx80_init(0x3FFE, 0x995899C890EB8990), + make_floatx80_init(0x3FFE, 0x8B70344A139BC75A), + make_floatx80_init(0x3FFE, 0x9B88BDAA3A3DAE2F), + make_floatx80_init(0x3FFE, 0x8A42F8705669DB46), + make_floatx80_init(0x3FFE, 0x9DB4224FFFE1157C), + make_floatx80_init(0x3FFE, 0x891AC73AE9819B50), + make_floatx80_init(0x3FFE, 0x9FDADC268B7A12DA), + make_floatx80_init(0x3FFE, 0x87F78087F78087F8), + make_floatx80_init(0x3FFE, 0xA1FCFF17CE733BD4), + make_floatx80_init(0x3FFE, 0x86D905447A34ACC6), + make_floatx80_init(0x3FFE, 0xA41A9E8F5446FB9F), + make_floatx80_init(0x3FFE, 0x85BF37612CEE3C9B), + make_floatx80_init(0x3FFE, 0xA633CD7E6771CD8B), + make_floatx80_init(0x3FFE, 0x84A9F9C8084A9F9D), + make_floatx80_init(0x3FFE, 0xA8489E600B435A5E), + make_floatx80_init(0x3FFE, 0x839930523FBE3368), + make_floatx80_init(0x3FFE, 0xAA59233CCCA4BD49), + make_floatx80_init(0x3FFE, 0x828CBFBEB9A020A3), + make_floatx80_init(0x3FFE, 0xAC656DAE6BCC4985), + make_floatx80_init(0x3FFE, 0x81848DA8FAF0D277), + make_floatx80_init(0x3FFE, 0xAE6D8EE360BB2468), + make_floatx80_init(0x3FFE, 0x8080808080808081), + make_floatx80_init(0x3FFE, 0xB07197A23C46C654) +}; +#endif diff --git a/target/m68k/translate.c b/target/m68k/translate.c index dbb24f8d84..2c3d20154a 100644 --- a/target/m68k/translate.c +++ b/target/m68k/translate.c @@ -5054,6 +5054,9 @@ DISAS_INSN(fpu) case 0x45: /* fdsqrt */ gen_helper_fdsqrt(cpu_env, cpu_dest, cpu_src); break; + case 0x06: /* flognp1 */ + gen_helper_flognp1(cpu_env, cpu_dest, cpu_src); + break; case 0x18: /* fabs */ gen_helper_fabs(cpu_env, cpu_dest, cpu_src); break; --=20 2.14.3 From nobody Mon Apr 29 13:47:32 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1520605839545476.1216889133784; Fri, 9 Mar 2018 06:30:39 -0800 (PST) Received: from localhost ([::1]:45590 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euJ2c-00040X-Lm for importer@patchew.org; Fri, 09 Mar 2018 09:30:38 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58936) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euIyq-0000wA-TT for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:26:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1euIym-0007C0-Tq for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:26:44 -0500 Received: from mout.kundenserver.de ([212.227.17.13]:34705) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1euIym-0007BG-A8 for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:26:40 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue105 [212.227.15.183]) with ESMTPSA (Nemesis) id 0MTgbQ-1f3Cxi26Do-00QSnp; Fri, 09 Mar 2018 15:26:38 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Fri, 9 Mar 2018 15:26:25 +0100 Message-Id: <20180309142630.2170-4-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180309142630.2170-1-laurent@vivier.eu> References: <20180309142630.2170-1-laurent@vivier.eu> X-Provags-ID: V03:K0:LxrwcyYsbaLEzaLB0XqBpCD3WQ6X4caUFntOT63trkuUUetYnO2 omWF+V0JJba6a3S0+47R4YyNkX0FToA9pXs7Y8Mt7lghKIcGaOaVEU897LZWg832ScQh/eV NJXAfBpa16pE/7kE42zwTWR5MJHaVj5CNK2FI+lYFHMY7X+267BHRkMj+VKYzbqQ5mARA4l 6R8p9QrxoFCO0XTaLTIiQ== X-UI-Out-Filterresults: notjunk:1;V01:K0:8c3bzG/8Ol8=:axcmdT1j8ughdEHiSzchmV ckUyRyWCjBEZO4GBl4c6GG2gTMdjMjTVk4hHhRWM4co4WF7SEVvMysof+iT8icTH/+u2UibGV p/39Hp3Cz20/87qkPyxnkUo4D1eEYfUK87PY/Svl6+pYB1vRN2GL1yafiw9JFkRUj3iJsOOov eYEgqwxTdZKxz8jgVi6lL1lYFbOZI7/KrlMlX+ypDiQ8Cvwya+bUqR3a+krqffPickibotNVb i07XqZXuzqcdab5PMYkhBZqC1FpH/yn4g1GRDUPDBVzmwYthKgIScps2x+Ceb+0irniQ17CBp 5B37oT4mi/OtBgZM8MIt5HV0n1O1fAOZh1npstLvUtQ6BCxqCn7c1rlb16TZXuUxiWjAC5iwC 5F/wxKFicdtJ4fPXd4Ewcv9ULrLKR3HTmHzvW2ODStaYI8EqWc1iJjVwtp68ZCpiYwJ8nJlt4 Za3GlApmBQeGBsTFzl0qkSdfqxhiB0dsJVZwXTPfJdiXQrKJf34S6x23Ot+dA+HTmHTDUBSY5 yXqEqZLA0anBv1yui+C+9L5IOEoLtajOB2qsl9SuVHuSZlTLSo5xvULoQ6fAZLCH9xFp952Db b6kdhWXEcp985zl4AxusuvfZGJQK+I1lE0uemBRiAlFi5eI9pFz9KEmUyNa/MvqGxlwW6CUA9 rS3IqPKs4hpLx0aPsi/zAw3wMz2ImtPz/QGU5aA9I8QdtAXFd5fZ7lJazd9E/8GXaUdlMNQbg qT3OJFQ95gtxJdyNCytWqYVhZ9talGBlJqnXpw== X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 212.227.17.13 Subject: [Qemu-devel] [PULL 3/8] target/m68k: implement flogn X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laurent Vivier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Using a local m68k floatx80_logn() [copied from previous: Written by Andreas Grabher for Previous, NeXT Computer Emulator.] Signed-off-by: Laurent Vivier Message-Id: <20180305203910.10391-4-laurent@vivier.eu> --- target/m68k/fpu_helper.c | 5 ++ target/m68k/helper.h | 1 + target/m68k/softfloat.c | 168 +++++++++++++++++++++++++++++++++++++++++++= ++++ target/m68k/softfloat.h | 1 + target/m68k/translate.c | 3 + 5 files changed, 178 insertions(+) diff --git a/target/m68k/fpu_helper.c b/target/m68k/fpu_helper.c index 614064612e..cc6d3dfa52 100644 --- a/target/m68k/fpu_helper.c +++ b/target/m68k/fpu_helper.c @@ -562,3 +562,8 @@ void HELPER(flognp1)(CPUM68KState *env, FPReg *res, FPR= eg *val) { res->d =3D floatx80_lognp1(val->d, &env->fp_status); } + +void HELPER(flogn)(CPUM68KState *env, FPReg *res, FPReg *val) +{ + res->d =3D floatx80_logn(val->d, &env->fp_status); +} diff --git a/target/m68k/helper.h b/target/m68k/helper.h index f7e6fc8c40..68e5f4c0a7 100644 --- a/target/m68k/helper.h +++ b/target/m68k/helper.h @@ -69,6 +69,7 @@ DEF_HELPER_3(fgetexp, void, env, fp, fp) DEF_HELPER_3(fgetman, void, env, fp, fp) DEF_HELPER_4(fscale, void, env, fp, fp, fp) DEF_HELPER_3(flognp1, void, env, fp, fp) +DEF_HELPER_3(flogn, void, env, fp, fp) =20 DEF_HELPER_3(mac_move, void, env, i32, i32) DEF_HELPER_3(macmulf, i64, env, i32, i32) diff --git a/target/m68k/softfloat.c b/target/m68k/softfloat.c index 834db12964..180a17c39b 100644 --- a/target/m68k/softfloat.c +++ b/target/m68k/softfloat.c @@ -490,3 +490,171 @@ floatx80 floatx80_lognp1(floatx80 a, float_status *st= atus) return a; } } + +/*------------------------------------------------------------------------= ---- + | Log base e + *------------------------------------------------------------------------= ----*/ + +floatx80 floatx80_logn(floatx80 a, float_status *status) +{ + flag aSign; + int32_t aExp; + uint64_t aSig, fSig; + + int8_t user_rnd_mode, user_rnd_prec; + + int32_t compact, j, k, adjk; + floatx80 fp0, fp1, fp2, fp3, f, logof2, klog2, saveu; + + aSig =3D extractFloatx80Frac(a); + aExp =3D extractFloatx80Exp(a); + aSign =3D extractFloatx80Sign(a); + + if (aExp =3D=3D 0x7FFF) { + if ((uint64_t) (aSig << 1)) { + propagateFloatx80NaNOneArg(a, status); + } + if (aSign =3D=3D 0) { + return packFloatx80(0, floatx80_infinity.high, + floatx80_infinity.low); + } + } + + adjk =3D 0; + + if (aExp =3D=3D 0) { + if (aSig =3D=3D 0) { /* zero */ + float_raise(float_flag_divbyzero, status); + return packFloatx80(1, floatx80_infinity.high, + floatx80_infinity.low); + } + if ((aSig & one_sig) =3D=3D 0) { /* denormal */ + normalizeFloatx80Subnormal(aSig, &aExp, &aSig); + adjk =3D -100; + aExp +=3D 100; + a =3D packFloatx80(aSign, aExp, aSig); + } + } + + if (aSign) { + float_raise(float_flag_invalid, status); + return floatx80_default_nan(status); + } + + user_rnd_mode =3D status->float_rounding_mode; + user_rnd_prec =3D status->floatx80_rounding_precision; + status->float_rounding_mode =3D float_round_nearest_even; + status->floatx80_rounding_precision =3D 80; + + compact =3D floatx80_make_compact(aExp, aSig); + + if (compact < 0x3FFEF07D || compact > 0x3FFF8841) { + /* |X| < 15/16 or |X| > 17/16 */ + k =3D aExp - 0x3FFF; + k +=3D adjk; + fp1 =3D int32_to_floatx80(k, status); + + fSig =3D (aSig & LIT64(0xFE00000000000000)) | LIT64(0x010000000000= 0000); + j =3D (fSig >> 56) & 0x7E; /* DISPLACEMENT FOR 1/F */ + + f =3D packFloatx80(0, 0x3FFF, fSig); /* F */ + fp0 =3D packFloatx80(0, 0x3FFF, aSig); /* Y */ + + fp0 =3D floatx80_sub(fp0, f, status); /* Y-F */ + + /* LP1CONT1 */ + fp0 =3D floatx80_mul(fp0, log_tbl[j], status); /* FP0 IS U =3D (Y-= F)/F */ + logof2 =3D packFloatx80(0, 0x3FFE, LIT64(0xB17217F7D1CF79AC)); + klog2 =3D floatx80_mul(fp1, logof2, status); /* FP1 IS K*LOG2 */ + fp2 =3D floatx80_mul(fp0, fp0, status); /* FP2 IS V=3DU*U */ + + fp3 =3D fp2; + fp1 =3D fp2; + + fp1 =3D floatx80_mul(fp1, float64_to_floatx80( + make_float64(0x3FC2499AB5E4040B), status), + status); /* V*A6 */ + fp2 =3D floatx80_mul(fp2, float64_to_floatx80( + make_float64(0xBFC555B5848CB7DB), status), + status); /* V*A5 */ + fp1 =3D floatx80_add(fp1, float64_to_floatx80( + make_float64(0x3FC99999987D8730), status), + status); /* A4+V*A6 */ + fp2 =3D floatx80_add(fp2, float64_to_floatx80( + make_float64(0xBFCFFFFFFF6F7E97), status), + status); /* A3+V*A5 */ + fp1 =3D floatx80_mul(fp1, fp3, status); /* V*(A4+V*A6) */ + fp2 =3D floatx80_mul(fp2, fp3, status); /* V*(A3+V*A5) */ + fp1 =3D floatx80_add(fp1, float64_to_floatx80( + make_float64(0x3FD55555555555A4), status), + status); /* A2+V*(A4+V*A6) */ + fp2 =3D floatx80_add(fp2, float64_to_floatx80( + make_float64(0xBFE0000000000008), status), + status); /* A1+V*(A3+V*A5) */ + fp1 =3D floatx80_mul(fp1, fp3, status); /* V*(A2+V*(A4+V*A6)) */ + fp2 =3D floatx80_mul(fp2, fp3, status); /* V*(A1+V*(A3+V*A5)) */ + fp1 =3D floatx80_mul(fp1, fp0, status); /* U*V*(A2+V*(A4+V*A6)) */ + fp0 =3D floatx80_add(fp0, fp2, status); /* U+V*(A1+V*(A3+V*A5)) */ + + fp1 =3D floatx80_add(fp1, log_tbl[j + 1], + status); /* LOG(F)+U*V*(A2+V*(A4+V*A6)) */ + fp0 =3D floatx80_add(fp0, fp1, status); /* FP0 IS LOG(F) + LOG(1+U= ) */ + + status->float_rounding_mode =3D user_rnd_mode; + status->floatx80_rounding_precision =3D user_rnd_prec; + + a =3D floatx80_add(fp0, klog2, status); + + float_raise(float_flag_inexact, status); + + return a; + } else { /* |X-1| >=3D 1/16 */ + fp0 =3D a; + fp1 =3D a; + fp1 =3D floatx80_sub(fp1, float32_to_floatx80(make_float32(0x3F800= 000), + status), status); /* FP1 IS X-1 */ + fp0 =3D floatx80_add(fp0, float32_to_floatx80(make_float32(0x3F800= 000), + status), status); /* FP0 IS X+1 */ + fp1 =3D floatx80_add(fp1, fp1, status); /* FP1 IS 2(X-1) */ + + /* LP1CONT2 */ + fp1 =3D floatx80_div(fp1, fp0, status); /* U */ + saveu =3D fp1; + fp0 =3D floatx80_mul(fp1, fp1, status); /* FP0 IS V =3D U*U */ + fp1 =3D floatx80_mul(fp0, fp0, status); /* FP1 IS W =3D V*V */ + + fp3 =3D float64_to_floatx80(make_float64(0x3F175496ADD7DAD6), + status); /* B5 */ + fp2 =3D float64_to_floatx80(make_float64(0x3F3C71C2FE80C7E0), + status); /* B4 */ + fp3 =3D floatx80_mul(fp3, fp1, status); /* W*B5 */ + fp2 =3D floatx80_mul(fp2, fp1, status); /* W*B4 */ + fp3 =3D floatx80_add(fp3, float64_to_floatx80( + make_float64(0x3F624924928BCCFF), status), + status); /* B3+W*B5 */ + fp2 =3D floatx80_add(fp2, float64_to_floatx80( + make_float64(0x3F899999999995EC), status), + status); /* B2+W*B4 */ + fp1 =3D floatx80_mul(fp1, fp3, status); /* W*(B3+W*B5) */ + fp2 =3D floatx80_mul(fp2, fp0, status); /* V*(B2+W*B4) */ + fp1 =3D floatx80_add(fp1, float64_to_floatx80( + make_float64(0x3FB5555555555555), status), + status); /* B1+W*(B3+W*B5) */ + + fp0 =3D floatx80_mul(fp0, saveu, status); /* FP0 IS U*V */ + fp1 =3D floatx80_add(fp1, fp2, status); /* B1+W*(B3+W*B5) + V*(B2+= W*B4) */ + fp0 =3D floatx80_mul(fp0, fp1, + status); /* U*V*([B1+W*(B3+W*B5)] + [V*(B2+W*B4= )]) */ + + status->float_rounding_mode =3D user_rnd_mode; + status->floatx80_rounding_precision =3D user_rnd_prec; + + a =3D floatx80_add(fp0, saveu, status); + + /*if (!floatx80_is_zero(a)) { */ + float_raise(float_flag_inexact, status); + /*} */ + + return a; + } +} diff --git a/target/m68k/softfloat.h b/target/m68k/softfloat.h index 4d74eaf862..161bd6dff7 100644 --- a/target/m68k/softfloat.h +++ b/target/m68k/softfloat.h @@ -28,4 +28,5 @@ floatx80 floatx80_getexp(floatx80 a, float_status *status= ); floatx80 floatx80_scale(floatx80 a, floatx80 b, float_status *status); floatx80 floatx80_move(floatx80 a, float_status *status); floatx80 floatx80_lognp1(floatx80 a, float_status *status); +floatx80 floatx80_logn(floatx80 a, float_status *status); #endif diff --git a/target/m68k/translate.c b/target/m68k/translate.c index 2c3d20154a..705b9b0d5b 100644 --- a/target/m68k/translate.c +++ b/target/m68k/translate.c @@ -5057,6 +5057,9 @@ DISAS_INSN(fpu) case 0x06: /* flognp1 */ gen_helper_flognp1(cpu_env, cpu_dest, cpu_src); break; + case 0x14: /* flogn */ + gen_helper_flogn(cpu_env, cpu_dest, cpu_src); + break; case 0x18: /* fabs */ gen_helper_fabs(cpu_env, cpu_dest, cpu_src); break; --=20 2.14.3 From nobody Mon Apr 29 13:47:32 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1520605838968407.18650558530976; Fri, 9 Mar 2018 06:30:38 -0800 (PST) Received: from localhost ([::1]:45589 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euJ2b-0003zy-7u for importer@patchew.org; Fri, 09 Mar 2018 09:30:37 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58943) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euIyr-0000wK-3r for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:26:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1euIym-0007C8-Ud for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:26:45 -0500 Received: from mout.kundenserver.de ([217.72.192.73]:39927) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1euIym-0007BO-L3 for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:26:40 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue105 [212.227.15.183]) with ESMTPSA (Nemesis) id 0Mhl59-1fG57M0odP-00Mq1a; Fri, 09 Mar 2018 15:26:39 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Fri, 9 Mar 2018 15:26:26 +0100 Message-Id: <20180309142630.2170-5-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180309142630.2170-1-laurent@vivier.eu> References: <20180309142630.2170-1-laurent@vivier.eu> X-Provags-ID: V03:K0:7JgHLAWBlEQGtnonvCQmuCm6grnHdSVizci3Va9r9FfSop2OGFM Sc2LCU83D8ETt+AmtrV730T5GOjefmNIhhEH5IL7MmS1XojWivOnqPrVBGh3K9tyHZeNV9I +p/T9VvY9M/6em2stGYBWMc35OrR585nZ7rYv0SpdBFVNlmpMP9tfD18L4/2yom/UBdBQQW 9q/2dw4QYTqmWzPH/jmEQ== X-UI-Out-Filterresults: notjunk:1;V01:K0:dy5iVxys0gI=:okvp8nLD7lua7i04kl3m/0 6rBZGYmp+GNTbAKpFdo0gOEXDF8p9NAjsHYQyDP+ouKrDsCMXaIh8pcqUCuuBVHOuKNRvW+ka Kco2RPi+CzbL6X56sR4xfb8uqJWiZO6UoJpP7be5sAHFzvYdlRv3zV5pehcbaXk0gBE02K2sx xwyLwd00qtm5uaqwMSu78cHmYZnj9Mvibo2YUtvPrjYznUfu99WHRHdIugXrzqdcsVLq0qpkk 4RmRu8rme4hPqfBdWyiJ5Wtjd9KZ0xgbfUV/YKfRkHQ0wd/jNPFGvV7joHM/NrKtVigzVqpe4 oAkfSeu3JsSD3z5SA7Zs8iXsbK+zCsgT2uCC2kJxq5DfHpvxTVnKM6l5Uj4KPLPt8AK6fWluS L2OE6qRKhg2zq+0R1Odl8rVGu+V2tBdppT3y8l1zm8Xi/DVxvupyJwsAH6KGLiW8ZRmPQ1W9l yeM7NkrzHHe/ppmMnRUE2KawAlooL6GMMTchbM4MwTIFFpiZ7TciUpExS8/fjbjatJbFx2cLm aK8dvYeOMP+tdQ2BHSvKoaTv+RnewJG5uRcSOxFURIzTvqTJzfHbuT6qcJ0ajS/Le3NGfYLHj PotfR1L0RQFJn9t5O/iMQXgs/JQCTx5JjUwL9iIbMW1zvBsyF0HqUyK8cpBOXSa7Ac2HEkOAA NAFtaHBKsI3nTOjJnvmNW6oxj6oTknQutw0/p+Q0mG+0ncGJa9gWeFUhy/Tpxk1SMajzaLxea eyMqQT1SjS4p3gyreRvGIeWtTW0P1q+gNboAeQ== X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 217.72.192.73 Subject: [Qemu-devel] [PULL 4/8] target/m68k: implement flog10 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laurent Vivier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Using a local m68k floatx80_log10() [copied from previous: Written by Andreas Grabher for Previous, NeXT Computer Emulator.] Signed-off-by: Laurent Vivier Message-Id: <20180305203910.10391-5-laurent@vivier.eu> --- target/m68k/fpu_helper.c | 5 +++++ target/m68k/helper.h | 1 + target/m68k/softfloat.c | 57 ++++++++++++++++++++++++++++++++++++++++++++= ++++ target/m68k/softfloat.h | 1 + target/m68k/translate.c | 3 +++ 5 files changed, 67 insertions(+) diff --git a/target/m68k/fpu_helper.c b/target/m68k/fpu_helper.c index cc6d3dfa52..2628534136 100644 --- a/target/m68k/fpu_helper.c +++ b/target/m68k/fpu_helper.c @@ -567,3 +567,8 @@ void HELPER(flogn)(CPUM68KState *env, FPReg *res, FPReg= *val) { res->d =3D floatx80_logn(val->d, &env->fp_status); } + +void HELPER(flog10)(CPUM68KState *env, FPReg *res, FPReg *val) +{ + res->d =3D floatx80_log10(val->d, &env->fp_status); +} diff --git a/target/m68k/helper.h b/target/m68k/helper.h index 68e5f4c0a7..d1f38f260f 100644 --- a/target/m68k/helper.h +++ b/target/m68k/helper.h @@ -70,6 +70,7 @@ DEF_HELPER_3(fgetman, void, env, fp, fp) DEF_HELPER_4(fscale, void, env, fp, fp, fp) DEF_HELPER_3(flognp1, void, env, fp, fp) DEF_HELPER_3(flogn, void, env, fp, fp) +DEF_HELPER_3(flog10, void, env, fp, fp) =20 DEF_HELPER_3(mac_move, void, env, i32, i32) DEF_HELPER_3(macmulf, i64, env, i32, i32) diff --git a/target/m68k/softfloat.c b/target/m68k/softfloat.c index 180a17c39b..22fd7f6341 100644 --- a/target/m68k/softfloat.c +++ b/target/m68k/softfloat.c @@ -658,3 +658,60 @@ floatx80 floatx80_logn(floatx80 a, float_status *statu= s) return a; } } + +/*------------------------------------------------------------------------= ---- + | Log base 10 + *------------------------------------------------------------------------= ----*/ + +floatx80 floatx80_log10(floatx80 a, float_status *status) +{ + flag aSign; + int32_t aExp; + uint64_t aSig; + + int8_t user_rnd_mode, user_rnd_prec; + + floatx80 fp0, fp1; + + aSig =3D extractFloatx80Frac(a); + aExp =3D extractFloatx80Exp(a); + aSign =3D extractFloatx80Sign(a); + + if (aExp =3D=3D 0x7FFF) { + if ((uint64_t) (aSig << 1)) { + propagateFloatx80NaNOneArg(a, status); + } + if (aSign =3D=3D 0) { + return packFloatx80(0, floatx80_infinity.high, + floatx80_infinity.low); + } + } + + if (aExp =3D=3D 0 && aSig =3D=3D 0) { + float_raise(float_flag_divbyzero, status); + return packFloatx80(1, floatx80_infinity.high, + floatx80_infinity.low); + } + + if (aSign) { + float_raise(float_flag_invalid, status); + return floatx80_default_nan(status); + } + + user_rnd_mode =3D status->float_rounding_mode; + user_rnd_prec =3D status->floatx80_rounding_precision; + status->float_rounding_mode =3D float_round_nearest_even; + status->floatx80_rounding_precision =3D 80; + + fp0 =3D floatx80_logn(a, status); + fp1 =3D packFloatx80(0, 0x3FFD, LIT64(0xDE5BD8A937287195)); /* INV_L10= */ + + status->float_rounding_mode =3D user_rnd_mode; + status->floatx80_rounding_precision =3D user_rnd_prec; + + a =3D floatx80_mul(fp0, fp1, status); /* LOGN(X)*INV_L10 */ + + float_raise(float_flag_inexact, status); + + return a; +} diff --git a/target/m68k/softfloat.h b/target/m68k/softfloat.h index 161bd6dff7..ac29e76189 100644 --- a/target/m68k/softfloat.h +++ b/target/m68k/softfloat.h @@ -29,4 +29,5 @@ floatx80 floatx80_scale(floatx80 a, floatx80 b, float_sta= tus *status); floatx80 floatx80_move(floatx80 a, float_status *status); floatx80 floatx80_lognp1(floatx80 a, float_status *status); floatx80 floatx80_logn(floatx80 a, float_status *status); +floatx80 floatx80_log10(floatx80 a, float_status *status); #endif diff --git a/target/m68k/translate.c b/target/m68k/translate.c index 705b9b0d5b..f1130df314 100644 --- a/target/m68k/translate.c +++ b/target/m68k/translate.c @@ -5060,6 +5060,9 @@ DISAS_INSN(fpu) case 0x14: /* flogn */ gen_helper_flogn(cpu_env, cpu_dest, cpu_src); break; + case 0x15: /* flog10 */ + gen_helper_flog10(cpu_env, cpu_dest, cpu_src); + break; case 0x18: /* fabs */ gen_helper_fabs(cpu_env, cpu_dest, cpu_src); break; --=20 2.14.3 From nobody Mon Apr 29 13:47:32 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1520605707970641.717613635948; Fri, 9 Mar 2018 06:28:27 -0800 (PST) Received: from localhost ([::1]:45576 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euJ0V-00025o-3d for importer@patchew.org; Fri, 09 Mar 2018 09:28:27 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58906) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euIyq-0000vd-0Q for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:26:45 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1euIyo-0007CP-6n for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:26:43 -0500 Received: from mout.kundenserver.de ([217.72.192.75]:45337) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1euIyn-0007CE-Sk for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:26:42 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue105 [212.227.15.183]) with ESMTPSA (Nemesis) id 0M2u5m-1edC4931aY-00sc0l; Fri, 09 Mar 2018 15:26:40 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Fri, 9 Mar 2018 15:26:27 +0100 Message-Id: <20180309142630.2170-6-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180309142630.2170-1-laurent@vivier.eu> References: <20180309142630.2170-1-laurent@vivier.eu> X-Provags-ID: V03:K0:wlzq9rMZD+bssog5Dr/GR/+zpkyLQ5fwW50vSgUxxRQPWKd7ad9 ZiMsCzhvs8lIKizwXz00lAxFhnAqlVzQuv3eStCgRg3wkXjtnS9ICVDn7Yg2ZiYWhmeG3jC MHCKkraGS4amdFcVyzIx4x4yxVXLENU/wvrbM5SFybnpBC9LHTi9vtvRRhBd6p7g60l6OcJ 2auHkLSwI+cLBkcS18OXQ== X-UI-Out-Filterresults: notjunk:1;V01:K0:V1rL5uqW/FY=:YU8MpjBjR8u0o0UVMZTyW+ yu56RfUXF4DyLM8NnracYjARLDnniNjk6zy+JUOLyypohXJd6P5TbDohBx7iY1XTF272lNVMF zZzaT5uGOB7657rghuqiI5Dx3GyXJGjjIgap9+aJVfdsR8g3ho08IL00y9WJg6fp9fL6wIM+T Rp1+r+XfQDYqULh06U8JanHBf74tfMD6dhxqJfxAAvkxkKCB4tDpMbZjDHjGULapcW+VjIYxX dCxLIW/MyQ8NmAPSyZbFKg4pXCoLrTiNCSPGAJuJnLclJGkLDqhMIBYeriZBMkJXyqf++UYxN HXi+SmjabpHd50YLrMwRIi5VtY/dpCJwOS5nfmEKzmcRMxEFes9O3x7dLHtNZsKku4dDU/4wN eBbTwpjhoa/z6TnD/vNgZZbhDYa+6GoWIp7T6McxUzz0FCg9eoUIp3rpdXl7PPM1Y3mUf0ap6 CJmUYD9hsb0671tXs/dxL8NBIDLKFUKP5I767hHNUrDWhMwsMcsoUAY3vdwXArBA6PiRV6gZi YJG8lzCacKhenXOXC/cnzyPIB5HT1SsCc2fjHYbjIn3GACUP/rFBsWVR46YUISZ6vP/5yBkUu yXQX9fcup4ih/ijPC+i+AY5kbTz3EsqYhCoTS04NhVWGeogIkc+u0D8sNkLRcCFDQng+hjyqT bq7bLH2bd87NF9ySntHKedmCMcN5ZuoISZF1uY/MnizP7CDc7Xj0v+izp39H/VAeX4IzM3Qho T71rak1F17kOsMZ56MMl+LFLGph5A0tZYoD6Dw== X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 217.72.192.75 Subject: [Qemu-devel] [PULL 5/8] target/m68k: implement flog2 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laurent Vivier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Using a local m68k floatx80_log2() [copied from previous: Written by Andreas Grabher for Previous, NeXT Computer Emulator.] Signed-off-by: Laurent Vivier Message-Id: <20180305203910.10391-6-laurent@vivier.eu> --- target/m68k/fpu_helper.c | 5 ++++ target/m68k/helper.h | 1 + target/m68k/softfloat.c | 67 ++++++++++++++++++++++++++++++++++++++++++++= ++++ target/m68k/softfloat.h | 1 + target/m68k/translate.c | 3 +++ 5 files changed, 77 insertions(+) diff --git a/target/m68k/fpu_helper.c b/target/m68k/fpu_helper.c index 2628534136..97a4501126 100644 --- a/target/m68k/fpu_helper.c +++ b/target/m68k/fpu_helper.c @@ -572,3 +572,8 @@ void HELPER(flog10)(CPUM68KState *env, FPReg *res, FPRe= g *val) { res->d =3D floatx80_log10(val->d, &env->fp_status); } + +void HELPER(flog2)(CPUM68KState *env, FPReg *res, FPReg *val) +{ + res->d =3D floatx80_log2(val->d, &env->fp_status); +} diff --git a/target/m68k/helper.h b/target/m68k/helper.h index d1f38f260f..15f63b353f 100644 --- a/target/m68k/helper.h +++ b/target/m68k/helper.h @@ -71,6 +71,7 @@ DEF_HELPER_4(fscale, void, env, fp, fp, fp) DEF_HELPER_3(flognp1, void, env, fp, fp) DEF_HELPER_3(flogn, void, env, fp, fp) DEF_HELPER_3(flog10, void, env, fp, fp) +DEF_HELPER_3(flog2, void, env, fp, fp) =20 DEF_HELPER_3(mac_move, void, env, i32, i32) DEF_HELPER_3(macmulf, i64, env, i32, i32) diff --git a/target/m68k/softfloat.c b/target/m68k/softfloat.c index 22fd7f6341..9fa6d6fd05 100644 --- a/target/m68k/softfloat.c +++ b/target/m68k/softfloat.c @@ -715,3 +715,70 @@ floatx80 floatx80_log10(floatx80 a, float_status *stat= us) =20 return a; } + +/*------------------------------------------------------------------------= ---- + | Log base 2 + *------------------------------------------------------------------------= ----*/ + +floatx80 floatx80_log2(floatx80 a, float_status *status) +{ + flag aSign; + int32_t aExp; + uint64_t aSig; + + int8_t user_rnd_mode, user_rnd_prec; + + floatx80 fp0, fp1; + + aSig =3D extractFloatx80Frac(a); + aExp =3D extractFloatx80Exp(a); + aSign =3D extractFloatx80Sign(a); + + if (aExp =3D=3D 0x7FFF) { + if ((uint64_t) (aSig << 1)) { + propagateFloatx80NaNOneArg(a, status); + } + if (aSign =3D=3D 0) { + return packFloatx80(0, floatx80_infinity.high, + floatx80_infinity.low); + } + } + + if (aExp =3D=3D 0) { + if (aSig =3D=3D 0) { + float_raise(float_flag_divbyzero, status); + return packFloatx80(1, floatx80_infinity.high, + floatx80_infinity.low); + } + normalizeFloatx80Subnormal(aSig, &aExp, &aSig); + } + + if (aSign) { + float_raise(float_flag_invalid, status); + return floatx80_default_nan(status); + } + + user_rnd_mode =3D status->float_rounding_mode; + user_rnd_prec =3D status->floatx80_rounding_precision; + status->float_rounding_mode =3D float_round_nearest_even; + status->floatx80_rounding_precision =3D 80; + + if (aSig =3D=3D one_sig) { /* X is 2^k */ + status->float_rounding_mode =3D user_rnd_mode; + status->floatx80_rounding_precision =3D user_rnd_prec; + + a =3D int32_to_floatx80(aExp - 0x3FFF, status); + } else { + fp0 =3D floatx80_logn(a, status); + fp1 =3D packFloatx80(0, 0x3FFF, LIT64(0xB8AA3B295C17F0BC)); /* INV= _L2 */ + + status->float_rounding_mode =3D user_rnd_mode; + status->floatx80_rounding_precision =3D user_rnd_prec; + + a =3D floatx80_mul(fp0, fp1, status); /* LOGN(X)*INV_L2 */ + } + + float_raise(float_flag_inexact, status); + + return a; +} diff --git a/target/m68k/softfloat.h b/target/m68k/softfloat.h index ac29e76189..c0b77cf01b 100644 --- a/target/m68k/softfloat.h +++ b/target/m68k/softfloat.h @@ -30,4 +30,5 @@ floatx80 floatx80_move(floatx80 a, float_status *status); floatx80 floatx80_lognp1(floatx80 a, float_status *status); floatx80 floatx80_logn(floatx80 a, float_status *status); floatx80 floatx80_log10(floatx80 a, float_status *status); +floatx80 floatx80_log2(floatx80 a, float_status *status); #endif diff --git a/target/m68k/translate.c b/target/m68k/translate.c index f1130df314..189b23d38d 100644 --- a/target/m68k/translate.c +++ b/target/m68k/translate.c @@ -5063,6 +5063,9 @@ DISAS_INSN(fpu) case 0x15: /* flog10 */ gen_helper_flog10(cpu_env, cpu_dest, cpu_src); break; + case 0x16: /* flog2 */ + gen_helper_flog2(cpu_env, cpu_dest, cpu_src); + break; case 0x18: /* fabs */ gen_helper_fabs(cpu_env, cpu_dest, cpu_src); break; --=20 2.14.3 From nobody Mon Apr 29 13:47:32 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1520606136552758.3633791082707; Fri, 9 Mar 2018 06:35:36 -0800 (PST) Received: from localhost ([::1]:45628 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euJ7P-0007zN-NH for importer@patchew.org; Fri, 09 Mar 2018 09:35:35 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58950) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euIyr-0000wN-Bd for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:26:47 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1euIyp-0007Cr-4d for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:26:45 -0500 Received: from mout.kundenserver.de ([212.227.17.13]:38709) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1euIyo-0007CI-Ln for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:26:43 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue105 [212.227.15.183]) with ESMTPSA (Nemesis) id 0MKqum-1euIym3WN6-0006FN; Fri, 09 Mar 2018 15:26:41 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Fri, 9 Mar 2018 15:26:28 +0100 Message-Id: <20180309142630.2170-7-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180309142630.2170-1-laurent@vivier.eu> References: <20180309142630.2170-1-laurent@vivier.eu> X-Provags-ID: V03:K0:yQ2+PbmNhhlrNLre4tycYJwKaWYifikom7jVVN5M8uHrPKD0aKm kd6d5mK//PgB/EuvU9s/EEvryDbSi0Ogd9C6GXhMHnsYlt882gbzV9F02KajP1W8z8XG8KJ UtjkMV1WcVzbkqKJbapZGzIIbAdoDnpx/+WK2YMSlKa3UlwOQF5sImTElJW0w577n+MWz+P BuH+yuc3VKke/Z4DuVz5A== X-UI-Out-Filterresults: notjunk:1;V01:K0:pz58CuNOkgY=:Pi/l0yevrL/p9ox5IXcey0 26+3dYz2KNFq7pA2qQyLdM5oXAwefgCeG++rHWKlymJMpoeRfLesqRunzgV1gTpM+gCv+mdXN Lqa+hvPh6XXbqEVbKEr3QEC9hYvSfEKyGqtYox3+SQqzb0E6TqEwKhTrYnHshywuJ97GmYnmO OArUBMjLCXXMUlbiQ0gbYT+kzXSinfc5feXBhyp3d5HkARAenI81Y2vjrNV7/cd6BLb6BCyeE og8SaJNodxkfFXmUAMH2FskfzErsYKUAB12dxS1UPVqOQuv3gvlbLcwqEXvily5qCQFKD9pkz CIMm0MsbN2v3xIS2r2TExhs2/7+kYFxuuxgxLDt4JMAtYLrA/UMY0vo+2zm/VrFU3FSL8UStB gIFnAX2p83M6v7u8LdFezyYAO8WKByWScA2NeUodmUFPxvnhx0XmzipjhPwnO3oK1/gJ2EzkS ooSGtRwQnF3zuXNAl8pW0Ju0BXf7TgPhmd8gmAO3mMi4jKoOfJncRKtOt2YTAQy3H5XKrtQKx tuVTceokPICsg+/P9ZBdJHM36u85db5gMfCAymTdnX++aW9rfG7ZZV4ows3Dvxq+vFGZqXNev xv4E1aZ3j+cT9k4uLVyP8d2wPh+MI0venka7QOB5gcjdvgLWCEQ3ylY//sKadf2cWivjq79IB jPuMOse5D6bu1GQxkn8LaWndf0GigqMNfVGHiMVOtNHtkgj+4fE9Zj+JwJ67A6isgELTfG3cs 9j8NP16fIXtUMC+A2qJ3i9VbUZM7raqfcrKQ8A== X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 212.227.17.13 Subject: [Qemu-devel] [PULL 6/8] target/m68k: implement fetox X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laurent Vivier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Using a local m68k floatx80_etox() [copied from previous: Written by Andreas Grabher for Previous, NeXT Computer Emulator.] Signed-off-by: Laurent Vivier Message-Id: <20180305203910.10391-7-laurent@vivier.eu> --- target/m68k/fpu_helper.c | 5 + target/m68k/helper.h | 1 + target/m68k/softfloat.c | 183 ++++++++++++++++++++++++++++++++= ++++ target/m68k/softfloat.h | 1 + target/m68k/softfloat_fpsp_tables.h | 134 ++++++++++++++++++++++++++ target/m68k/translate.c | 3 + 6 files changed, 327 insertions(+) diff --git a/target/m68k/fpu_helper.c b/target/m68k/fpu_helper.c index 97a4501126..154666cbb5 100644 --- a/target/m68k/fpu_helper.c +++ b/target/m68k/fpu_helper.c @@ -577,3 +577,8 @@ void HELPER(flog2)(CPUM68KState *env, FPReg *res, FPReg= *val) { res->d =3D floatx80_log2(val->d, &env->fp_status); } + +void HELPER(fetox)(CPUM68KState *env, FPReg *res, FPReg *val) +{ + res->d =3D floatx80_etox(val->d, &env->fp_status); +} diff --git a/target/m68k/helper.h b/target/m68k/helper.h index 15f63b353f..70aeb2da7c 100644 --- a/target/m68k/helper.h +++ b/target/m68k/helper.h @@ -72,6 +72,7 @@ DEF_HELPER_3(flognp1, void, env, fp, fp) DEF_HELPER_3(flogn, void, env, fp, fp) DEF_HELPER_3(flog10, void, env, fp, fp) DEF_HELPER_3(flog2, void, env, fp, fp) +DEF_HELPER_3(fetox, void, env, fp, fp) =20 DEF_HELPER_3(mac_move, void, env, i32, i32) DEF_HELPER_3(macmulf, i64, env, i32, i32) diff --git a/target/m68k/softfloat.c b/target/m68k/softfloat.c index 9fa6d6fd05..e58eb91738 100644 --- a/target/m68k/softfloat.c +++ b/target/m68k/softfloat.c @@ -782,3 +782,186 @@ floatx80 floatx80_log2(floatx80 a, float_status *stat= us) =20 return a; } + +/*------------------------------------------------------------------------= ---- + | e to x + *------------------------------------------------------------------------= ----*/ + +floatx80 floatx80_etox(floatx80 a, float_status *status) +{ + flag aSign; + int32_t aExp; + uint64_t aSig; + + int8_t user_rnd_mode, user_rnd_prec; + + int32_t compact, n, j, k, m, m1; + floatx80 fp0, fp1, fp2, fp3, l2, scale, adjscale; + flag adjflag; + + aSig =3D extractFloatx80Frac(a); + aExp =3D extractFloatx80Exp(a); + aSign =3D extractFloatx80Sign(a); + + if (aExp =3D=3D 0x7FFF) { + if ((uint64_t) (aSig << 1)) { + return propagateFloatx80NaNOneArg(a, status); + } + if (aSign) { + return packFloatx80(0, 0, 0); + } + return packFloatx80(0, floatx80_infinity.high, + floatx80_infinity.low); + } + + if (aExp =3D=3D 0 && aSig =3D=3D 0) { + return packFloatx80(0, one_exp, one_sig); + } + + user_rnd_mode =3D status->float_rounding_mode; + user_rnd_prec =3D status->floatx80_rounding_precision; + status->float_rounding_mode =3D float_round_nearest_even; + status->floatx80_rounding_precision =3D 80; + + adjflag =3D 0; + + if (aExp >=3D 0x3FBE) { /* |X| >=3D 2^(-65) */ + compact =3D floatx80_make_compact(aExp, aSig); + + if (compact < 0x400CB167) { /* |X| < 16380 log2 */ + fp0 =3D a; + fp1 =3D a; + fp0 =3D floatx80_mul(fp0, float32_to_floatx80( + make_float32(0x42B8AA3B), status), + status); /* 64/log2 * X */ + adjflag =3D 0; + n =3D floatx80_to_int32(fp0, status); /* int(64/log2*X) */ + fp0 =3D int32_to_floatx80(n, status); + + j =3D n & 0x3F; /* J =3D N mod 64 */ + m =3D n / 64; /* NOTE: this is really arithmetic right shift b= y 6 */ + if (n < 0 && j) { + /* arithmetic right shift is division and + * round towards minus infinity + */ + m--; + } + m +=3D 0x3FFF; /* biased exponent of 2^(M) */ + + expcont1: + fp2 =3D fp0; /* N */ + fp0 =3D floatx80_mul(fp0, float32_to_floatx80( + make_float32(0xBC317218), status), + status); /* N * L1, L1 =3D lead(-log2/64) */ + l2 =3D packFloatx80(0, 0x3FDC, LIT64(0x82E308654361C4C6)); + fp2 =3D floatx80_mul(fp2, l2, status); /* N * L2, L1+L2 =3D -l= og2/64 */ + fp0 =3D floatx80_add(fp0, fp1, status); /* X + N*L1 */ + fp0 =3D floatx80_add(fp0, fp2, status); /* R */ + + fp1 =3D floatx80_mul(fp0, fp0, status); /* S =3D R*R */ + fp2 =3D float32_to_floatx80(make_float32(0x3AB60B70), + status); /* A5 */ + fp2 =3D floatx80_mul(fp2, fp1, status); /* fp2 is S*A5 */ + fp3 =3D floatx80_mul(float32_to_floatx80(make_float32(0x3C0888= 95), + status), fp1, + status); /* fp3 is S*A4 */ + fp2 =3D floatx80_add(fp2, float64_to_floatx80(make_float64( + 0x3FA5555555554431), status), + status); /* fp2 is A3+S*A5 */ + fp3 =3D floatx80_add(fp3, float64_to_floatx80(make_float64( + 0x3FC5555555554018), status), + status); /* fp3 is A2+S*A4 */ + fp2 =3D floatx80_mul(fp2, fp1, status); /* fp2 is S*(A3+S*A5) = */ + fp3 =3D floatx80_mul(fp3, fp1, status); /* fp3 is S*(A2+S*A4) = */ + fp2 =3D floatx80_add(fp2, float32_to_floatx80( + make_float32(0x3F000000), status), + status); /* fp2 is A1+S*(A3+S*A5) */ + fp3 =3D floatx80_mul(fp3, fp0, status); /* fp3 IS R*S*(A2+S*A4= ) */ + fp2 =3D floatx80_mul(fp2, fp1, + status); /* fp2 IS S*(A1+S*(A3+S*A5)) */ + fp0 =3D floatx80_add(fp0, fp3, status); /* fp0 IS R+R*S*(A2+S*= A4) */ + fp0 =3D floatx80_add(fp0, fp2, status); /* fp0 IS EXP(R) - 1 */ + + fp1 =3D exp_tbl[j]; + fp0 =3D floatx80_mul(fp0, fp1, status); /* 2^(J/64)*(Exp(R)-1)= */ + fp0 =3D floatx80_add(fp0, float32_to_floatx80(exp_tbl2[j], sta= tus), + status); /* accurate 2^(J/64) */ + fp0 =3D floatx80_add(fp0, fp1, + status); /* 2^(J/64) + 2^(J/64)*(Exp(R)-1) = */ + + scale =3D packFloatx80(0, m, one_sig); + if (adjflag) { + adjscale =3D packFloatx80(0, m1, one_sig); + fp0 =3D floatx80_mul(fp0, adjscale, status); + } + + status->float_rounding_mode =3D user_rnd_mode; + status->floatx80_rounding_precision =3D user_rnd_prec; + + a =3D floatx80_mul(fp0, scale, status); + + float_raise(float_flag_inexact, status); + + return a; + } else { /* |X| >=3D 16380 log2 */ + if (compact > 0x400CB27C) { /* |X| >=3D 16480 log2 */ + status->float_rounding_mode =3D user_rnd_mode; + status->floatx80_rounding_precision =3D user_rnd_prec; + if (aSign) { + a =3D roundAndPackFloatx80( + status->floatx80_rounding_preci= sion, + 0, -0x1000, aSig, 0, status); + } else { + a =3D roundAndPackFloatx80( + status->floatx80_rounding_preci= sion, + 0, 0x8000, aSig, 0, status); + } + float_raise(float_flag_inexact, status); + + return a; + } else { + fp0 =3D a; + fp1 =3D a; + fp0 =3D floatx80_mul(fp0, float32_to_floatx80( + make_float32(0x42B8AA3B), status), + status); /* 64/log2 * X */ + adjflag =3D 1; + n =3D floatx80_to_int32(fp0, status); /* int(64/log2*X) */ + fp0 =3D int32_to_floatx80(n, status); + + j =3D n & 0x3F; /* J =3D N mod 64 */ + /* NOTE: this is really arithmetic right shift by 6 */ + k =3D n / 64; + if (n < 0 && j) { + /* arithmetic right shift is division and + * round towards minus infinity + */ + k--; + } + /* NOTE: this is really arithmetic right shift by 1 */ + m1 =3D k / 2; + if (k < 0 && (k & 1)) { + /* arithmetic right shift is division and + * round towards minus infinity + */ + m1--; + } + m =3D k - m1; + m1 +=3D 0x3FFF; /* biased exponent of 2^(M1) */ + m +=3D 0x3FFF; /* biased exponent of 2^(M) */ + + goto expcont1; + } + } + } else { /* |X| < 2^(-65) */ + status->float_rounding_mode =3D user_rnd_mode; + status->floatx80_rounding_precision =3D user_rnd_prec; + + a =3D floatx80_add(a, float32_to_floatx80(make_float32(0x3F800000), + status), status); /* 1 + X */ + + float_raise(float_flag_inexact, status); + + return a; + } +} diff --git a/target/m68k/softfloat.h b/target/m68k/softfloat.h index c0b77cf01b..250f0d926f 100644 --- a/target/m68k/softfloat.h +++ b/target/m68k/softfloat.h @@ -31,4 +31,5 @@ floatx80 floatx80_lognp1(floatx80 a, float_status *status= ); floatx80 floatx80_logn(floatx80 a, float_status *status); floatx80 floatx80_log10(floatx80 a, float_status *status); floatx80 floatx80_log2(floatx80 a, float_status *status); +floatx80 floatx80_etox(floatx80 a, float_status *status); #endif diff --git a/target/m68k/softfloat_fpsp_tables.h b/target/m68k/softfloat_fp= sp_tables.h index a87179e11e..b2b63e5ced 100755 --- a/target/m68k/softfloat_fpsp_tables.h +++ b/target/m68k/softfloat_fpsp_tables.h @@ -151,4 +151,138 @@ static const floatx80 log_tbl[128] =3D { make_floatx80_init(0x3FFE, 0x8080808080808081), make_floatx80_init(0x3FFE, 0xB07197A23C46C654) }; + +static const floatx80 exp_tbl[64] =3D { + make_floatx80_init(0x3FFF, 0x8000000000000000), + make_floatx80_init(0x3FFF, 0x8164D1F3BC030774), + make_floatx80_init(0x3FFF, 0x82CD8698AC2BA1D8), + make_floatx80_init(0x3FFF, 0x843A28C3ACDE4048), + make_floatx80_init(0x3FFF, 0x85AAC367CC487B14), + make_floatx80_init(0x3FFF, 0x871F61969E8D1010), + make_floatx80_init(0x3FFF, 0x88980E8092DA8528), + make_floatx80_init(0x3FFF, 0x8A14D575496EFD9C), + make_floatx80_init(0x3FFF, 0x8B95C1E3EA8BD6E8), + make_floatx80_init(0x3FFF, 0x8D1ADF5B7E5BA9E4), + make_floatx80_init(0x3FFF, 0x8EA4398B45CD53C0), + make_floatx80_init(0x3FFF, 0x9031DC431466B1DC), + make_floatx80_init(0x3FFF, 0x91C3D373AB11C338), + make_floatx80_init(0x3FFF, 0x935A2B2F13E6E92C), + make_floatx80_init(0x3FFF, 0x94F4EFA8FEF70960), + make_floatx80_init(0x3FFF, 0x96942D3720185A00), + make_floatx80_init(0x3FFF, 0x9837F0518DB8A970), + make_floatx80_init(0x3FFF, 0x99E0459320B7FA64), + make_floatx80_init(0x3FFF, 0x9B8D39B9D54E5538), + make_floatx80_init(0x3FFF, 0x9D3ED9A72CFFB750), + make_floatx80_init(0x3FFF, 0x9EF5326091A111AC), + make_floatx80_init(0x3FFF, 0xA0B0510FB9714FC4), + make_floatx80_init(0x3FFF, 0xA27043030C496818), + make_floatx80_init(0x3FFF, 0xA43515AE09E680A0), + make_floatx80_init(0x3FFF, 0xA5FED6A9B15138EC), + make_floatx80_init(0x3FFF, 0xA7CD93B4E9653568), + make_floatx80_init(0x3FFF, 0xA9A15AB4EA7C0EF8), + make_floatx80_init(0x3FFF, 0xAB7A39B5A93ED338), + make_floatx80_init(0x3FFF, 0xAD583EEA42A14AC8), + make_floatx80_init(0x3FFF, 0xAF3B78AD690A4374), + make_floatx80_init(0x3FFF, 0xB123F581D2AC2590), + make_floatx80_init(0x3FFF, 0xB311C412A9112488), + make_floatx80_init(0x3FFF, 0xB504F333F9DE6484), + make_floatx80_init(0x3FFF, 0xB6FD91E328D17790), + make_floatx80_init(0x3FFF, 0xB8FBAF4762FB9EE8), + make_floatx80_init(0x3FFF, 0xBAFF5AB2133E45FC), + make_floatx80_init(0x3FFF, 0xBD08A39F580C36C0), + make_floatx80_init(0x3FFF, 0xBF1799B67A731084), + make_floatx80_init(0x3FFF, 0xC12C4CCA66709458), + make_floatx80_init(0x3FFF, 0xC346CCDA24976408), + make_floatx80_init(0x3FFF, 0xC5672A115506DADC), + make_floatx80_init(0x3FFF, 0xC78D74C8ABB9B15C), + make_floatx80_init(0x3FFF, 0xC9B9BD866E2F27A4), + make_floatx80_init(0x3FFF, 0xCBEC14FEF2727C5C), + make_floatx80_init(0x3FFF, 0xCE248C151F8480E4), + make_floatx80_init(0x3FFF, 0xD06333DAEF2B2594), + make_floatx80_init(0x3FFF, 0xD2A81D91F12AE45C), + make_floatx80_init(0x3FFF, 0xD4F35AABCFEDFA20), + make_floatx80_init(0x3FFF, 0xD744FCCAD69D6AF4), + make_floatx80_init(0x3FFF, 0xD99D15C278AFD7B4), + make_floatx80_init(0x3FFF, 0xDBFBB797DAF23754), + make_floatx80_init(0x3FFF, 0xDE60F4825E0E9124), + make_floatx80_init(0x3FFF, 0xE0CCDEEC2A94E110), + make_floatx80_init(0x3FFF, 0xE33F8972BE8A5A50), + make_floatx80_init(0x3FFF, 0xE5B906E77C8348A8), + make_floatx80_init(0x3FFF, 0xE8396A503C4BDC68), + make_floatx80_init(0x3FFF, 0xEAC0C6E7DD243930), + make_floatx80_init(0x3FFF, 0xED4F301ED9942B84), + make_floatx80_init(0x3FFF, 0xEFE4B99BDCDAF5CC), + make_floatx80_init(0x3FFF, 0xF281773C59FFB138), + make_floatx80_init(0x3FFF, 0xF5257D152486CC2C), + make_floatx80_init(0x3FFF, 0xF7D0DF730AD13BB8), + make_floatx80_init(0x3FFF, 0xFA83B2DB722A033C), + make_floatx80_init(0x3FFF, 0xFD3E0C0CF486C174) +}; + +static const float32 exp_tbl2[64] =3D { + const_float32(0x00000000), + const_float32(0x9F841A9B), + const_float32(0x9FC1D5B9), + const_float32(0xA0728369), + const_float32(0x1FC5C95C), + const_float32(0x1EE85C9F), + const_float32(0x9FA20729), + const_float32(0xA07BF9AF), + const_float32(0xA0020DCF), + const_float32(0x205A63DA), + const_float32(0x1EB70051), + const_float32(0x1F6EB029), + const_float32(0xA0781494), + const_float32(0x9EB319B0), + const_float32(0x2017457D), + const_float32(0x1F11D537), + const_float32(0x9FB952DD), + const_float32(0x1FE43087), + const_float32(0x1FA2A818), + const_float32(0x1FDE494D), + const_float32(0x20504890), + const_float32(0xA073691C), + const_float32(0x1F9B7A05), + const_float32(0xA0797126), + const_float32(0xA071A140), + const_float32(0x204F62DA), + const_float32(0x1F283C4A), + const_float32(0x9F9A7FDC), + const_float32(0xA05B3FAC), + const_float32(0x1FDF2610), + const_float32(0x9F705F90), + const_float32(0x201F678A), + const_float32(0x1F32FB13), + const_float32(0x20038B30), + const_float32(0x200DC3CC), + const_float32(0x9F8B2AE6), + const_float32(0xA02BBF70), + const_float32(0xA00BF518), + const_float32(0xA041DD41), + const_float32(0x9FDF137B), + const_float32(0x201F1568), + const_float32(0x1FC13A2E), + const_float32(0xA03F8F03), + const_float32(0x1FF4907D), + const_float32(0x9E6E53E4), + const_float32(0x1FD6D45C), + const_float32(0xA076EDB9), + const_float32(0x9FA6DE21), + const_float32(0x1EE69A2F), + const_float32(0x207F439F), + const_float32(0x201EC207), + const_float32(0x9E8BE175), + const_float32(0x20032C4B), + const_float32(0x2004DFF5), + const_float32(0x1E72F47A), + const_float32(0x1F722F22), + const_float32(0xA017E945), + const_float32(0x1F401A5B), + const_float32(0x9FB9A9E3), + const_float32(0x20744C05), + const_float32(0x1F773A19), + const_float32(0x1FFE90D5), + const_float32(0xA041ED22), + const_float32(0x1F853F3A), +}; #endif diff --git a/target/m68k/translate.c b/target/m68k/translate.c index 189b23d38d..4774310ded 100644 --- a/target/m68k/translate.c +++ b/target/m68k/translate.c @@ -5057,6 +5057,9 @@ DISAS_INSN(fpu) case 0x06: /* flognp1 */ gen_helper_flognp1(cpu_env, cpu_dest, cpu_src); break; + case 0x10: /* fetox */ + gen_helper_fetox(cpu_env, cpu_dest, cpu_src); + break; case 0x14: /* flogn */ gen_helper_flogn(cpu_env, cpu_dest, cpu_src); break; --=20 2.14.3 From nobody Mon Apr 29 13:47:32 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1520605718272295.8457441179801; Fri, 9 Mar 2018 06:28:38 -0800 (PST) Received: from localhost ([::1]:45578 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euJ0f-0002E0-F4 for importer@patchew.org; Fri, 09 Mar 2018 09:28:37 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58956) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euIyr-0000wT-Po for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:26:47 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1euIyp-0007DZ-SC for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:26:45 -0500 Received: from mout.kundenserver.de ([212.227.17.10]:58847) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1euIyp-0007Ce-F0 for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:26:43 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue105 [212.227.15.183]) with ESMTPSA (Nemesis) id 0MBjiJ-1emN1C38H1-00Ar5y; Fri, 09 Mar 2018 15:26:42 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Fri, 9 Mar 2018 15:26:29 +0100 Message-Id: <20180309142630.2170-8-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180309142630.2170-1-laurent@vivier.eu> References: <20180309142630.2170-1-laurent@vivier.eu> X-Provags-ID: V03:K0:Y6Dy7GczWmc2Z7z9UHxbuNv1a1q3/ZgLPFBIzOgLdKgCdWZE9yU ie212+6NRjtf3RNIEBnqvupSM38oYyFAyHpd0CNKeZP5Z9lc0g9RURj3iwtKYtNa+sNYhoN bZ8yOdnUGIFVihpHFwAT17lq56+Yr87XtmqAAwYsl73DcMtTDyRwbqzPGz3ur73iXUuMKWS QcSUR9D0KrwJIdzPFeNtQ== X-UI-Out-Filterresults: notjunk:1;V01:K0:b7xnFYPnsgM=:/GtFH6zQ4KVFcUL1Z4eZXL ezcfEkyqAKLZJv3x7//vUGRr26xOMJqkA9oJWIXWqOm88kFG6oq0YouJo4+UMvPwYiVrJPRW9 alD2mDDwSNNWkeNHBdLbfyVFVJdq2LYvZsSatlBqawG3ivg0ApTY3mmzYK95jKfnBsGamjwpQ 4zpL+vRd5qNdrod9gg8f2h03F9Ok7MmIlfAf2eeXg1fYgtc3lRjs+wl9y9XQmwvu5LaZkdUKh cn4ZfjLScoDMggD9QpH0+AIu6dqd7UZ9gpn21ypcGgACuws6Cb9zblISyQjSu3hCnxA4ZPsoY LDnJJn7hKEy7iZhIRRVabCg/y7jqJvrynGWon/Y3Ib5KaofXOkcugIVlQ3Ht40k8dThptzqCb LysFfqyDwCJKL3bQ814ut11LQrfh6An4+SYbIMkLregbZZ3Psyq9q9Yu40Z2kqgdVsP1VZB2G V7puXdwzH/qwlrxq7nI0FO+9bxiLNot+gJTQMmxVeTJz+VXe7ILVIatqgq7J4AsAtOZnyN2Ey P9BEiAcrkE1erNoFK4yMGAFUzV/tSAayN5Bo2LkMckzUBnY48g2KrtrPf8BNgmM5cTjax0Y/O z9EdvCuQy7GmXOcenToedpudps1vKq7PSFRmkWw4BEQYN/39Z3kI6B0r/CjNOkQTiqQfEUsNx Cw3SrrriuOHRbeIl63apK9eCaNsKy6TMOBg9EWnDRK+XfJXwqWAGP+nDptWMZ2aUSMpYrLj7p y3BNVgy/jcWfcxQ2xb5P8XmBlXTgtcYavaNDAw== X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 212.227.17.10 Subject: [Qemu-devel] [PULL 7/8] target/m68k: implement ftwotox X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laurent Vivier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Using a local m68k floatx80_twotox() [copied from previous: Written by Andreas Grabher for Previous, NeXT Computer Emulator.] Signed-off-by: Laurent Vivier Message-Id: <20180305203910.10391-8-laurent@vivier.eu> --- target/m68k/fpu_helper.c | 5 ++ target/m68k/helper.h | 1 + target/m68k/softfloat.c | 148 ++++++++++++++++++++++++++++++++= ++++ target/m68k/softfloat.h | 1 + target/m68k/softfloat_fpsp_tables.h | 86 +++++++++++++++++++++ target/m68k/translate.c | 3 + 6 files changed, 244 insertions(+) diff --git a/target/m68k/fpu_helper.c b/target/m68k/fpu_helper.c index 154666cbb5..f488a92ab2 100644 --- a/target/m68k/fpu_helper.c +++ b/target/m68k/fpu_helper.c @@ -582,3 +582,8 @@ void HELPER(fetox)(CPUM68KState *env, FPReg *res, FPReg= *val) { res->d =3D floatx80_etox(val->d, &env->fp_status); } + +void HELPER(ftwotox)(CPUM68KState *env, FPReg *res, FPReg *val) +{ + res->d =3D floatx80_twotox(val->d, &env->fp_status); +} diff --git a/target/m68k/helper.h b/target/m68k/helper.h index 70aeb2da7c..8caa82296d 100644 --- a/target/m68k/helper.h +++ b/target/m68k/helper.h @@ -73,6 +73,7 @@ DEF_HELPER_3(flogn, void, env, fp, fp) DEF_HELPER_3(flog10, void, env, fp, fp) DEF_HELPER_3(flog2, void, env, fp, fp) DEF_HELPER_3(fetox, void, env, fp, fp) +DEF_HELPER_3(ftwotox, void, env, fp, fp) =20 DEF_HELPER_3(mac_move, void, env, i32, i32) DEF_HELPER_3(macmulf, i64, env, i32, i32) diff --git a/target/m68k/softfloat.c b/target/m68k/softfloat.c index e58eb91738..cfff30d359 100644 --- a/target/m68k/softfloat.c +++ b/target/m68k/softfloat.c @@ -965,3 +965,151 @@ floatx80 floatx80_etox(floatx80 a, float_status *stat= us) return a; } } + +/*------------------------------------------------------------------------= ---- + | 2 to x + *------------------------------------------------------------------------= ----*/ + +floatx80 floatx80_twotox(floatx80 a, float_status *status) +{ + flag aSign; + int32_t aExp; + uint64_t aSig; + + int8_t user_rnd_mode, user_rnd_prec; + + int32_t compact, n, j, l, m, m1; + floatx80 fp0, fp1, fp2, fp3, adjfact, fact1, fact2; + + aSig =3D extractFloatx80Frac(a); + aExp =3D extractFloatx80Exp(a); + aSign =3D extractFloatx80Sign(a); + + if (aExp =3D=3D 0x7FFF) { + if ((uint64_t) (aSig << 1)) { + return propagateFloatx80NaNOneArg(a, status); + } + if (aSign) { + return packFloatx80(0, 0, 0); + } + return packFloatx80(0, floatx80_infinity.high, + floatx80_infinity.low); + } + + if (aExp =3D=3D 0 && aSig =3D=3D 0) { + return packFloatx80(0, one_exp, one_sig); + } + + user_rnd_mode =3D status->float_rounding_mode; + user_rnd_prec =3D status->floatx80_rounding_precision; + status->float_rounding_mode =3D float_round_nearest_even; + status->floatx80_rounding_precision =3D 80; + + fp0 =3D a; + + compact =3D floatx80_make_compact(aExp, aSig); + + if (compact < 0x3FB98000 || compact > 0x400D80C0) { + /* |X| > 16480 or |X| < 2^(-70) */ + if (compact > 0x3FFF8000) { /* |X| > 16480 */ + status->float_rounding_mode =3D user_rnd_mode; + status->floatx80_rounding_precision =3D user_rnd_prec; + + if (aSign) { + return roundAndPackFloatx80(status->floatx80_rounding_prec= ision, + 0, -0x1000, aSig, 0, status); + } else { + return roundAndPackFloatx80(status->floatx80_rounding_prec= ision, + 0, 0x8000, aSig, 0, status); + } + } else { /* |X| < 2^(-70) */ + status->float_rounding_mode =3D user_rnd_mode; + status->floatx80_rounding_precision =3D user_rnd_prec; + + a =3D floatx80_add(fp0, float32_to_floatx80( + make_float32(0x3F800000), status), + status); /* 1 + X */ + + float_raise(float_flag_inexact, status); + + return a; + } + } else { /* 2^(-70) <=3D |X| <=3D 16480 */ + fp1 =3D fp0; /* X */ + fp1 =3D floatx80_mul(fp1, float32_to_floatx80( + make_float32(0x42800000), status), + status); /* X * 64 */ + n =3D floatx80_to_int32(fp1, status); + fp1 =3D int32_to_floatx80(n, status); + j =3D n & 0x3F; + l =3D n / 64; /* NOTE: this is really arithmetic right shift by 6 = */ + if (n < 0 && j) { + /* arithmetic right shift is division and + * round towards minus infinity + */ + l--; + } + m =3D l / 2; /* NOTE: this is really arithmetic right shift by 1 */ + if (l < 0 && (l & 1)) { + /* arithmetic right shift is division and + * round towards minus infinity + */ + m--; + } + m1 =3D l - m; + m1 +=3D 0x3FFF; /* ADJFACT IS 2^(M') */ + + adjfact =3D packFloatx80(0, m1, one_sig); + fact1 =3D exp2_tbl[j]; + fact1.high +=3D m; + fact2.high =3D exp2_tbl2[j] >> 16; + fact2.high +=3D m; + fact2.low =3D (uint64_t)(exp2_tbl2[j] & 0xFFFF); + fact2.low <<=3D 48; + + fp1 =3D floatx80_mul(fp1, float32_to_floatx80( + make_float32(0x3C800000), status), + status); /* (1/64)*N */ + fp0 =3D floatx80_sub(fp0, fp1, status); /* X - (1/64)*INT(64 X) */ + fp2 =3D packFloatx80(0, 0x3FFE, LIT64(0xB17217F7D1CF79AC)); /* LOG= 2 */ + fp0 =3D floatx80_mul(fp0, fp2, status); /* R */ + + /* EXPR */ + fp1 =3D floatx80_mul(fp0, fp0, status); /* S =3D R*R */ + fp2 =3D float64_to_floatx80(make_float64(0x3F56C16D6F7BD0B2), + status); /* A5 */ + fp3 =3D float64_to_floatx80(make_float64(0x3F811112302C712C), + status); /* A4 */ + fp2 =3D floatx80_mul(fp2, fp1, status); /* S*A5 */ + fp3 =3D floatx80_mul(fp3, fp1, status); /* S*A4 */ + fp2 =3D floatx80_add(fp2, float64_to_floatx80( + make_float64(0x3FA5555555554CC1), status), + status); /* A3+S*A5 */ + fp3 =3D floatx80_add(fp3, float64_to_floatx80( + make_float64(0x3FC5555555554A54), status), + status); /* A2+S*A4 */ + fp2 =3D floatx80_mul(fp2, fp1, status); /* S*(A3+S*A5) */ + fp3 =3D floatx80_mul(fp3, fp1, status); /* S*(A2+S*A4) */ + fp2 =3D floatx80_add(fp2, float64_to_floatx80( + make_float64(0x3FE0000000000000), status), + status); /* A1+S*(A3+S*A5) */ + fp3 =3D floatx80_mul(fp3, fp0, status); /* R*S*(A2+S*A4) */ + + fp2 =3D floatx80_mul(fp2, fp1, status); /* S*(A1+S*(A3+S*A5)) */ + fp0 =3D floatx80_add(fp0, fp3, status); /* R+R*S*(A2+S*A4) */ + fp0 =3D floatx80_add(fp0, fp2, status); /* EXP(R) - 1 */ + + fp0 =3D floatx80_mul(fp0, fact1, status); + fp0 =3D floatx80_add(fp0, fact2, status); + fp0 =3D floatx80_add(fp0, fact1, status); + + status->float_rounding_mode =3D user_rnd_mode; + status->floatx80_rounding_precision =3D user_rnd_prec; + + a =3D floatx80_mul(fp0, adjfact, status); + + float_raise(float_flag_inexact, status); + + return a; + } +} diff --git a/target/m68k/softfloat.h b/target/m68k/softfloat.h index 250f0d926f..964275d2a5 100644 --- a/target/m68k/softfloat.h +++ b/target/m68k/softfloat.h @@ -32,4 +32,5 @@ floatx80 floatx80_logn(floatx80 a, float_status *status); floatx80 floatx80_log10(floatx80 a, float_status *status); floatx80 floatx80_log2(floatx80 a, float_status *status); floatx80 floatx80_etox(floatx80 a, float_status *status); +floatx80 floatx80_twotox(floatx80 a, float_status *status); #endif diff --git a/target/m68k/softfloat_fpsp_tables.h b/target/m68k/softfloat_fp= sp_tables.h index b2b63e5ced..dd76dc0373 100755 --- a/target/m68k/softfloat_fpsp_tables.h +++ b/target/m68k/softfloat_fpsp_tables.h @@ -285,4 +285,90 @@ static const float32 exp_tbl2[64] =3D { const_float32(0xA041ED22), const_float32(0x1F853F3A), }; + +static const floatx80 exp2_tbl[64] =3D { + make_floatx80_init(0x3FFF, 0x8000000000000000), + make_floatx80_init(0x3FFF, 0x8164D1F3BC030773), + make_floatx80_init(0x3FFF, 0x82CD8698AC2BA1D7), + make_floatx80_init(0x3FFF, 0x843A28C3ACDE4046), + make_floatx80_init(0x3FFF, 0x85AAC367CC487B15), + make_floatx80_init(0x3FFF, 0x871F61969E8D1010), + make_floatx80_init(0x3FFF, 0x88980E8092DA8527), + make_floatx80_init(0x3FFF, 0x8A14D575496EFD9A), + make_floatx80_init(0x3FFF, 0x8B95C1E3EA8BD6E7), + make_floatx80_init(0x3FFF, 0x8D1ADF5B7E5BA9E6), + make_floatx80_init(0x3FFF, 0x8EA4398B45CD53C0), + make_floatx80_init(0x3FFF, 0x9031DC431466B1DC), + make_floatx80_init(0x3FFF, 0x91C3D373AB11C336), + make_floatx80_init(0x3FFF, 0x935A2B2F13E6E92C), + make_floatx80_init(0x3FFF, 0x94F4EFA8FEF70961), + make_floatx80_init(0x3FFF, 0x96942D3720185A00), + make_floatx80_init(0x3FFF, 0x9837F0518DB8A96F), + make_floatx80_init(0x3FFF, 0x99E0459320B7FA65), + make_floatx80_init(0x3FFF, 0x9B8D39B9D54E5539), + make_floatx80_init(0x3FFF, 0x9D3ED9A72CFFB751), + make_floatx80_init(0x3FFF, 0x9EF5326091A111AE), + make_floatx80_init(0x3FFF, 0xA0B0510FB9714FC2), + make_floatx80_init(0x3FFF, 0xA27043030C496819), + make_floatx80_init(0x3FFF, 0xA43515AE09E6809E), + make_floatx80_init(0x3FFF, 0xA5FED6A9B15138EA), + make_floatx80_init(0x3FFF, 0xA7CD93B4E965356A), + make_floatx80_init(0x3FFF, 0xA9A15AB4EA7C0EF8), + make_floatx80_init(0x3FFF, 0xAB7A39B5A93ED337), + make_floatx80_init(0x3FFF, 0xAD583EEA42A14AC6), + make_floatx80_init(0x3FFF, 0xAF3B78AD690A4375), + make_floatx80_init(0x3FFF, 0xB123F581D2AC2590), + make_floatx80_init(0x3FFF, 0xB311C412A9112489), + make_floatx80_init(0x3FFF, 0xB504F333F9DE6484), + make_floatx80_init(0x3FFF, 0xB6FD91E328D17791), + make_floatx80_init(0x3FFF, 0xB8FBAF4762FB9EE9), + make_floatx80_init(0x3FFF, 0xBAFF5AB2133E45FB), + make_floatx80_init(0x3FFF, 0xBD08A39F580C36BF), + make_floatx80_init(0x3FFF, 0xBF1799B67A731083), + make_floatx80_init(0x3FFF, 0xC12C4CCA66709456), + make_floatx80_init(0x3FFF, 0xC346CCDA24976407), + make_floatx80_init(0x3FFF, 0xC5672A115506DADD), + make_floatx80_init(0x3FFF, 0xC78D74C8ABB9B15D), + make_floatx80_init(0x3FFF, 0xC9B9BD866E2F27A3), + make_floatx80_init(0x3FFF, 0xCBEC14FEF2727C5D), + make_floatx80_init(0x3FFF, 0xCE248C151F8480E4), + make_floatx80_init(0x3FFF, 0xD06333DAEF2B2595), + make_floatx80_init(0x3FFF, 0xD2A81D91F12AE45A), + make_floatx80_init(0x3FFF, 0xD4F35AABCFEDFA1F), + make_floatx80_init(0x3FFF, 0xD744FCCAD69D6AF4), + make_floatx80_init(0x3FFF, 0xD99D15C278AFD7B6), + make_floatx80_init(0x3FFF, 0xDBFBB797DAF23755), + make_floatx80_init(0x3FFF, 0xDE60F4825E0E9124), + make_floatx80_init(0x3FFF, 0xE0CCDEEC2A94E111), + make_floatx80_init(0x3FFF, 0xE33F8972BE8A5A51), + make_floatx80_init(0x3FFF, 0xE5B906E77C8348A8), + make_floatx80_init(0x3FFF, 0xE8396A503C4BDC68), + make_floatx80_init(0x3FFF, 0xEAC0C6E7DD24392F), + make_floatx80_init(0x3FFF, 0xED4F301ED9942B84), + make_floatx80_init(0x3FFF, 0xEFE4B99BDCDAF5CB), + make_floatx80_init(0x3FFF, 0xF281773C59FFB13A), + make_floatx80_init(0x3FFF, 0xF5257D152486CC2C), + make_floatx80_init(0x3FFF, 0xF7D0DF730AD13BB9), + make_floatx80_init(0x3FFF, 0xFA83B2DB722A033A), + make_floatx80_init(0x3FFF, 0xFD3E0C0CF486C175) +}; + +static const uint32_t exp2_tbl2[64] =3D { + 0x3F738000, 0x3FBEF7CA, 0x3FBDF8A9, 0x3FBCD7C9, + 0xBFBDE8DA, 0x3FBDE85C, 0x3FBEBBF1, 0x3FBB80CA, + 0xBFBA8373, 0xBFBE9670, 0x3FBDB700, 0x3FBEEEB0, + 0x3FBBFD6D, 0xBFBDB319, 0x3FBDBA2B, 0x3FBE91D5, + 0x3FBE8D5A, 0xBFBCDE7B, 0xBFBEBAAF, 0xBFBD86DA, + 0xBFBEBEDD, 0x3FBCC96E, 0xBFBEC90B, 0x3FBBD1DB, + 0x3FBCE5EB, 0xBFBEC274, 0x3FBEA83C, 0x3FBECB00, + 0x3FBE9301, 0xBFBD8367, 0xBFBEF05F, 0x3FBDFB3C, + 0x3FBEB2FB, 0x3FBAE2CB, 0x3FBCDC3C, 0x3FBEE9AA, + 0xBFBEAEFD, 0xBFBCBF51, 0x3FBEF88A, 0x3FBD83B2, + 0x3FBDF8AB, 0xBFBDFB17, 0xBFBEFE3C, 0xBFBBB6F8, + 0xBFBCEE53, 0xBFBDA4AE, 0x3FBC9124, 0x3FBEB243, + 0x3FBDE69A, 0xBFB8BC61, 0x3FBDF610, 0xBFBD8BE1, + 0x3FBACB12, 0x3FBB9BFE, 0x3FBCF2F4, 0x3FBEF22F, + 0xBFBDBF4A, 0x3FBEC01A, 0x3FBE8CAC, 0xBFBCBB3F, + 0x3FBEF73A, 0xBFB8B795, 0x3FBEF84B, 0xBFBEF581 +}; #endif diff --git a/target/m68k/translate.c b/target/m68k/translate.c index 4774310ded..c65c82e258 100644 --- a/target/m68k/translate.c +++ b/target/m68k/translate.c @@ -5060,6 +5060,9 @@ DISAS_INSN(fpu) case 0x10: /* fetox */ gen_helper_fetox(cpu_env, cpu_dest, cpu_src); break; + case 0x11: /* ftwotox */ + gen_helper_ftwotox(cpu_env, cpu_dest, cpu_src); + break; case 0x14: /* flogn */ gen_helper_flogn(cpu_env, cpu_dest, cpu_src); break; --=20 2.14.3 From nobody Mon Apr 29 13:47:32 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) client-ip=208.118.235.17; envelope-from=qemu-devel-bounces+importer=patchew.org@nongnu.org; helo=lists.gnu.org; Authentication-Results: mx.zohomail.com; spf=pass (zoho.com: domain of gnu.org designates 208.118.235.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) by mx.zohomail.com with SMTPS id 1520606133895388.05909145289104; Fri, 9 Mar 2018 06:35:33 -0800 (PST) Received: from localhost ([::1]:45623 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euJ7N-0007tc-43 for importer@patchew.org; Fri, 09 Mar 2018 09:35:33 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:58996) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euIyv-00011d-Lz for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:26:53 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1euIyq-0007Dz-EK for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:26:49 -0500 Received: from mout.kundenserver.de ([217.72.192.75]:58653) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1euIyq-0007DD-4M for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:26:44 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue105 [212.227.15.183]) with ESMTPSA (Nemesis) id 0Lu4P8-1eUQcu267i-011RiR; Fri, 09 Mar 2018 15:26:42 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Fri, 9 Mar 2018 15:26:30 +0100 Message-Id: <20180309142630.2170-9-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180309142630.2170-1-laurent@vivier.eu> References: <20180309142630.2170-1-laurent@vivier.eu> X-Provags-ID: V03:K0:OQVIFc0KSXbfi3/CcGip3Crc14ga7pCqNPKURX2sKpZCNgOavIT CP98rCo2DDEBd6tiaaGqghxf94vEWIKjFQwGIkfAmPly7w04q4pEHeQo9DGX+5SLSbwkQvn XCWkfpYmHhD3P+Mud/q6krCBw37uQl7c+Tivx14Mzt4zn5cnxowQ2RtQm88deHHUu7bcRr9 NvGGDm8p1gB5woSi9a8Lg== X-UI-Out-Filterresults: notjunk:1;V01:K0:wJSpDB4GanE=:k+nGwfurZHeq3z7qC95oN/ aN54VPECUL3LuU81facEk7r56kOAAwg5/ueUtWmCiYs/hMjZnJdrql/t4lJ43/22BlaOKGxPW X06UE7zzNKXUS56n0usLCcnDr5hZilHNh3av93Ye4TM62woaRwFDcvm7Vma4jwQr6hnJZMcu0 X0JnMgmH/UEPdeLqdDPFQjD85Ce6/fRuCN0EPVBcwTPzIdEcUzj6vCyxIvOSgKfluu6wsuFvn H+ZewH5KwtPi/B8QGcHuZjQk0gUu4sXUBvlAdXHneyTThEtnj4UTzWT9VDPqpCaK2sYP/LYQU Cumcvdp9f7fHZFYIFrfll0oXnPq4WZ30lmdE/gJRWEwvNvBTmdX6HN1Hyp6wTE7wSQDyqyAhc GyDjpypfzyogXNg+7pwzuR6YRWLlniS42GozKuUZ3vF3GtnfHDBeWPDy72FRja7qd8ClSPu+z regRGasDF21FAn+3xhWdQC5MJ5u/bkHZ3T5zPRakjL7lqsVzO1TDmcAx2JqrWHRi9JYnbRwyX o6PQnlotAXkjf6UM/dCon/UvofXNU03J2RVxBMbXlElMWzorBmfWc5157xjR0DkVgAxtwrX/i Qu5aWqIQZ0T5sYFgFYn2Dk+ryN+ZEik59iiR8lkAS9+bJqCYJlpZItzym2g4Z67tP4RdPf4jv 2aSJim4pSDGRuV6f2SpZYZU5FQEeycGSgrSizIhK3jMl3Gz82u7wdAAgym2HTr6Y2ySQ97djT 2yy0lICphrF7iVg2O4erwoCsJYQvGE+DVgQm8g== X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 217.72.192.75 Subject: [Qemu-devel] [PULL 8/8] target/m68k: implement ftentox X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.21 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Laurent Vivier Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" X-ZohoMail: RSF_0 Z_629925259 SPT_0 Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Using a local m68k floatx80_tentox() [copied from previous: Written by Andreas Grabher for Previous, NeXT Computer Emulator.] Signed-off-by: Laurent Vivier Message-Id: <20180305203910.10391-9-laurent@vivier.eu> --- target/m68k/fpu_helper.c | 5 ++ target/m68k/helper.h | 1 + target/m68k/softfloat.c | 153 +++++++++++++++++++++++++++++++++++++++++++= ++++ target/m68k/softfloat.h | 1 + target/m68k/translate.c | 3 + 5 files changed, 163 insertions(+) diff --git a/target/m68k/fpu_helper.c b/target/m68k/fpu_helper.c index f488a92ab2..62cbb0dff1 100644 --- a/target/m68k/fpu_helper.c +++ b/target/m68k/fpu_helper.c @@ -587,3 +587,8 @@ void HELPER(ftwotox)(CPUM68KState *env, FPReg *res, FPR= eg *val) { res->d =3D floatx80_twotox(val->d, &env->fp_status); } + +void HELPER(ftentox)(CPUM68KState *env, FPReg *res, FPReg *val) +{ + res->d =3D floatx80_tentox(val->d, &env->fp_status); +} diff --git a/target/m68k/helper.h b/target/m68k/helper.h index 8caa82296d..9a9734c196 100644 --- a/target/m68k/helper.h +++ b/target/m68k/helper.h @@ -74,6 +74,7 @@ DEF_HELPER_3(flog10, void, env, fp, fp) DEF_HELPER_3(flog2, void, env, fp, fp) DEF_HELPER_3(fetox, void, env, fp, fp) DEF_HELPER_3(ftwotox, void, env, fp, fp) +DEF_HELPER_3(ftentox, void, env, fp, fp) =20 DEF_HELPER_3(mac_move, void, env, i32, i32) DEF_HELPER_3(macmulf, i64, env, i32, i32) diff --git a/target/m68k/softfloat.c b/target/m68k/softfloat.c index cfff30d359..4bd5b9e6b7 100644 --- a/target/m68k/softfloat.c +++ b/target/m68k/softfloat.c @@ -1113,3 +1113,156 @@ floatx80 floatx80_twotox(floatx80 a, float_status *= status) return a; } } + +/*------------------------------------------------------------------------= ---- + | 10 to x + *------------------------------------------------------------------------= ----*/ + +floatx80 floatx80_tentox(floatx80 a, float_status *status) +{ + flag aSign; + int32_t aExp; + uint64_t aSig; + + int8_t user_rnd_mode, user_rnd_prec; + + int32_t compact, n, j, l, m, m1; + floatx80 fp0, fp1, fp2, fp3, adjfact, fact1, fact2; + + aSig =3D extractFloatx80Frac(a); + aExp =3D extractFloatx80Exp(a); + aSign =3D extractFloatx80Sign(a); + + if (aExp =3D=3D 0x7FFF) { + if ((uint64_t) (aSig << 1)) { + return propagateFloatx80NaNOneArg(a, status); + } + if (aSign) { + return packFloatx80(0, 0, 0); + } + return packFloatx80(0, floatx80_infinity.high, + floatx80_infinity.low); + } + + if (aExp =3D=3D 0 && aSig =3D=3D 0) { + return packFloatx80(0, one_exp, one_sig); + } + + user_rnd_mode =3D status->float_rounding_mode; + user_rnd_prec =3D status->floatx80_rounding_precision; + status->float_rounding_mode =3D float_round_nearest_even; + status->floatx80_rounding_precision =3D 80; + + fp0 =3D a; + + compact =3D floatx80_make_compact(aExp, aSig); + + if (compact < 0x3FB98000 || compact > 0x400B9B07) { + /* |X| > 16480 LOG2/LOG10 or |X| < 2^(-70) */ + if (compact > 0x3FFF8000) { /* |X| > 16480 */ + status->float_rounding_mode =3D user_rnd_mode; + status->floatx80_rounding_precision =3D user_rnd_prec; + + if (aSign) { + return roundAndPackFloatx80(status->floatx80_rounding_prec= ision, + 0, -0x1000, aSig, 0, status); + } else { + return roundAndPackFloatx80(status->floatx80_rounding_prec= ision, + 0, 0x8000, aSig, 0, status); + } + } else { /* |X| < 2^(-70) */ + status->float_rounding_mode =3D user_rnd_mode; + status->floatx80_rounding_precision =3D user_rnd_prec; + + a =3D floatx80_add(fp0, float32_to_floatx80( + make_float32(0x3F800000), status), + status); /* 1 + X */ + + float_raise(float_flag_inexact, status); + + return a; + } + } else { /* 2^(-70) <=3D |X| <=3D 16480 LOG 2 / LOG 10 */ + fp1 =3D fp0; /* X */ + fp1 =3D floatx80_mul(fp1, float64_to_floatx80( + make_float64(0x406A934F0979A371), + status), status); /* X*64*LOG10/LOG2 */ + n =3D floatx80_to_int32(fp1, status); /* N=3DINT(X*64*LOG10/LOG2) = */ + fp1 =3D int32_to_floatx80(n, status); + + j =3D n & 0x3F; + l =3D n / 64; /* NOTE: this is really arithmetic right shift by 6 = */ + if (n < 0 && j) { + /* arithmetic right shift is division and + * round towards minus infinity + */ + l--; + } + m =3D l / 2; /* NOTE: this is really arithmetic right shift by 1 */ + if (l < 0 && (l & 1)) { + /* arithmetic right shift is division and + * round towards minus infinity + */ + m--; + } + m1 =3D l - m; + m1 +=3D 0x3FFF; /* ADJFACT IS 2^(M') */ + + adjfact =3D packFloatx80(0, m1, one_sig); + fact1 =3D exp2_tbl[j]; + fact1.high +=3D m; + fact2.high =3D exp2_tbl2[j] >> 16; + fact2.high +=3D m; + fact2.low =3D (uint64_t)(exp2_tbl2[j] & 0xFFFF); + fact2.low <<=3D 48; + + fp2 =3D fp1; /* N */ + fp1 =3D floatx80_mul(fp1, float64_to_floatx80( + make_float64(0x3F734413509F8000), status), + status); /* N*(LOG2/64LOG10)_LEAD */ + fp3 =3D packFloatx80(1, 0x3FCD, LIT64(0xC0219DC1DA994FD2)); + fp2 =3D floatx80_mul(fp2, fp3, status); /* N*(LOG2/64LOG10)_TRAIL = */ + fp0 =3D floatx80_sub(fp0, fp1, status); /* X - N L_LEAD */ + fp0 =3D floatx80_sub(fp0, fp2, status); /* X - N L_TRAIL */ + fp2 =3D packFloatx80(0, 0x4000, LIT64(0x935D8DDDAAA8AC17)); /* LOG= 10 */ + fp0 =3D floatx80_mul(fp0, fp2, status); /* R */ + + /* EXPR */ + fp1 =3D floatx80_mul(fp0, fp0, status); /* S =3D R*R */ + fp2 =3D float64_to_floatx80(make_float64(0x3F56C16D6F7BD0B2), + status); /* A5 */ + fp3 =3D float64_to_floatx80(make_float64(0x3F811112302C712C), + status); /* A4 */ + fp2 =3D floatx80_mul(fp2, fp1, status); /* S*A5 */ + fp3 =3D floatx80_mul(fp3, fp1, status); /* S*A4 */ + fp2 =3D floatx80_add(fp2, float64_to_floatx80( + make_float64(0x3FA5555555554CC1), status), + status); /* A3+S*A5 */ + fp3 =3D floatx80_add(fp3, float64_to_floatx80( + make_float64(0x3FC5555555554A54), status), + status); /* A2+S*A4 */ + fp2 =3D floatx80_mul(fp2, fp1, status); /* S*(A3+S*A5) */ + fp3 =3D floatx80_mul(fp3, fp1, status); /* S*(A2+S*A4) */ + fp2 =3D floatx80_add(fp2, float64_to_floatx80( + make_float64(0x3FE0000000000000), status), + status); /* A1+S*(A3+S*A5) */ + fp3 =3D floatx80_mul(fp3, fp0, status); /* R*S*(A2+S*A4) */ + + fp2 =3D floatx80_mul(fp2, fp1, status); /* S*(A1+S*(A3+S*A5)) */ + fp0 =3D floatx80_add(fp0, fp3, status); /* R+R*S*(A2+S*A4) */ + fp0 =3D floatx80_add(fp0, fp2, status); /* EXP(R) - 1 */ + + fp0 =3D floatx80_mul(fp0, fact1, status); + fp0 =3D floatx80_add(fp0, fact2, status); + fp0 =3D floatx80_add(fp0, fact1, status); + + status->float_rounding_mode =3D user_rnd_mode; + status->floatx80_rounding_precision =3D user_rnd_prec; + + a =3D floatx80_mul(fp0, adjfact, status); + + float_raise(float_flag_inexact, status); + + return a; + } +} diff --git a/target/m68k/softfloat.h b/target/m68k/softfloat.h index 964275d2a5..d28e49fe9f 100644 --- a/target/m68k/softfloat.h +++ b/target/m68k/softfloat.h @@ -33,4 +33,5 @@ floatx80 floatx80_log10(floatx80 a, float_status *status); floatx80 floatx80_log2(floatx80 a, float_status *status); floatx80 floatx80_etox(floatx80 a, float_status *status); floatx80 floatx80_twotox(floatx80 a, float_status *status); +floatx80 floatx80_tentox(floatx80 a, float_status *status); #endif diff --git a/target/m68k/translate.c b/target/m68k/translate.c index c65c82e258..6d5bde0777 100644 --- a/target/m68k/translate.c +++ b/target/m68k/translate.c @@ -5063,6 +5063,9 @@ DISAS_INSN(fpu) case 0x11: /* ftwotox */ gen_helper_ftwotox(cpu_env, cpu_dest, cpu_src); break; + case 0x12: /* ftentox */ + gen_helper_ftentox(cpu_env, cpu_dest, cpu_src); + break; case 0x14: /* flogn */ gen_helper_flogn(cpu_env, cpu_dest, cpu_src); break; --=20 2.14.3