From nobody Fri Oct 10 14:16:48 2025 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.zoho.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 1486430231650492.5853532360853; Mon, 6 Feb 2017 17:17:11 -0800 (PST) Received: from localhost ([::1]:51400 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cauP8-0000vg-Dx for importer@patchew.org; Mon, 06 Feb 2017 20:17:10 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:33141) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1cau9C-0005IY-3h for qemu-devel@nongnu.org; Mon, 06 Feb 2017 20:00:46 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1cau95-0006Ce-DE for qemu-devel@nongnu.org; Mon, 06 Feb 2017 20:00:40 -0500 Received: from mout.kundenserver.de ([212.227.126.130]:50986) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1cau95-0006C8-1x for qemu-devel@nongnu.org; Mon, 06 Feb 2017 20:00:35 -0500 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue004 [212.227.15.167]) with ESMTPSA (Nemesis) id 0MDl62-1celT13myE-00H7sr; Tue, 07 Feb 2017 01:59:42 +0100 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Tue, 7 Feb 2017 01:59:26 +0100 Message-Id: <20170207005930.28327-13-laurent@vivier.eu> X-Mailer: git-send-email 2.9.3 In-Reply-To: <20170207005930.28327-1-laurent@vivier.eu> References: <20170207005930.28327-1-laurent@vivier.eu> X-Provags-ID: V03:K0:xIC/yCv+VsyCaZsHg57OKbJONodNZCVUaRtXZW5aB++o4YN3hwq ajVNAyNowip4Q3CtafosBC8sBnjgcyW2cAZC7sRBBzk1zleroAK5CMXbnyGPuFQ0F54ZGWw mCdTYtsBY9Q9bspNFqEtjs8/LqMN1pcQyYz3Gj8siVEL2YtlzRh2BmJ+hdCMP9EfzcJiSxr jLLOE2e1DQDq+kOeveQ3Q== X-UI-Out-Filterresults: notjunk:1;V01:K0:7x5LWbGzzUo=:K4InEYsO8S7G0ZfTDTXuTV cQ8OPyOg4M3EaN3paLacIRJ+v6SrXqkhJv+c/dtRw/Cn2/cDF8w68dAsxhb3+AbZUTNAZjXwA kF/I/XYK0p0UIBC3PQFBu/7RG3HpGGrI9YoT9a94C8BOwamNYyZ6cF8Z2ms8Gjn6NLn1bRVpJ qVB+UVqBMqwAeZDI+pAGQW1rMdkXfDOJElF1SgQ+bYv2EfPfczGO8E+0yVPQwiUV5hUi7/0LG j5pU7BpAVmpP+drRAJ4mVS27/SpsINKhf9RiQheSpXuzh4GV/mB0+u+I93RjaMT1MrPS53XR1 cPoyZly/Wf679+SO27i7G45w/gyifT7qrlprlaauopVpZKRZz7yUV97wx3Wdbwa2unMQyzk46 A/xJhZuQvGFe1+kq9cDTlKnMJYOYsBVskyar7J0ZsLW7FMJk9PATUe5x9W4g19XEckZI2ETAr 7+94C8iyS6Vour6ZKhHxhxFW+yBrYWiX7Dr3i85YYbqLPSsNLTE7cyAGChZ3+qN2HwUsqIiPx H+8z57YbQ9JLCtK4JDt0RLkuLwJlZQ5Yuu9bXsRS/VMP2e1W5ICSPEGHw4q/vP5iX4vRRx5hv QpvNYq4VsWI00Bc8fK3daHbZ+7wAKdC5+Y9HGOQMs9cJprdE+7VCaKjJKcBqg7lk3HX7p5epB w1uVGKnuMa6qPP8oKtVqtT0g/1rzZoErv5+QehxdCcvBFQbxaodR3KSuUPUtzc5moDhU= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] X-Received-From: 212.227.126.130 Subject: [Qemu-devel] [PATCH v3 12/16] target-m68k: add fscale, fgetman, fgetexp and fmod 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 , Aurelien Jarno , Richard Henderson 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" Signed-off-by: Laurent Vivier --- target/m68k/cpu.h | 1 + target/m68k/fpu_helper.c | 56 ++++++++++++++++++++++++++++++++++++++++++++= ++++ target/m68k/helper.h | 4 ++++ target/m68k/translate.c | 14 ++++++++++++ 4 files changed, 75 insertions(+) diff --git a/target/m68k/cpu.h b/target/m68k/cpu.h index 7985dc3..3042ab7 100644 --- a/target/m68k/cpu.h +++ b/target/m68k/cpu.h @@ -253,6 +253,7 @@ typedef enum { /* Quotient */ =20 #define FPSR_QT_MASK 0x00ff0000 +#define FPSR_QT_SHIFT 16 =20 /* Floating-Point Control Register */ /* Rounding mode */ diff --git a/target/m68k/fpu_helper.c b/target/m68k/fpu_helper.c index d8145e0..42f5b5c 100644 --- a/target/m68k/fpu_helper.c +++ b/target/m68k/fpu_helper.c @@ -458,3 +458,59 @@ void HELPER(const_FP0)(CPUM68KState *env, uint32_t off= set) env->fp0l =3D fpu_rom[offset].low; env->fp0h =3D fpu_rom[offset].high; } + +void HELPER(getexp_FP0)(CPUM68KState *env) +{ + int32_t exp; + floatx80 res; + + res =3D FP0_to_floatx80(env); + if (floatx80_is_zero_or_denormal(res) || floatx80_is_any_nan(res) || + floatx80_is_infinity(res)) { + return; + } + exp =3D (env->fp0h & 0x7fff) - 0x3fff; + + res =3D int32_to_floatx80(exp, &env->fp_status); + + floatx80_to_FP0(env, res); +} + +void HELPER(getman_FP0)(CPUM68KState *env) +{ + floatx80 res; + res =3D int64_to_floatx80(env->fp0l, &env->fp_status); + floatx80_to_FP0(env, res); +} + +void HELPER(scale_FP0_FP1)(CPUM68KState *env) +{ + int32_t scale; + int32_t exp; + + scale =3D floatx80_to_int32(FP0_to_floatx80(env), &env->fp_status); + + exp =3D (env->fp1h & 0x7fff) + scale; + + env->fp0h =3D (env->fp1h & 0x8000) | (exp & 0x7fff); + env->fp0l =3D env->fp1l; +} + +static void make_quotient(CPUM68KState *env, floatx80 val) +{ + uint32_t quotient =3D floatx80_to_int32(val, &env->fp_status); + uint32_t sign =3D (quotient >> 24) & 0x80; + quotient =3D sign | (quotient & 0x7f); + env->fpsr =3D (env->fpsr & ~FPSR_QT_MASK) | (quotient << FPSR_QT_SHIFT= ); +} + +void HELPER(mod_FP0_FP1)(CPUM68KState *env) +{ + floatx80 res; + + res =3D floatx80_rem(FP1_to_floatx80(env), FP0_to_floatx80(env), + &env->fp_status); + make_quotient(env, res); + + floatx80_to_FP0(env, res); +} diff --git a/target/m68k/helper.h b/target/m68k/helper.h index 4927324..620e707 100644 --- a/target/m68k/helper.h +++ b/target/m68k/helper.h @@ -33,6 +33,10 @@ DEF_HELPER_1(tst_FP0, void, env) DEF_HELPER_1(update_fpstatus, void, env) DEF_HELPER_4(fmovem, void, env, i32, i32, i32) DEF_HELPER_2(const_FP0, void, env, i32) +DEF_HELPER_1(getexp_FP0, void, env) +DEF_HELPER_1(getman_FP0, void, env) +DEF_HELPER_1(scale_FP0_FP1, void, env) +DEF_HELPER_1(mod_FP0_FP1, void, env) =20 DEF_HELPER_3(mac_move, void, env, i32, i32) DEF_HELPER_3(macmulf, i64, env, i32, i32) diff --git a/target/m68k/translate.c b/target/m68k/translate.c index 23eac63..be18083 100644 --- a/target/m68k/translate.c +++ b/target/m68k/translate.c @@ -4629,10 +4629,20 @@ DISAS_INSN(fpu) case 0x1a: case 0x5a: case 0x5e: /* fneg */ gen_helper_chs_FP0(cpu_env); break; + case 0x1e: /* fgetexp */ + gen_helper_getexp_FP0(cpu_env); + break; + case 0x1f: /* fgetman */ + gen_helper_getman_FP0(cpu_env); + break; case 0x20: case 0x60: case 0x64: /* fdiv */ gen_op_load_fpr_FP1(REG(ext, 7)); gen_helper_div_FP0_FP1(cpu_env); break; + case 0x21: /* fmod */ + gen_op_load_fpr_FP1(REG(ext, 7)); + gen_helper_mod_FP0_FP1(cpu_env); + break; case 0x22: case 0x62: case 0x66: /* fadd */ gen_op_load_fpr_FP1(REG(ext, 7)); gen_helper_add_FP0_FP1(cpu_env); @@ -4641,6 +4651,10 @@ DISAS_INSN(fpu) gen_op_load_fpr_FP1(REG(ext, 7)); gen_helper_mul_FP0_FP1(cpu_env); break; + case 0x26: /* fscale */ + gen_op_load_fpr_FP1(REG(ext, 7)); + gen_helper_scale_FP0_FP1(cpu_env); + break; case 0x28: case 0x68: case 0x6c: /* fsub */ gen_op_load_fpr_FP1(REG(ext, 7)); gen_helper_sub_FP0_FP1(cpu_env); --=20 2.9.3