From nobody Fri May 17 09:18:56 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 1520607774149211.49893630763984; Fri, 9 Mar 2018 07:02:54 -0800 (PST) Received: from localhost ([::1]:45775 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euJXp-0007Po-Bu for importer@patchew.org; Fri, 09 Mar 2018 10:02:53 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38120) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euJSh-0003Is-QB for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:57:36 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1euJSe-0002wa-D2 for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:57:35 -0500 Received: from mout.kundenserver.de ([212.227.17.10]:51599) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1euJSe-0002vf-42 for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:57:32 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue102 [212.227.15.183]) with ESMTPSA (Nemesis) id 0McFi3-1fCoRx2Wmt-00Jaow; Fri, 09 Mar 2018 15:57:30 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Fri, 9 Mar 2018 15:57:10 +0100 Message-Id: <20180309145717.9603-2-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180309145717.9603-1-laurent@vivier.eu> References: <20180309145717.9603-1-laurent@vivier.eu> X-Provags-ID: V03:K0:VdxWMQcG9Px92PtGKS8P8o+akFqNJp2t8ucbkMhWETpeH8GnhNy LLev6+MewAhU24+L1LueChE5KBDX8V3zSfCbgLn5aEIJrPjm9Z32x/SaFvZTecykZ8RAEgw UQ/Pocb01mSENfUqxLpHe3bApUb7qzkdiNMCHqo+3vojNraAkhvGT3GMwBR9bUJZHb1UOBK yWyk7zwvsnCxj7nCajZYQ== X-UI-Out-Filterresults: notjunk:1;V01:K0:ZvShg4hPDB4=:KX2mVkcuN4UwahbD/cfpAi AMlY0mfX6LboZTFsmbXszlzbKnlRmn4s58V545NSL3sdKX9hjcXwPJkSZ4tET+km2v6ljzMPD R3L5zCA9j8cnpqtViqIUa9+7ZNovKiGFzb3qs5cEFiOFuYA8VKDdCXiyTa+GxQXv5NsnEpA9m C62lCH8WiSHk/FJ6dHpRJdx/aPoMdKprrQQy/xLJ7eKKMyPaqSynzJ0V2J2/8NOLhxk+rZmGC rC1s2eAwb4ELLN7NUZdnZqzqQltZiIocl8r+8IK5dcnffyFkgzf10ESm4kJ4QhuOqw+UCTxXH MR8dtAxuV0yOxTLFs3kUx6NEwIh/GJSB08NToSfNYEvmfk7W7mWX7e+LGS4s1nN746p5oG6Tv qI9jJCDwi4hkycbj67fhseFDLfWOWbg91BdN19Jj6hc66k8p70IPKBGMxtEDOWMZkeWM8GU1Q E/VNQP3YbPLv7kG09GkemXXLLNzMfKU4H+Oqeb7bzNcV3lPJxRAtTIaoYhu9juPneIKBd7WEa jgOE3w8MB9CVcxhxSV6cjBnOblMtCvXv6IcscXb0tAPG6Xp9NSoGFOXrCSQDl4HLkW9LXfUr6 UIqqhJLrks9obOQ5U4NeUivg8qoDqeqnRgNKs57PqIQ4ET2UvbC0tNa6qgeSfkTJkMRuWAA65 9FRZP1xf1EnN6cAZJnEmIvckCs6Ag9aJKXT6K6H24CHnClKhiKHurp8v8kM+Or40hR9wXMCQU Qi6UEoFmMWiuGPB3sFAhvsW7wHqgGpS/Kv4i/A== 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 v2 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 Fri May 17 09:18:56 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 1520607864356992.1344513854467; Fri, 9 Mar 2018 07:04:24 -0800 (PST) Received: from localhost ([::1]:45784 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euJZH-0008WF-FX for importer@patchew.org; Fri, 09 Mar 2018 10:04:23 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38121) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euJSh-0003It-QT for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:57:38 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1euJSf-0002xN-Ac for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:57:35 -0500 Received: from mout.kundenserver.de ([212.227.17.10]:48071) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1euJSe-0002wJ-Sj for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:57:33 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue102 [212.227.15.183]) with ESMTPSA (Nemesis) id 0MZDZc-1fFIDn0N80-00Kyf7; Fri, 09 Mar 2018 15:57:31 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Fri, 9 Mar 2018 15:57:11 +0100 Message-Id: <20180309145717.9603-3-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180309145717.9603-1-laurent@vivier.eu> References: <20180309145717.9603-1-laurent@vivier.eu> X-Provags-ID: V03:K0:Pi2LGaKLEp2Ndi6FzQCgBvJFFG6PTh5SWdsBqIlJXlWzbxIKFUS azxsToKARz+GyMybKbkpIuJIo02mNhGeBlVIyl0EBycXF+UmbPz2h6QQmXaguxEsCaraRSR j9Sjy6NdTfEF1olF25DFAqRUhBj/1xRFvXjFHIlxsiL3DXvNR0an7sVkucVnQ53ID6Tfl7I awKG6QmvUI3Qse4++UfBg== X-UI-Out-Filterresults: notjunk:1;V01:K0:db+tqIb0OO8=:GJoPu/bVVSD6mJgQqCq0/o X+mFbEx5AadUoFz1H7KQxz86jjKazEKSdgHJcXzeSZWXJ+p/X4p6uRfHFrPOZmWc5/YSFn+EX x6lpdVy2a6Xo3Jz0/j7MEOyvikdaYishoYsp3ZsOekp+Y84GYjZ4Bqd+LSSaiCQXbMQYuh7M6 m4lE93D74qkT8cBVJG3TsClLLeUTHPKmJSrzPClQ6dEwgQAmMSBfYFS2nWty0PlhncagDfNl0 S+pxhyzrRBbFqiPP34IIMKjZqkckOUMKynDtCmpqIT/xtWq/SwAOGfVxYZABvyTX7J4Xnde/f ZHX5lgy4mujx/Nk9wFfl9ShV7JJDPXIyxVhEhj+Cezbe7Qqq2T32qLMymYETOZm4DBqrgizz+ rMGKcP7bpSKBoJkPLh1bfYWQ0sAVmJqqqlk1ZJJw4o0eDPBZEXW8kcVXddnxQagacsynYnX1g qra7Tc3+sQTmngPp7s9W1uch5QlLSTXnreztpe3lqUin7QgiFxf4iRIGG1LT5dOol8CpmNmUM gMc8dqurSW41Kg2hyTySRKXOvP5zIU8sdlY5zDQKsJfEz5l8evqJPuFVDPwrDYHlj53tGNMty B8N1o+4BGejg9677E3BnsH4EVv/mECoA+2vnD1aWJ+gv4mHGzF/HDf6ggvBvcxuw7/iGEMjsy 5/1ujf7qJJobyQnmUKKgUdILIguvEYxc4wYhCBLDz9bFjQ6aMSS/ST/dRUIGty7V/nRvEZR1f vNVNI6wRCN4N8+ynqugJgaVyh552705m1iSxdw== 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 v2 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 100644 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 100644 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 Fri May 17 09:18:56 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 1520607996753726.1979596408851; Fri, 9 Mar 2018 07:06:36 -0800 (PST) Received: from localhost ([::1]:45799 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euJbP-0001oo-Sb for importer@patchew.org; Fri, 09 Mar 2018 10:06:35 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38152) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euJSj-0003K3-KA for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:57:39 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1euJSg-0002yZ-De for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:57:37 -0500 Received: from mout.kundenserver.de ([217.72.192.74]:39517) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1euJSg-0002xD-32 for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:57:34 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue102 [212.227.15.183]) with ESMTPSA (Nemesis) id 0MdLdb-1fBhzE41QJ-00IUtG; Fri, 09 Mar 2018 15:57:32 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Fri, 9 Mar 2018 15:57:12 +0100 Message-Id: <20180309145717.9603-4-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180309145717.9603-1-laurent@vivier.eu> References: <20180309145717.9603-1-laurent@vivier.eu> X-Provags-ID: V03:K0:pbJRx3UWqi7hdcWg5dGgMmNu9RQmxkNBLkNfTsLAMKrbZ0Jx5t2 6K923PzYxJbH+lEAKal/cUG7vX7kLpvH0Ly3FzszVSvodoCXaqUXuI1w5sa6RmJlBB2u5uw 833yBbXPi4zbei68CBCkVqjuQhrpkfdJsQTWsFb7R0GB/w5YJbmhknn1KlkewgQr7kRbctu nR1YQE2JZbpa+RaiuYRCw== X-UI-Out-Filterresults: notjunk:1;V01:K0:MBykFIL1QpM=:icgl/e+Gju41MhIW2QpJEQ 8yPL5ln20HkONvpOLdaR37W9NPB47hzmsiBWYxKk1nNV/C5YQr/uqbdO6vAr/DOhqnppTHrmd BSVEVf2EmfLWTCg7vFJbJk0jXrmb8w4XaUVl705Yci9AKR8oYHX++pSR/M2GleLIFzZw1hFcb lBRbDa5GkEHdgfXAzEp1jL3cchCjL/TxFyfwGiOmsuVKB0YQWf49Z8PweePcd8WBRwKy2FtOe rWlDyrgJNbzoyEuJeWv8C3vq/r1fUJZGIKEos/wjEi1soLqyRNBav7Nw01LGf1ld1ls0hLJNR g6i2IreNADqHl5KmRLFFe754EW2MiuzKE1zholOL2EmNWSv/pvojK3CxsbLTO++L0L/3udOPp E+NN5QON1cQxO8zJwSpToDef9/zNpDAjMCHWBK/bd/Ln6ZLAL4S/BLiZ6pU+t9cpfBmwxQb5J LygiDJ35mEapPProm1o8MMzgSTrKE+XEviBw8xZ2PlD5pbc0GCWlPvy4pYW7knvpaNr8HfEU5 GqxrFw5PNXfCrHqADW/IkvmX0fvC6myBbtqywKAhHvY0JHxV6KbFlomWrn8enMSEnk4ixwuZI BDeq84/JypKdFnBmk5SussMinmjp7U3bfhImaf8b8uAQOak5x9GyHOkniKzBaCUenGqXHqXpf Bsk+101fngVRNn4WIXyn5MGj0cULBYUxk4acMH7GnYkozudOHgxch8Al09EFQ8okl+woQS/9O T3kjNf68qnxiCfbk4yJHAVzenDh2PzyYk3PLDQ== 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 v2 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 Fri May 17 09:18:56 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 1520607703912683.9946585034764; Fri, 9 Mar 2018 07:01:43 -0800 (PST) Received: from localhost ([::1]:45772 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euJWc-0006Vg-9b for importer@patchew.org; Fri, 09 Mar 2018 10:01:38 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38125) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euJSi-0003J0-0U for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:57:37 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1euJSg-0002yu-VT for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:57:36 -0500 Received: from mout.kundenserver.de ([212.227.17.13]:59549) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1euJSg-0002xw-MG for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:57:34 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue102 [212.227.15.183]) with ESMTPSA (Nemesis) id 0MPXsH-1ez0Q93ghN-004hMu; Fri, 09 Mar 2018 15:57:33 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Fri, 9 Mar 2018 15:57:13 +0100 Message-Id: <20180309145717.9603-5-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180309145717.9603-1-laurent@vivier.eu> References: <20180309145717.9603-1-laurent@vivier.eu> X-Provags-ID: V03:K0:pDn3Koj32pB3ONSmGNXjPlP5zcgdFiVmbLKHWpS44wfnG845xv4 dpKDLJb/d5IRyw5joDjRil16TdqILuqU4YFj0D6ACwt7CsM/kO1NlsMDJTF5xii/Lu22XAO 31GDSVusDAwQMa2c7wRsnRWbICGTpd2ai+ELKMDPCJpzz0QmxlqgpajTWA8rFNhqrR1fbc/ Od7KmIJqP6qHZs7XGrFMQ== X-UI-Out-Filterresults: notjunk:1;V01:K0:U1uHwhsZcnw=:mJthLpK6FRixvnsenWf0rj uUwYDH/2mFehvG/EM3TIFjQxyaCDbLu0Ns71W9GswP0X8I3wUGzXRNRinWXaOxQEvZA5FhUCJ +OtEpY+iKVVBtHEdhOsN7Tdd8e+72Ovx6cXpNUtpYjK+HqPW3eFU7uRtKZIU0v/w5bXn4guRG KxoONsx9rzm/rMiy78Zt2ADXu0LS3yJkY9lZ0hJ3l+d2NOoflh12IoZ5UBcy3blxsPpF+3uP2 kzZDkhRWFiVaqriZ0BYTSt/qQEHtg3h2NV7cGGbyD85USoNBqgmTTrf0AaD0wYKSLRZcSG1/F tXt8uPIEiABmdrzHufWnL+xPZ/bTpGv8h3GG2IZo38FsHSWDs2CJV6wacjITAgS03Oet9F8B6 yjtZCn6z0ERjmx6UCo2oVs57CQnO/NZXk+DNgUikMA54iTWXMvVLdg+FiBJVoXDWuSGWSJu9i WhirT8rHnAA4NyeCVek8bY4psiI9KlkXy43vpg7j37dxLiM8vm9DMiERblbB6z1VdYGyuURNE 9TdRCw56T5n9m396wnwoZpCEDIPyjbF31FzLtF24MpZlnLEcyV3rrx2JRPbMKNqIwHoHxdzLG 88lIBfY8ujfW7gWQ30zntAlFe69cQXp62PmCuEBHP+eCxM3n74hZqSYvXyCfR5dAEOjxIVhQq L0JhrgaS9RRK59Noi5twGkBI+8swfZaEDblgWVFSdJ01MXMuvfSSdxRGHCQ/vjwQZ3tur30zX 5oPR55f60gbtfUHWfrVrdDF/8aH2Ert0zF038A== 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 v2 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 Fri May 17 09:18:56 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 1520607929112610.7080156109007; Fri, 9 Mar 2018 07:05:29 -0800 (PST) Received: from localhost ([::1]:45786 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euJaK-0000z4-Bh for importer@patchew.org; Fri, 09 Mar 2018 10:05:28 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38178) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euJSk-0003LE-SW for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:57:40 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1euJSh-0002zZ-QX for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:57:38 -0500 Received: from mout.kundenserver.de ([212.227.17.24]:45865) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1euJSh-0002yp-GJ for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:57:35 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue102 [212.227.15.183]) with ESMTPSA (Nemesis) id 0MPGtM-1eyjIz3JFw-004QFl; Fri, 09 Mar 2018 15:57:34 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Fri, 9 Mar 2018 15:57:14 +0100 Message-Id: <20180309145717.9603-6-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180309145717.9603-1-laurent@vivier.eu> References: <20180309145717.9603-1-laurent@vivier.eu> X-Provags-ID: V03:K0:SYTlJtSk9rjaGwYb6uLX7BQPqxaYbyOAX9oj8mJQ6p5XmvS+mmG 2L/nilm2fzqRSMgjqithhPEiXNlULZh2PvAonswNV5bIcgg2aB4ML6Bsj4VAhe1UW5ZBCbs BvSu3liuFps7QxNMXN7nzzqsQ/7nUjciu97nP5lEs4q39CLAE8fTXDJaSrzLWnTaxcb9jkN aA7tv78ET97iYtxl72ijg== X-UI-Out-Filterresults: notjunk:1;V01:K0:JkUdBFTjff0=:yUal/YIP16S5PCahRWvGmA MHhi2BEWMZwqboGESY5AW2eSEWH3Y4iWtgbYJPQ7CQafNPlipoWAp30H4kAACnhdNK6/SGZOs iebNPaCCRxKLvuhxU5k2t/PbTN1NMcAUfWBpIGwHm46UlIfJEDAqvvMfo7Qft+ELiTjRCaEoN J2rMoQ+5IoL7I/7qqYityY17j/qlsiUu/5kRALMTp2y0vMaFJ1cxPY/Uca9g1a8zCGeJsmYlk OKkZ4fRi7DeJLJcLwqKucVqRRd+5Y2dJXpfTZBDXDJHWDwAr3ek5bcTNDpH3xLG422LrfYSo5 oSNxWjMgSglut/uhzsBQTCPHx9rOXHQ1ewjxsx0a3oBfugIIBMjApu4/gpcRw38fw1ibvR8UT gInoRJWAdYZnzHhz1zyArzQZ0nksHBB0F7IwGDl+F8DdozStOBpj5xvQUkXJgJiY/uci+x+HO RGsBCKD8aKtXE7NPOQnseZneS9nzPQwU64vtKge/mxwB+M9BMhRyPiJ/x8Y2EfMcPGLNgaSZs kLnOziPYM+IUjEwBv8Kxm97yr5tFbL5wldIwc30yt23yqpmf1YqqgUvlHQUuznCDWHetje8xA fV4eJI0nQ3BwoYOBrUjCxPm/VXCFrxn7Ij9D62I70t8n2bbWDia8oVa33GAbBpWwdm11M0bi3 OmLafPEBRaMZ3CI369HbLhCp5LUE0Et57Cxgf6cbiaPtb8PtsQIKTkri+/nyVpbI2Fx9WWzLX whWkn3qt2shWHkVSUMdY1kUhGmXyyMSniCAEpg== X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 212.227.17.24 Subject: [Qemu-devel] [PULL v2 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 Fri May 17 09:18:56 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 1520607713747990.5127664890814; Fri, 9 Mar 2018 07:01:53 -0800 (PST) Received: from localhost ([::1]:45774 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euJWm-0006eU-Cp for importer@patchew.org; Fri, 09 Mar 2018 10:01:48 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38180) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euJSk-0003LH-U7 for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:57:41 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1euJSi-000306-Qn for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:57:39 -0500 Received: from mout.kundenserver.de ([217.72.192.74]:38927) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1euJSi-0002zM-DD for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:57:36 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue102 [212.227.15.183]) with ESMTPSA (Nemesis) id 0MXYso-1f87UO27Yk-00WZGJ; Fri, 09 Mar 2018 15:57:35 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Fri, 9 Mar 2018 15:57:15 +0100 Message-Id: <20180309145717.9603-7-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180309145717.9603-1-laurent@vivier.eu> References: <20180309145717.9603-1-laurent@vivier.eu> X-Provags-ID: V03:K0:Jy3Xs82X+h+MWKmXtwvdUiGIdvuymI9l2GgtDsJL8wdcuCpMxDG cN1kcukgCr3/wSzvUF1Gh5a3HfhtO++252zw0pBJI09pKIDmVQwimxmGI8HiLwiCAXk1KJv ZdGP6MQPTqH6wYZMVexgR+srB3WLkRWhXEfaN14wzCC6u85aKcgv8bEVILF3Xi1CsQTbP7I gCv31Z5Z6orR0qPEVIyhw== X-UI-Out-Filterresults: notjunk:1;V01:K0:TuYjBhDMHIM=:xvwY3KKyV7rSEv+qf3kTLk foCJ0LgmYAQAjpRXBrAZEHIIORxCUeatlSLyztpNPPpIVvG2px5R8WAtHRQObJoGkaqd6WO4B l7JwYmBVHKRL5OHeKfzG5WN3f5oxTx7fElXTrH9HufW2AAAApFKQ/gLrlA2u8n/MHeJB5bEkY v0EvRotSQOTH/lERVR/ZgEztoa+bkJm/oL/p2k9lUNvHGkG75M500ZIRe0b/Yvr9BwMTnC0Qk HhNz+G7h/LGLoRJTTK25X01g6OqxHKPqxtv0oLp5TFrQ0+ONl9/ltH/mRAq4+eS3XS5OMBfhI GV4+BpnXXAjRBos8UcVLfvw1ecKO4MZSaHPudFkDrBq03Kn74z1OXSriLNjCR66EndDs09c30 KoSjJiNdzOz05oikEbCXibi9SRFX9Y55orrbRTGmFtChTfjcpqHaYxnxTBaF6BDV+BY+L1Slw sWmv1LWr00QgzCNShFmYwjilJAW2wlTWQoNnr3TdlvJ3ZlExqoSxTmd2JAe2WFCR6W8UJ5SnX t++cmG7eLSzIpmrNoinhDQNPjLc41laaw9/bX7Rn7iKmvUA6jOVJ6jvRBaz9xdEpAtgr/weGZ Yl5CmdbD/So+3pO4kqrVev1o/EfGGWvWAfiRitjvwK66hYLPwrcpggyo3ip8Hg9ssP/2IbSHG npey1HClJXS69g1aPw03nDYSyhCeBurOBAKz1cQMalGnTmYn/0jyYqYEyVf0eOSZfR57xQzRT 882hX11zt09LXtOueQJJqSmGcQV7i0QwmgsiWQ== 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 v2 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 100644 --- 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 Fri May 17 09:18:56 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 1520608142718139.84542888451858; Fri, 9 Mar 2018 07:09:02 -0800 (PST) Received: from localhost ([::1]:45814 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euJdi-0003gT-J3 for importer@patchew.org; Fri, 09 Mar 2018 10:08:58 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38190) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euJSl-0003Lp-CU for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:57:41 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1euJSj-00030c-Ls for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:57:39 -0500 Received: from mout.kundenserver.de ([212.227.17.24]:54309) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1euJSj-0002zw-7l for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:57:37 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue102 [212.227.15.183]) with ESMTPSA (Nemesis) id 0McWQK-1fBypz1a2y-00HfoH; Fri, 09 Mar 2018 15:57:35 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Fri, 9 Mar 2018 15:57:16 +0100 Message-Id: <20180309145717.9603-8-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180309145717.9603-1-laurent@vivier.eu> References: <20180309145717.9603-1-laurent@vivier.eu> X-Provags-ID: V03:K0:e6LrD/6NT32pRsJ2Y2Q4fAUzCGECbWKaomfWpw/YL63JLn7lmtD JjcwrNy40z/f5DjE6M7my1zhlhJZ3QLnG0E2OwzBXc5kLykKnzORn+ZyvyyBNlZ5zrMsDQw u275BIW/TaPZKn2dmQYcVOiuLDHZI4598PLO8fJQxxcZ4u+fXaV5uWxFK5ux1x16hlhugUA VFO3C3oC/aO6v2dwvPxJw== X-UI-Out-Filterresults: notjunk:1;V01:K0:Fc1MymWYF/E=:T7mjfG3ExuFITLfVM4+qPP cCPbmPX24mK4LFJjBAF8hUme+5BwJm2jjSPBCnq//ftSmIHgBA3pCFqmWubOAwDX30049VIAI re0N96McvybBgE3FJ1OPDyonBl+gzDPy/o79Bmy0OnbdFcTBD9WV9HOYAUYj7AA7qWItcmM3W Tj50/Qp0a1dE/GYAbH3O3K0l2VRWyi7/uC6WE2S6JThIIiPjVjpAqjRGG1h2IMcq/3rgEQNoY Qp70xRo13clKt+dqSBJwdsSxtwI180hg9AHY5WcTi8TV2/XTI7tg7ZZzAZ7h5cT4IOsWYhopm eiHBBb3OVRHwPOt2p3vfTvz1SkXiUY9WnfBgH5ipFS/JSCnFSVMSAqDkclsmBySWwCAKLl25g gDTD7dcVECqrh6WCiQfJHXr7sftHfLKp23CkH6Z9I779R6ug0mDnyqYBP3jzk3riAmEW+H0EI uSaYsQG8QhY8VjO5ABJdeouOTGZ9GmAOdJXLm3HE8sWocee97+9cJoRjVu0AFc0mizHqpNVuB FawSmKLL/bzLXODJxiTe87j1cZiah6YZ6DSxt5ZG1Rqz1mVO6yfQaTdo3iXxu9MU/Kd6ZADBC q9TaxKxqi0dsQP6ESo8PQ+BkTsgFObl9rd+mgsKFS9pEmvGzoz3m3hpo3GDwN2xNcd9Dbbl84 y4w6TzQqXkpDVIpbseZqMJKRgP3Qf4qdLC8e2t2+WMZBg7791X7rjxRTkLe56QttCxAqyrLkc Yij2aEB7MqoqaHn8d3bmmkasLcYKqUMtzurneg== X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 212.227.17.24 Subject: [Qemu-devel] [PULL v2 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 100644 --- 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 Fri May 17 09:18:56 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 1520607563307625.3947890534336; Fri, 9 Mar 2018 06:59:23 -0800 (PST) Received: from localhost ([::1]:45749 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euJUQ-0004ap-Gw for importer@patchew.org; Fri, 09 Mar 2018 09:59:22 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:38194) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1euJSl-0003M8-La for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:57:41 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1euJSk-000311-BJ for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:57:39 -0500 Received: from mout.kundenserver.de ([217.72.192.74]:48443) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1euJSk-00030K-2U for qemu-devel@nongnu.org; Fri, 09 Mar 2018 09:57:38 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue102 [212.227.15.183]) with ESMTPSA (Nemesis) id 0MNKx7-1f1DM91VRR-006uI4; Fri, 09 Mar 2018 15:57:36 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Fri, 9 Mar 2018 15:57:17 +0100 Message-Id: <20180309145717.9603-9-laurent@vivier.eu> X-Mailer: git-send-email 2.14.3 In-Reply-To: <20180309145717.9603-1-laurent@vivier.eu> References: <20180309145717.9603-1-laurent@vivier.eu> X-Provags-ID: V03:K0:10qscgUpOYm3UuUbsMVPNj3gsDYDaw+hpLf2E5quFa15IbykTTE C0LX7jlkI1IYCAOymnjpbrq4BM3TQ1UIvB3N65o5em+69NZDPFPVZoYFd5oxstrF1tAyhbN Vdl0nS5xD4ZU2TgAvvxvvxb7+lmVlMIBTC8GPYdqc+iv9RjG/ummWEAlATrHSmILwi5mK0e K/U/UPPCTzu8xVf/+qRaQ== X-UI-Out-Filterresults: notjunk:1;V01:K0:UnHX1kppnZw=:R5rxKcA821mY1TjGT20SI+ ivaI1L5tvVlIKMAI7gl4D4ipdo2XGsIjsOuJXST9IHI7IuXxtO2B8oY35SG/g6y6CCcUrkziK WNpa+rk+1HKaBriclgiNEhS/UBAElAGIZDxSY2ziSFGcdXHGyya4zoOyTCQTVhBc91CXGVyEm gCaaFkZIDsDq8CpSAOpE3poD3CukI6CH+ha+0+FTlQe/vD7mbLW8EV1/UVLqMIibb5NElFkwt Pat9qmC+OcnhsSEc/6qPzi+1IcsTGpJbw4xcTYNdAtxOxAl8FwCk990gZwn9KF6Ndqxoi1Wmq 7M0x2tVrfhkzu/1CKk2qkdIDa/T783Rws8hJTghkca7jPAWb33mk+mTwcc1noCNCr0GcddI8a 2xNcxx6uno+GNNyix6Gv4M8x+xi0nwOhOTQNp2Ezk1Kzn7qx94x6NCdTyVq6hBwjvo8zUycFP LdUiv0CvejhKk1Db+j7mfNy70adUDO6qZImevabgUd6Jru5Cfo0xfbKZwT4jHPGIfKWcOAHTt CtBJqQRKpeqSUF0nNibTf+yYCSAj79/ZgwNtcK5bp35oYQZ8rMKPP2KHgRzAEb/O9LFyNUyFI GdHhVgU0H1/h7XChosD9q9jGizyoO1FOOggannclUfG3odZt/2ctKdumJkfdS6v3IA6kZG4Vr a0STcsTGGHUnpuaRaJtg5Yex6qyeAQXpKIMnrwmmvvI1qBGIMCGwx+Bpf+0W8OCEsyX8jJFQ6 e4OvTzEtkyHj8dlbugXik3RYJsBN9R2M6WHTUQ== 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 v2 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