From nobody Sun May 5 19:04:26 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.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 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1569341977; cv=none; d=zoho.com; s=zohoarc; b=leLw5S3DkPJVL6a/SDqKx4GMaV/sUnO4jA3t2N71RVBMi5rQw2vJhksT45Oi6UULGdbpdlvSC5GBbcGoBBjmWDSWDLbAAmGw6ZiM61RHcQpbMtUPoJVpXET0gr/Q6eDIwwY6AZs2uxlv/Ti21HSc6VcC6TrFKLfc0Krwj0J4JsQ= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1569341977; h=Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=tVjVE99W2yrS5WjNKqNIhkUmnzmu9IK8EH96mM089KI=; b=l1aDzycnKNXEX/qy/SJznoKTEqV55OKtstwP2wxfM7kZ3GKlY6Y0yCtwD3fCr1tTFPQwQsLe8HmI9HFuclOaRda31oiQUTQnC1P0b91C5Y9qnWtTjaA3a4neWB+PQaQH3tyH/LuxEtqaatx+emQmsTJi7i+2TV1Hz1/6vijQtPU= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1569341977670987.1701533283446; Tue, 24 Sep 2019 09:19:37 -0700 (PDT) Received: from localhost ([::1]:47906 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iCnXF-0005ji-Vm for importer@patchew.org; Tue, 24 Sep 2019 12:19:30 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:51108) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iCmuL-0008BL-B4 for qemu-devel@nongnu.org; Tue, 24 Sep 2019 11:39:18 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iCmuJ-00069G-Rb for qemu-devel@nongnu.org; Tue, 24 Sep 2019 11:39:17 -0400 Received: from mail.ilande.co.uk ([46.43.2.167]:35694 helo=mail.default.ilande.uk0.bigv.io) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iCmuJ-0005cM-LX; Tue, 24 Sep 2019 11:39:15 -0400 Received: from host86-138-245-63.range86-138.btcentralplus.com ([86.138.245.63] helo=kentang.home) by mail.default.ilande.uk0.bigv.io with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.89) (envelope-from ) id 1iCmrT-0007WZ-MN; Tue, 24 Sep 2019 16:36:20 +0100 From: Mark Cave-Ayland To: qemu-devel@nongnu.org, qemu-ppc@nongnu.org, pc@us.ibm.com, david@gibson.dropbear.id.au Date: Tue, 24 Sep 2019 16:35:50 +0100 Message-Id: <20190924153556.27575-2-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190924153556.27575-1-mark.cave-ayland@ilande.co.uk> References: <20190924153556.27575-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 86.138.245.63 X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 1/7] target/ppc: introduce get_dfp{64,128}() helper functions X-SA-Exim-Version: 4.2.1 (built Tue, 02 Aug 2016 21:08:31 +0000) X-SA-Exim-Scanned: Yes (on mail.default.ilande.uk0.bigv.io) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 46.43.2.167 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" The existing functions (now incorrectly) assume that the MSB and LSB of DFP numbers are stored as consecutive 64-bit words in memory. Instead of access= ing the DFP numbers directly, introduce get_dfp{64,128}() helper functions to e= ase the switch to the correct representation. Signed-off-by: Mark Cave-Ayland --- target/ppc/dfp_helper.c | 52 ++++++++++++++++++++++++++++++----------- 1 file changed, 39 insertions(+), 13 deletions(-) diff --git a/target/ppc/dfp_helper.c b/target/ppc/dfp_helper.c index f102177572..354a4aa877 100644 --- a/target/ppc/dfp_helper.c +++ b/target/ppc/dfp_helper.c @@ -36,6 +36,17 @@ #define LO_IDX 0 #endif =20 +static void get_dfp64(uint64_t *dst, uint64_t *dfp) +{ + dst[0] =3D dfp[0]; +} + +static void get_dfp128(uint64_t *dst, uint64_t *dfp) +{ + dst[0] =3D dfp[HI_IDX]; + dst[1] =3D dfp[LO_IDX]; +} + struct PPC_DFP { CPUPPCState *env; uint64_t t64[2], a64[2], b64[2]; @@ -129,7 +140,7 @@ static void dfp_prepare_decimal64(struct PPC_DFP *dfp, = uint64_t *a, dfp->env =3D env; =20 if (a) { - dfp->a64[0] =3D *a; + get_dfp64(dfp->a64, a); decimal64ToNumber((decimal64 *)dfp->a64, &dfp->a); } else { dfp->a64[0] =3D 0; @@ -137,7 +148,7 @@ static void dfp_prepare_decimal64(struct PPC_DFP *dfp, = uint64_t *a, } =20 if (b) { - dfp->b64[0] =3D *b; + get_dfp64(dfp->b64, b); decimal64ToNumber((decimal64 *)dfp->b64, &dfp->b); } else { dfp->b64[0] =3D 0; @@ -153,8 +164,7 @@ static void dfp_prepare_decimal128(struct PPC_DFP *dfp,= uint64_t *a, dfp->env =3D env; =20 if (a) { - dfp->a64[0] =3D a[HI_IDX]; - dfp->a64[1] =3D a[LO_IDX]; + get_dfp128(dfp->a64, a); decimal128ToNumber((decimal128 *)dfp->a64, &dfp->a); } else { dfp->a64[0] =3D dfp->a64[1] =3D 0; @@ -162,8 +172,7 @@ static void dfp_prepare_decimal128(struct PPC_DFP *dfp,= uint64_t *a, } =20 if (b) { - dfp->b64[0] =3D b[HI_IDX]; - dfp->b64[1] =3D b[LO_IDX]; + get_dfp128(dfp->b64, b); decimal128ToNumber((decimal128 *)dfp->b64, &dfp->b); } else { dfp->b64[0] =3D dfp->b64[1] =3D 0; @@ -617,10 +626,12 @@ uint32_t helper_##op(CPUPPCState *env, uint64_t *a, u= int64_t *b) \ { \ struct PPC_DFP dfp; \ unsigned k; \ + uint64_t a64; \ \ dfp_prepare_decimal##size(&dfp, 0, b, env); \ \ - k =3D *a & 0x3F; = \ + get_dfp64(&a64, a); \ + k =3D a64 & 0x3F; = \ \ if (unlikely(decNumberIsSpecial(&dfp.b))) { \ dfp.crbf =3D 1; = \ @@ -817,11 +828,15 @@ void helper_##op(CPUPPCState *env, uint64_t *t, uint6= 4_t *a, \ uint64_t *b, uint32_t rmc) \ { \ struct PPC_DFP dfp; \ - int32_t ref_sig =3D *a & 0x3F; \ + uint64_t a64; \ + int32_t ref_sig; \ int32_t xmax =3D ((size) =3D=3D 64) ? 369 : 6111; = \ \ dfp_prepare_decimal##size(&dfp, 0, b, env); \ \ + get_dfp64(&a64, a); \ + ref_sig =3D a64 & 0x3f; \ + \ _dfp_reround(rmc, ref_sig, xmax, &dfp); \ decimal##size##FromNumber((decimal##size *)dfp.t64, &dfp.t, \ &dfp.context); \ @@ -881,7 +896,12 @@ DFP_HELPER_RINT(drintnq, RINTN_PPs, 128) void helper_dctdp(CPUPPCState *env, uint64_t *t, uint64_t *b) { struct PPC_DFP dfp; - uint32_t b_short =3D *b; + uint64_t b64; + uint32_t b_short; + + get_dfp64(&b64, b); + b_short =3D (uint32_t)b64; + dfp_prepare_decimal64(&dfp, 0, 0, env); decimal32ToNumber((decimal32 *)&b_short, &dfp.t); decimal64FromNumber((decimal64 *)t, &dfp.t, &dfp.context); @@ -891,8 +911,10 @@ void helper_dctdp(CPUPPCState *env, uint64_t *t, uint6= 4_t *b) void helper_dctqpq(CPUPPCState *env, uint64_t *t, uint64_t *b) { struct PPC_DFP dfp; + uint64_t b64; dfp_prepare_decimal128(&dfp, 0, 0, env); - decimal64ToNumber((decimal64 *)b, &dfp.t); + get_dfp64(&b64, b); + decimal64ToNumber((decimal64 *)&b64, &dfp.t); =20 dfp_check_for_VXSNAN_and_convert_to_QNaN(&dfp); dfp_set_FPRF_from_FRT(&dfp); @@ -940,8 +962,10 @@ void helper_drdpq(CPUPPCState *env, uint64_t *t, uint6= 4_t *b) void helper_##op(CPUPPCState *env, uint64_t *t, uint64_t *b) = \ { = \ struct PPC_DFP dfp; = \ + uint64_t b64; = \ dfp_prepare_decimal##size(&dfp, 0, b, env); = \ - decNumberFromInt64(&dfp.t, (int64_t)(*b)); = \ + get_dfp64(&b64, b); = \ + decNumberFromInt64(&dfp.t, (int64_t)b64); = \ decimal##size##FromNumber((decimal##size *)dfp.t64, &dfp.t, &dfp.conte= xt); \ CFFIX_PPs(&dfp); = \ = \ @@ -1183,10 +1207,12 @@ static void dfp_set_raw_exp_128(uint64_t *t, uint64= _t raw) void helper_##op(CPUPPCState *env, uint64_t *t, uint64_t *a, uint64_t *b) \ { \ struct PPC_DFP dfp; \ - uint64_t raw_qnan, raw_snan, raw_inf, max_exp; \ + uint64_t raw_qnan, raw_snan, raw_inf, max_exp, a64; \ int bias; \ - int64_t exp =3D *((int64_t *)a); = \ + int64_t exp; \ \ + get_dfp64(&a64, a); \ + exp =3D (int64_t)a64; = \ dfp_prepare_decimal##size(&dfp, 0, b, env); \ \ if ((size) =3D=3D 64) { = \ --=20 2.20.1 From nobody Sun May 5 19:04:26 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.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 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1569341179; cv=none; d=zoho.com; s=zohoarc; b=USfYi4ZKZXicU2hz844NGdjRE3fgIPayyaAnWBcHcxNYbCX0UYgr8DdgvNRMzXaiNTF1p2gvWzI06wGrMZ3y9Y3xynjJueqOkWZY4Vyw/R9cr+02dYZiew5BF7jjJLPXCOez0MGybaejweTHuEHftoVZBMNQzsNyB8F5WXtsy+4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1569341179; h=Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=ELBb6TjvJ6ae7e2Bth14ToGJnIcqHesRn3lmfeq4msc=; b=QyYReL7QXK3XiR6/bxDnTDEiHWzzkQri94KNDU/0xXG50FTAdoFINhr+iRZjgSUoVwtJjNLEF4uxPIRYAHcTq3r76RVMOr9/HnjHToTcJUrPWQ01JpBEwNBQ+FhpWW9VBP7KCwLDIYbc9YFlNbwhuZOeVD+lJ5gwbbjZoIP3koc= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 156934117919771.272854245757; Tue, 24 Sep 2019 09:06:19 -0700 (PDT) Received: from localhost ([::1]:47706 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iCnKR-0007xH-Jk for importer@patchew.org; Tue, 24 Sep 2019 12:06:15 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:51149) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iCmuO-0008FD-0B for qemu-devel@nongnu.org; Tue, 24 Sep 2019 11:39:23 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iCmuM-0006C5-BZ for qemu-devel@nongnu.org; Tue, 24 Sep 2019 11:39:19 -0400 Received: from mail.ilande.co.uk ([46.43.2.167]:35698 helo=mail.default.ilande.uk0.bigv.io) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iCmuM-0005dK-2L; Tue, 24 Sep 2019 11:39:18 -0400 Received: from host86-138-245-63.range86-138.btcentralplus.com ([86.138.245.63] helo=kentang.home) by mail.default.ilande.uk0.bigv.io with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.89) (envelope-from ) id 1iCmrU-0007WZ-V5; Tue, 24 Sep 2019 16:36:22 +0100 From: Mark Cave-Ayland To: qemu-devel@nongnu.org, qemu-ppc@nongnu.org, pc@us.ibm.com, david@gibson.dropbear.id.au Date: Tue, 24 Sep 2019 16:35:51 +0100 Message-Id: <20190924153556.27575-3-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190924153556.27575-1-mark.cave-ayland@ilande.co.uk> References: <20190924153556.27575-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 86.138.245.63 X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 2/7] target/ppc: introduce set_dfp{64,128}() helper functions X-SA-Exim-Version: 4.2.1 (built Tue, 02 Aug 2016 21:08:31 +0000) X-SA-Exim-Scanned: Yes (on mail.default.ilande.uk0.bigv.io) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 46.43.2.167 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" The existing functions (now incorrectly) assume that the MSB and LSB of DFP numbers are stored as consecutive 64-bit words in memory. Instead of access= ing the DFP numbers directly, introduce set_dfp{64,128}() helper functions to e= ase the switch to the correct representation. Signed-off-by: Mark Cave-Ayland --- target/ppc/dfp_helper.c | 90 ++++++++++++++++++++++------------------- 1 file changed, 48 insertions(+), 42 deletions(-) diff --git a/target/ppc/dfp_helper.c b/target/ppc/dfp_helper.c index 354a4aa877..cb98780d20 100644 --- a/target/ppc/dfp_helper.c +++ b/target/ppc/dfp_helper.c @@ -47,6 +47,17 @@ static void get_dfp128(uint64_t *dst, uint64_t *dfp) dst[1] =3D dfp[LO_IDX]; } =20 +static void set_dfp64(uint64_t *dfp, uint64_t *src) +{ + dfp[0] =3D src[0]; +} + +static void set_dfp128(uint64_t *dfp, uint64_t *src) +{ + dfp[0] =3D src[HI_IDX]; + dfp[1] =3D src[LO_IDX]; +} + struct PPC_DFP { CPUPPCState *env; uint64_t t64[2], a64[2], b64[2]; @@ -413,10 +424,9 @@ void helper_##op(CPUPPCState *env, uint64_t *t, uint64= _t *a, uint64_t *b) \ decimal##size##FromNumber((decimal##size *)dfp.t64, &dfp.t, &dfp.conte= xt); \ postprocs(&dfp); = \ if (size =3D=3D 64) { = \ - t[0] =3D dfp.t64[0]; = \ + set_dfp64(t, dfp.t64); = \ } else if (size =3D=3D 128) { = \ - t[0] =3D dfp.t64[HI_IDX]; = \ - t[1] =3D dfp.t64[LO_IDX]; = \ + set_dfp128(t, dfp.t64); = \ } = \ } =20 @@ -735,10 +745,9 @@ void helper_##op(CPUPPCState *env, uint64_t *t, uint64= _t *b, \ QUA_PPs(&dfp); \ \ if (size =3D=3D 64) { = \ - t[0] =3D dfp.t64[0]; \ + set_dfp64(t, dfp.t64); \ } else if (size =3D=3D 128) { = \ - t[0] =3D dfp.t64[HI_IDX]; \ - t[1] =3D dfp.t64[LO_IDX]; \ + set_dfp128(t, dfp.t64); \ } \ } =20 @@ -759,10 +768,9 @@ void helper_##op(CPUPPCState *env, uint64_t *t, uint64= _t *a, \ QUA_PPs(&dfp); \ \ if (size =3D=3D 64) { = \ - t[0] =3D dfp.t64[0]; \ + set_dfp64(t, dfp.t64); \ } else if (size =3D=3D 128) { = \ - t[0] =3D dfp.t64[HI_IDX]; \ - t[1] =3D dfp.t64[LO_IDX]; \ + set_dfp128(t, dfp.t64); \ } \ } =20 @@ -843,10 +851,9 @@ void helper_##op(CPUPPCState *env, uint64_t *t, uint64= _t *a, \ QUA_PPs(&dfp); \ \ if (size =3D=3D 64) { = \ - t[0] =3D dfp.t64[0]; \ + set_dfp64(t, dfp.t64); \ } else if (size =3D=3D 128) { = \ - t[0] =3D dfp.t64[HI_IDX]; \ - t[1] =3D dfp.t64[LO_IDX]; \ + set_dfp128(t, dfp.t64); \ } \ } =20 @@ -867,10 +874,9 @@ void helper_##op(CPUPPCState *env, uint64_t *t, uint64= _t *b, \ postprocs(&dfp); = \ = \ if (size =3D=3D 64) { = \ - t[0] =3D dfp.t64[0]; = \ + set_dfp64(t, dfp.t64); = \ } else if (size =3D=3D 128) { = \ - t[0] =3D dfp.t64[HI_IDX]; = \ - t[1] =3D dfp.t64[LO_IDX]; = \ + set_dfp128(t, dfp.t64); = \ } = \ } =20 @@ -904,7 +910,8 @@ void helper_dctdp(CPUPPCState *env, uint64_t *t, uint64= _t *b) =20 dfp_prepare_decimal64(&dfp, 0, 0, env); decimal32ToNumber((decimal32 *)&b_short, &dfp.t); - decimal64FromNumber((decimal64 *)t, &dfp.t, &dfp.context); + decimal64FromNumber((decimal64 *)&dfp.t64, &dfp.t, &dfp.context); + set_dfp64(t, dfp.t64); dfp_set_FPRF_from_FRT(&dfp); } =20 @@ -920,14 +927,14 @@ void helper_dctqpq(CPUPPCState *env, uint64_t *t, uin= t64_t *b) dfp_set_FPRF_from_FRT(&dfp); =20 decimal128FromNumber((decimal128 *)&dfp.t64, &dfp.t, &dfp.context); - t[0] =3D dfp.t64[HI_IDX]; - t[1] =3D dfp.t64[LO_IDX]; + set_dfp128(t, dfp.t64); } =20 void helper_drsp(CPUPPCState *env, uint64_t *t, uint64_t *b) { struct PPC_DFP dfp; uint32_t t_short =3D 0; + uint64_t t64; dfp_prepare_decimal64(&dfp, 0, b, env); decimal32FromNumber((decimal32 *)&t_short, &dfp.b, &dfp.context); decimal32ToNumber((decimal32 *)&t_short, &dfp.t); @@ -937,7 +944,8 @@ void helper_drsp(CPUPPCState *env, uint64_t *t, uint64_= t *b) dfp_check_for_UX(&dfp); dfp_check_for_XX(&dfp); =20 - *t =3D t_short; + t64 =3D (uint64_t)t_short; + set_dfp64(t, &t64); } =20 void helper_drdpq(CPUPPCState *env, uint64_t *t, uint64_t *b) @@ -953,9 +961,9 @@ void helper_drdpq(CPUPPCState *env, uint64_t *t, uint64= _t *b) dfp_check_for_UX(&dfp); dfp_check_for_XX(&dfp); =20 + dfp.t64[0] =3D dfp.t64[1] =3D 0; decimal64FromNumber((decimal64 *)dfp.t64, &dfp.t, &dfp.context); - t[0] =3D dfp.t64[0]; - t[1] =3D 0; + set_dfp128(t, dfp.t64); } =20 #define DFP_HELPER_CFFIX(op, size) = \ @@ -970,10 +978,9 @@ void helper_##op(CPUPPCState *env, uint64_t *t, uint64= _t *b) \ CFFIX_PPs(&dfp); = \ = \ if (size =3D=3D 64) { = \ - t[0] =3D dfp.t64[0]; = \ + set_dfp64(t, dfp.t64); = \ } else if (size =3D=3D 128) { = \ - t[0] =3D dfp.t64[HI_IDX]; = \ - t[1] =3D dfp.t64[LO_IDX]; = \ + set_dfp128(t, dfp.t64); = \ } = \ } =20 @@ -1016,7 +1023,7 @@ void helper_##op(CPUPPCState *env, uint64_t *t, uint6= 4_t *b) \ } = \ } = \ = \ - *t =3D dfp.t64[0]; = \ + set_dfp64(t, dfp.t64); = \ } =20 DFP_HELPER_CTFIX(dctfix, 64) @@ -1078,10 +1085,9 @@ void helper_##op(CPUPPCState *env, uint64_t *t, uint= 64_t *b, uint32_t sp) \ } \ \ if (size =3D=3D 64) { = \ - t[0] =3D dfp.t64[0]; = \ + set_dfp64(t, dfp.t64); \ } else if (size =3D=3D 128) { = \ - t[0] =3D dfp.t64[HI_IDX]; = \ - t[1] =3D dfp.t64[LO_IDX]; = \ + set_dfp128(t, dfp.t64); \ } \ } =20 @@ -1150,10 +1156,9 @@ void helper_##op(CPUPPCState *env, uint64_t *t, uint= 64_t *b, uint32_t s) \ &dfp.context); = \ dfp_set_FPRF_from_FRT(&dfp); = \ if ((size) =3D=3D 64) { = \ - t[0] =3D dfp.t64[0]; = \ + set_dfp64(t, dfp.t64); = \ } else if ((size) =3D=3D 128) { = \ - t[0] =3D dfp.t64[HI_IDX]; = \ - t[1] =3D dfp.t64[LO_IDX]; = \ + set_dfp128(t, dfp.t64); = \ } = \ } =20 @@ -1164,27 +1169,30 @@ DFP_HELPER_ENBCD(denbcdq, 128) void helper_##op(CPUPPCState *env, uint64_t *t, uint64_t *b) \ { \ struct PPC_DFP dfp; \ + uint64_t t64; \ \ dfp_prepare_decimal##size(&dfp, 0, b, env); \ \ if (unlikely(decNumberIsSpecial(&dfp.b))) { \ if (decNumberIsInfinite(&dfp.b)) { \ - *t =3D -1; \ + t64 =3D -1; \ } else if (decNumberIsSNaN(&dfp.b)) { \ - *t =3D -3; \ + t64 =3D -3; \ } else if (decNumberIsQNaN(&dfp.b)) { \ - *t =3D -2; \ + t64 =3D -2; \ } else { \ assert(0); \ } \ + set_dfp64(t, &t64); \ } else { \ if ((size) =3D=3D 64) { \ - *t =3D dfp.b.exponent + 398; \ + t64 =3D dfp.b.exponent + 398; \ } else if ((size) =3D=3D 128) { \ - *t =3D dfp.b.exponent + 6176; \ + t64 =3D dfp.b.exponent + 6176; \ } else { \ assert(0); \ } \ + set_dfp64(t, &t64); \ } \ } =20 @@ -1251,10 +1259,9 @@ void helper_##op(CPUPPCState *env, uint64_t *t, uint= 64_t *a, uint64_t *b) \ &dfp.context); \ } \ if (size =3D=3D 64) { = \ - t[0] =3D dfp.t64[0]; = \ + set_dfp64(t, dfp.t64); \ } else if (size =3D=3D 128) { = \ - t[0] =3D dfp.t64[HI_IDX]; = \ - t[1] =3D dfp.t64[LO_IDX]; = \ + set_dfp128(t, dfp.t64); \ } \ } =20 @@ -1344,10 +1351,9 @@ void helper_##op(CPUPPCState *env, uint64_t *t, uint= 64_t *a, \ } \ \ if ((size) =3D=3D 64) { \ - t[0] =3D dfp.t64[0]; \ + set_dfp64(t, dfp.t64); \ } else { \ - t[0] =3D dfp.t64[HI_IDX]; \ - t[1] =3D dfp.t64[LO_IDX]; \ + set_dfp128(t, dfp.t64); \ } \ } =20 --=20 2.20.1 From nobody Sun May 5 19:04:26 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.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 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1569342451; cv=none; d=zoho.com; s=zohoarc; b=iV5s3tHifgisYS1Nl+wTRgsu5QS2TmdS2V38Iis+6Uex3MOOMditYbn2TZeFdcrNtOWZKdEVjxItJEPbK8Z0trGqrZy6sF0f7lR3vJ/Xgeyu/PqyT1UhCmBgiaYQZnHqHGW+NMAl8jgz7pnp2AZHa1+5l4Nocnq740JCVl3ekt8= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1569342451; h=Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=GAd0sj3/tl4h4z2vSM7qWV+su6EStLjC0ZgaCURKJnA=; b=oZBXMsJc3KJI5NgPkJt6OjvbeUt0Ah0JnZCRosK3w9l0XbtR2x9TnjmZt+ejkJkWPIdTrQVmmw6Oa/RyOpbtQcEQZr37nZ93mx2ChzV5F23Qmwc1u12R83rBu3xzJWp9x3Ht5GfuF65Y9liKW/VEeMuShKlEDqhpRVtPCcEEsZw= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1569342451991356.6707163430507; Tue, 24 Sep 2019 09:27:31 -0700 (PDT) Received: from localhost ([::1]:48016 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iCnf0-0006yL-41 for importer@patchew.org; Tue, 24 Sep 2019 12:27:30 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:51174) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iCmuR-0008Fp-Or for qemu-devel@nongnu.org; Tue, 24 Sep 2019 11:39:26 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iCmuN-0006CW-5g for qemu-devel@nongnu.org; Tue, 24 Sep 2019 11:39:23 -0400 Received: from mail.ilande.co.uk ([46.43.2.167]:35702 helo=mail.default.ilande.uk0.bigv.io) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iCmuM-0005e9-Tp; Tue, 24 Sep 2019 11:39:19 -0400 Received: from host86-138-245-63.range86-138.btcentralplus.com ([86.138.245.63] helo=kentang.home) by mail.default.ilande.uk0.bigv.io with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.89) (envelope-from ) id 1iCmrW-0007WZ-KY; Tue, 24 Sep 2019 16:36:24 +0100 From: Mark Cave-Ayland To: qemu-devel@nongnu.org, qemu-ppc@nongnu.org, pc@us.ibm.com, david@gibson.dropbear.id.au Date: Tue, 24 Sep 2019 16:35:52 +0100 Message-Id: <20190924153556.27575-4-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190924153556.27575-1-mark.cave-ayland@ilande.co.uk> References: <20190924153556.27575-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 86.138.245.63 X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 3/7] target/ppc: update {get, set}_dfp{64, 128}() helper functions to read/write DFP numbers correctly X-SA-Exim-Version: 4.2.1 (built Tue, 02 Aug 2016 21:08:31 +0000) X-SA-Exim-Scanned: Yes (on mail.default.ilande.uk0.bigv.io) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 46.43.2.167 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Since commit ef96e3ae96 "target/ppc: move FP and VMX registers into aligned= vsr register array" FP registers are no longer stored consecutively in memory a= nd so the current method of combining FP register pairs into DFP numbers is incor= rect. Firstly update the definition of the dh_*_fprp defines in helper.h to refle= ct that FP registers are now stored as part of an array of ppc_vsr_t elements rather than plain uint64_t elements, and then introduce a new ppc_fprp_t ty= pe which conceptually represents a DFP even-odd register pair to be consumed b= y the DFP helper functions. Finally update the new DFP {get,set}_dfp{64,128}() helper functions to conv= ert between DFP numbers and DFP even-odd register pairs correctly, making use o= f the existing VsrD() macro to access the correct elements regardless of host end= ian. Fixes: ef96e3ae96 "target/ppc: move FP and VMX registers into aligned vsr r= egister array" Signed-off-by: Mark Cave-Ayland Reviewed-by: Richard Henderson --- target/ppc/cpu.h | 1 + target/ppc/dfp_helper.c | 80 +++++++++++++++++++++-------------------- target/ppc/helper.h | 2 +- 3 files changed, 44 insertions(+), 39 deletions(-) diff --git a/target/ppc/cpu.h b/target/ppc/cpu.h index eaee1a5575..b79bbc171f 100644 --- a/target/ppc/cpu.h +++ b/target/ppc/cpu.h @@ -235,6 +235,7 @@ typedef union _ppc_vsr_t { } ppc_vsr_t; =20 typedef ppc_vsr_t ppc_avr_t; +typedef ppc_vsr_t ppc_fprp_t; =20 #if !defined(CONFIG_USER_ONLY) /* Software TLB cache */ diff --git a/target/ppc/dfp_helper.c b/target/ppc/dfp_helper.c index cb98780d20..df9026ea5e 100644 --- a/target/ppc/dfp_helper.c +++ b/target/ppc/dfp_helper.c @@ -36,26 +36,26 @@ #define LO_IDX 0 #endif =20 -static void get_dfp64(uint64_t *dst, uint64_t *dfp) +static void get_dfp64(uint64_t *dst, ppc_fprp_t *dfp) { - dst[0] =3D dfp[0]; + dst[0] =3D dfp->VsrD(0); } =20 -static void get_dfp128(uint64_t *dst, uint64_t *dfp) +static void get_dfp128(uint64_t *dst, ppc_fprp_t *dfp) { - dst[0] =3D dfp[HI_IDX]; - dst[1] =3D dfp[LO_IDX]; + dst[HI_IDX] =3D dfp[0].VsrD(0); + dst[LO_IDX] =3D dfp[1].VsrD(0); } =20 -static void set_dfp64(uint64_t *dfp, uint64_t *src) +static void set_dfp64(ppc_fprp_t *dfp, uint64_t *src) { - dfp[0] =3D src[0]; + dfp->VsrD(0) =3D src[0]; } =20 -static void set_dfp128(uint64_t *dfp, uint64_t *src) +static void set_dfp128(ppc_fprp_t *dfp, uint64_t *src) { - dfp[0] =3D src[HI_IDX]; - dfp[1] =3D src[LO_IDX]; + dfp[0].VsrD(0) =3D src[HI_IDX]; + dfp[1].VsrD(0) =3D src[LO_IDX]; } =20 struct PPC_DFP { @@ -143,8 +143,8 @@ static void dfp_set_round_mode_from_immediate(uint8_t r= , uint8_t rmc, decContextSetRounding(&dfp->context, rnd); } =20 -static void dfp_prepare_decimal64(struct PPC_DFP *dfp, uint64_t *a, - uint64_t *b, CPUPPCState *env) +static void dfp_prepare_decimal64(struct PPC_DFP *dfp, ppc_fprp_t *a, + ppc_fprp_t *b, CPUPPCState *env) { decContextDefault(&dfp->context, DEC_INIT_DECIMAL64); dfp_prepare_rounding_mode(&dfp->context, env->fpscr); @@ -167,8 +167,8 @@ static void dfp_prepare_decimal64(struct PPC_DFP *dfp, = uint64_t *a, } } =20 -static void dfp_prepare_decimal128(struct PPC_DFP *dfp, uint64_t *a, - uint64_t *b, CPUPPCState *env) +static void dfp_prepare_decimal128(struct PPC_DFP *dfp, ppc_fprp_t *a, + ppc_fprp_t *b, CPUPPCState *env) { decContextDefault(&dfp->context, DEC_INIT_DECIMAL128); dfp_prepare_rounding_mode(&dfp->context, env->fpscr); @@ -416,7 +416,8 @@ static inline int dfp_get_digit(decNumber *dn, int n) } =20 #define DFP_HELPER_TAB(op, dnop, postprocs, size) = \ -void helper_##op(CPUPPCState *env, uint64_t *t, uint64_t *a, uint64_t *b) = \ +void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_fprp_t *a, = \ + ppc_fprp_t *b) = \ { = \ struct PPC_DFP dfp; = \ dfp_prepare_decimal##size(&dfp, a, b, env); = \ @@ -485,7 +486,7 @@ DFP_HELPER_TAB(ddiv, decNumberDivide, DIV_PPs, 64) DFP_HELPER_TAB(ddivq, decNumberDivide, DIV_PPs, 128) =20 #define DFP_HELPER_BF_AB(op, dnop, postprocs, size) = \ -uint32_t helper_##op(CPUPPCState *env, uint64_t *a, uint64_t *b) = \ +uint32_t helper_##op(CPUPPCState *env, ppc_fprp_t *a, ppc_fprp_t *b) = \ { = \ struct PPC_DFP dfp; = \ dfp_prepare_decimal##size(&dfp, a, b, env); = \ @@ -517,7 +518,7 @@ DFP_HELPER_BF_AB(dcmpo, decNumberCompare, CMPO_PPs, 64) DFP_HELPER_BF_AB(dcmpoq, decNumberCompare, CMPO_PPs, 128) =20 #define DFP_HELPER_TSTDC(op, size) \ -uint32_t helper_##op(CPUPPCState *env, uint64_t *a, uint32_t dcm) \ +uint32_t helper_##op(CPUPPCState *env, ppc_fprp_t *a, uint32_t dcm) \ { \ struct PPC_DFP dfp; \ int match =3D 0; = \ @@ -545,7 +546,7 @@ DFP_HELPER_TSTDC(dtstdc, 64) DFP_HELPER_TSTDC(dtstdcq, 128) =20 #define DFP_HELPER_TSTDG(op, size) \ -uint32_t helper_##op(CPUPPCState *env, uint64_t *a, uint32_t dcm) \ +uint32_t helper_##op(CPUPPCState *env, ppc_fprp_t *a, uint32_t dcm) \ { \ struct PPC_DFP dfp; \ int minexp, maxexp, nzero_digits, nzero_idx, is_negative, is_zero, \ @@ -600,7 +601,7 @@ DFP_HELPER_TSTDG(dtstdg, 64) DFP_HELPER_TSTDG(dtstdgq, 128) =20 #define DFP_HELPER_TSTEX(op, size) \ -uint32_t helper_##op(CPUPPCState *env, uint64_t *a, uint64_t *b) \ +uint32_t helper_##op(CPUPPCState *env, ppc_fprp_t *a, ppc_fprp_t *b) \ { \ struct PPC_DFP dfp; \ int expa, expb, a_is_special, b_is_special; \ @@ -632,7 +633,7 @@ DFP_HELPER_TSTEX(dtstex, 64) DFP_HELPER_TSTEX(dtstexq, 128) =20 #define DFP_HELPER_TSTSF(op, size) \ -uint32_t helper_##op(CPUPPCState *env, uint64_t *a, uint64_t *b) \ +uint32_t helper_##op(CPUPPCState *env, ppc_fprp_t *a, ppc_fprp_t *b) \ { \ struct PPC_DFP dfp; \ unsigned k; \ @@ -669,7 +670,7 @@ DFP_HELPER_TSTSF(dtstsf, 64) DFP_HELPER_TSTSF(dtstsfq, 128) =20 #define DFP_HELPER_TSTSFI(op, size) \ -uint32_t helper_##op(CPUPPCState *env, uint32_t a, uint64_t *b) \ +uint32_t helper_##op(CPUPPCState *env, uint32_t a, ppc_fprp_t *b) \ { \ struct PPC_DFP dfp; \ unsigned uim; \ @@ -729,7 +730,7 @@ static void dfp_quantize(uint8_t rmc, struct PPC_DFP *d= fp) } =20 #define DFP_HELPER_QUAI(op, size) \ -void helper_##op(CPUPPCState *env, uint64_t *t, uint64_t *b, \ +void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_fprp_t *b, \ uint32_t te, uint32_t rmc) \ { \ struct PPC_DFP dfp; \ @@ -755,8 +756,8 @@ DFP_HELPER_QUAI(dquai, 64) DFP_HELPER_QUAI(dquaiq, 128) =20 #define DFP_HELPER_QUA(op, size) \ -void helper_##op(CPUPPCState *env, uint64_t *t, uint64_t *a, \ - uint64_t *b, uint32_t rmc) \ +void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_fprp_t *a, \ + ppc_fprp_t *b, uint32_t rmc) \ { \ struct PPC_DFP dfp; \ \ @@ -832,8 +833,8 @@ static void _dfp_reround(uint8_t rmc, int32_t ref_sig, = int32_t xmax, } =20 #define DFP_HELPER_RRND(op, size) \ -void helper_##op(CPUPPCState *env, uint64_t *t, uint64_t *a, \ - uint64_t *b, uint32_t rmc) \ +void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_fprp_t *a, \ + ppc_fprp_t *b, uint32_t rmc) \ { \ struct PPC_DFP dfp; \ uint64_t a64; \ @@ -861,7 +862,7 @@ DFP_HELPER_RRND(drrnd, 64) DFP_HELPER_RRND(drrndq, 128) =20 #define DFP_HELPER_RINT(op, postprocs, size) = \ -void helper_##op(CPUPPCState *env, uint64_t *t, uint64_t *b, = \ +void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_fprp_t *b, = \ uint32_t r, uint32_t rmc) = \ { = \ struct PPC_DFP dfp; = \ @@ -899,7 +900,7 @@ static void RINTN_PPs(struct PPC_DFP *dfp) DFP_HELPER_RINT(drintn, RINTN_PPs, 64) DFP_HELPER_RINT(drintnq, RINTN_PPs, 128) =20 -void helper_dctdp(CPUPPCState *env, uint64_t *t, uint64_t *b) +void helper_dctdp(CPUPPCState *env, ppc_fprp_t *t, ppc_fprp_t *b) { struct PPC_DFP dfp; uint64_t b64; @@ -915,7 +916,7 @@ void helper_dctdp(CPUPPCState *env, uint64_t *t, uint64= _t *b) dfp_set_FPRF_from_FRT(&dfp); } =20 -void helper_dctqpq(CPUPPCState *env, uint64_t *t, uint64_t *b) +void helper_dctqpq(CPUPPCState *env, ppc_fprp_t *t, ppc_fprp_t *b) { struct PPC_DFP dfp; uint64_t b64; @@ -930,7 +931,7 @@ void helper_dctqpq(CPUPPCState *env, uint64_t *t, uint6= 4_t *b) set_dfp128(t, dfp.t64); } =20 -void helper_drsp(CPUPPCState *env, uint64_t *t, uint64_t *b) +void helper_drsp(CPUPPCState *env, ppc_fprp_t *t, ppc_fprp_t *b) { struct PPC_DFP dfp; uint32_t t_short =3D 0; @@ -948,7 +949,7 @@ void helper_drsp(CPUPPCState *env, uint64_t *t, uint64_= t *b) set_dfp64(t, &t64); } =20 -void helper_drdpq(CPUPPCState *env, uint64_t *t, uint64_t *b) +void helper_drdpq(CPUPPCState *env, ppc_fprp_t *t, ppc_fprp_t *b) { struct PPC_DFP dfp; dfp_prepare_decimal128(&dfp, 0, b, env); @@ -967,7 +968,7 @@ void helper_drdpq(CPUPPCState *env, uint64_t *t, uint64= _t *b) } =20 #define DFP_HELPER_CFFIX(op, size) = \ -void helper_##op(CPUPPCState *env, uint64_t *t, uint64_t *b) = \ +void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_fprp_t *b) = \ { = \ struct PPC_DFP dfp; = \ uint64_t b64; = \ @@ -994,7 +995,7 @@ DFP_HELPER_CFFIX(dcffix, 64) DFP_HELPER_CFFIX(dcffixq, 128) =20 #define DFP_HELPER_CTFIX(op, size) = \ -void helper_##op(CPUPPCState *env, uint64_t *t, uint64_t *b) = \ +void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_fprp_t *b) = \ { = \ struct PPC_DFP dfp; = \ dfp_prepare_decimal##size(&dfp, 0, b, env); = \ @@ -1057,7 +1058,8 @@ static inline void dfp_set_sign_128(uint64_t *t, uint= 8_t sgn) } =20 #define DFP_HELPER_DEDPD(op, size) \ -void helper_##op(CPUPPCState *env, uint64_t *t, uint64_t *b, uint32_t sp) \ +void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_fprp_t *b, \ + uint32_t sp) \ { \ struct PPC_DFP dfp; \ uint8_t digits[34]; \ @@ -1105,7 +1107,8 @@ static inline uint8_t dfp_get_bcd_digit_128(uint64_t = *t, unsigned n) } =20 #define DFP_HELPER_ENBCD(op, size) = \ -void helper_##op(CPUPPCState *env, uint64_t *t, uint64_t *b, uint32_t s) = \ +void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_fprp_t *b, = \ + uint32_t s) = \ { = \ struct PPC_DFP dfp; = \ uint8_t digits[32]; = \ @@ -1166,7 +1169,7 @@ DFP_HELPER_ENBCD(denbcd, 64) DFP_HELPER_ENBCD(denbcdq, 128) =20 #define DFP_HELPER_XEX(op, size) \ -void helper_##op(CPUPPCState *env, uint64_t *t, uint64_t *b) \ +void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_fprp_t *b) \ { \ struct PPC_DFP dfp; \ uint64_t t64; \ @@ -1212,7 +1215,8 @@ static void dfp_set_raw_exp_128(uint64_t *t, uint64_t= raw) } =20 #define DFP_HELPER_IEX(op, size) \ -void helper_##op(CPUPPCState *env, uint64_t *t, uint64_t *a, uint64_t *b) \ +void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_fprp_t *a, \ + ppc_fprp_t *b) \ { \ struct PPC_DFP dfp; \ uint64_t raw_qnan, raw_snan, raw_inf, max_exp, a64; \ @@ -1309,7 +1313,7 @@ static void dfp_clear_lmd_from_g5msb(uint64_t *t) } =20 #define DFP_HELPER_SHIFT(op, size, shift_left) \ -void helper_##op(CPUPPCState *env, uint64_t *t, uint64_t *a, \ +void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_fprp_t *a, \ uint32_t sh) \ { \ struct PPC_DFP dfp; \ diff --git a/target/ppc/helper.h b/target/ppc/helper.h index 54ea9b9500..f843814b8a 100644 --- a/target/ppc/helper.h +++ b/target/ppc/helper.h @@ -686,7 +686,7 @@ DEF_HELPER_3(store_601_batu, void, env, i32, tl) #endif =20 #define dh_alias_fprp ptr -#define dh_ctype_fprp uint64_t * +#define dh_ctype_fprp ppc_fprp_t * #define dh_is_signed_fprp dh_is_signed_ptr =20 DEF_HELPER_4(dadd, void, env, fprp, fprp, fprp) --=20 2.20.1 From nobody Sun May 5 19:04:26 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.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 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1569341402; cv=none; d=zoho.com; s=zohoarc; b=luXEobK9q6PoNLtWaoRiTTVQb27DSJNyWj0+b95GgS9VTi+ad5hvSiIc61nWEwYSkV0URgoGedtgH5YM4W+6nOeunBD/Q8RdhPh1ec5wSrvfSTE04H7bgeN0sqC510vOqTdksfOzRRG1h8AZPtX+jiPdP2+fDhCNuwrvVIqQdeU= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1569341402; h=Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=zZj6KWZOJUoXcFQrFRcgGTLheLd7A7KZ55P58osTw2o=; b=FZN36t2alxIO1unqI54rqm7FY8FxJKqiAzfhpBful44kd1pqCMpAySNZ9Mhzuoz9bIjAKTvuZzzSZdhSK54Eevklg/9TEnSsB8BqOluI7nd2Bngys+VX4OzuXiqcuFhfSz9b/5HyH5yny+b9OIPj4Z0PVbn7yNVlZ/FP6uW1xqU= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 15693414024021007.7579544189331; Tue, 24 Sep 2019 09:10:02 -0700 (PDT) Received: from localhost ([::1]:47754 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iCnO4-0003XB-UW for importer@patchew.org; Tue, 24 Sep 2019 12:10:00 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:51191) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iCmuT-0008H6-RX for qemu-devel@nongnu.org; Tue, 24 Sep 2019 11:39:27 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iCmuR-0006FC-NU for qemu-devel@nongnu.org; Tue, 24 Sep 2019 11:39:25 -0400 Received: from mail.ilande.co.uk ([46.43.2.167]:35706 helo=mail.default.ilande.uk0.bigv.io) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iCmuP-0005f5-Mq; Tue, 24 Sep 2019 11:39:22 -0400 Received: from host86-138-245-63.range86-138.btcentralplus.com ([86.138.245.63] helo=kentang.home) by mail.default.ilande.uk0.bigv.io with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.89) (envelope-from ) id 1iCmrY-0007WZ-LP; Tue, 24 Sep 2019 16:36:25 +0100 From: Mark Cave-Ayland To: qemu-devel@nongnu.org, qemu-ppc@nongnu.org, pc@us.ibm.com, david@gibson.dropbear.id.au Date: Tue, 24 Sep 2019 16:35:53 +0100 Message-Id: <20190924153556.27575-5-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190924153556.27575-1-mark.cave-ayland@ilande.co.uk> References: <20190924153556.27575-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 86.138.245.63 X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 4/7] target/ppc: introduce dfp_finalize_decimal{64, 128}() helper functions X-SA-Exim-Version: 4.2.1 (built Tue, 02 Aug 2016 21:08:31 +0000) X-SA-Exim-Scanned: Yes (on mail.default.ilande.uk0.bigv.io) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 46.43.2.167 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Most of the DFP helper functions call decimal{64,128}FromNumber() just befo= re returning in order to convert the decNumber stored in dfp.t64 back to a Decimal{64,128} to write back to the FP registers. Introduce new dfp_finalize_decimal{64,128}() helper functions which both en= able the parameter list to be reduced considerably, and also help minimise the changes required in the next patch. Signed-off-by: Mark Cave-Ayland Reviewed-by: Richard Henderson --- target/ppc/dfp_helper.c | 42 ++++++++++++++++++++++------------------- 1 file changed, 23 insertions(+), 19 deletions(-) diff --git a/target/ppc/dfp_helper.c b/target/ppc/dfp_helper.c index df9026ea5e..52b123b16a 100644 --- a/target/ppc/dfp_helper.c +++ b/target/ppc/dfp_helper.c @@ -191,6 +191,16 @@ static void dfp_prepare_decimal128(struct PPC_DFP *dfp= , ppc_fprp_t *a, } } =20 +static void dfp_finalize_decimal64(struct PPC_DFP *dfp) +{ + decimal64FromNumber((decimal64 *)&dfp->t64, &dfp->t, &dfp->context); +} + +static void dfp_finalize_decimal128(struct PPC_DFP *dfp) +{ + decimal128FromNumber((decimal128 *)&dfp->t64, &dfp->t, &dfp->context); +} + static void dfp_set_FPSCR_flag(struct PPC_DFP *dfp, uint64_t flag, uint64_t enabled) { @@ -422,7 +432,7 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_f= prp_t *a, \ struct PPC_DFP dfp; = \ dfp_prepare_decimal##size(&dfp, a, b, env); = \ dnop(&dfp.t, &dfp.a, &dfp.b, &dfp.context); = \ - decimal##size##FromNumber((decimal##size *)dfp.t64, &dfp.t, &dfp.conte= xt); \ + dfp_finalize_decimal##size(&dfp); = \ postprocs(&dfp); = \ if (size =3D=3D 64) { = \ set_dfp64(t, dfp.t64); = \ @@ -491,7 +501,7 @@ uint32_t helper_##op(CPUPPCState *env, ppc_fprp_t *a, p= pc_fprp_t *b) \ struct PPC_DFP dfp; = \ dfp_prepare_decimal##size(&dfp, a, b, env); = \ dnop(&dfp.t, &dfp.a, &dfp.b, &dfp.context); = \ - decimal##size##FromNumber((decimal##size *)dfp.t64, &dfp.t, &dfp.conte= xt); \ + dfp_finalize_decimal##size(&dfp); = \ postprocs(&dfp); = \ return dfp.crbf; = \ } @@ -741,8 +751,7 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_f= prp_t *b, \ dfp.a.exponent =3D (int32_t)((int8_t)(te << 3) >> 3); \ \ dfp_quantize(rmc, &dfp); \ - decimal##size##FromNumber((decimal##size *)dfp.t64, &dfp.t, \ - &dfp.context); \ + dfp_finalize_decimal##size(&dfp); \ QUA_PPs(&dfp); \ \ if (size =3D=3D 64) { = \ @@ -764,8 +773,7 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_f= prp_t *a, \ dfp_prepare_decimal##size(&dfp, a, b, env); \ \ dfp_quantize(rmc, &dfp); \ - decimal##size##FromNumber((decimal##size *)dfp.t64, &dfp.t, \ - &dfp.context); \ + dfp_finalize_decimal##size(&dfp); \ QUA_PPs(&dfp); \ \ if (size =3D=3D 64) { = \ @@ -847,8 +855,7 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_f= prp_t *a, \ ref_sig =3D a64 & 0x3f; \ \ _dfp_reround(rmc, ref_sig, xmax, &dfp); \ - decimal##size##FromNumber((decimal##size *)dfp.t64, &dfp.t, \ - &dfp.context); \ + dfp_finalize_decimal##size(&dfp); \ QUA_PPs(&dfp); \ \ if (size =3D=3D 64) { = \ @@ -871,7 +878,7 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_f= prp_t *b, \ = \ dfp_set_round_mode_from_immediate(r, rmc, &dfp); = \ decNumberToIntegralExact(&dfp.t, &dfp.b, &dfp.context); = \ - decimal##size##FromNumber((decimal##size *)dfp.t64, &dfp.t, &dfp.conte= xt); \ + dfp_finalize_decimal##size(&dfp); = \ postprocs(&dfp); = \ = \ if (size =3D=3D 64) { = \ @@ -911,7 +918,7 @@ void helper_dctdp(CPUPPCState *env, ppc_fprp_t *t, ppc_= fprp_t *b) =20 dfp_prepare_decimal64(&dfp, 0, 0, env); decimal32ToNumber((decimal32 *)&b_short, &dfp.t); - decimal64FromNumber((decimal64 *)&dfp.t64, &dfp.t, &dfp.context); + dfp_finalize_decimal64(&dfp); set_dfp64(t, dfp.t64); dfp_set_FPRF_from_FRT(&dfp); } @@ -927,7 +934,7 @@ void helper_dctqpq(CPUPPCState *env, ppc_fprp_t *t, ppc= _fprp_t *b) dfp_check_for_VXSNAN_and_convert_to_QNaN(&dfp); dfp_set_FPRF_from_FRT(&dfp); =20 - decimal128FromNumber((decimal128 *)&dfp.t64, &dfp.t, &dfp.context); + dfp_finalize_decimal128(&dfp); set_dfp128(t, dfp.t64); } =20 @@ -963,7 +970,7 @@ void helper_drdpq(CPUPPCState *env, ppc_fprp_t *t, ppc_= fprp_t *b) dfp_check_for_XX(&dfp); =20 dfp.t64[0] =3D dfp.t64[1] =3D 0; - decimal64FromNumber((decimal64 *)dfp.t64, &dfp.t, &dfp.context); + dfp_finalize_decimal64(&dfp); set_dfp128(t, dfp.t64); } =20 @@ -975,7 +982,7 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_f= prp_t *b) \ dfp_prepare_decimal##size(&dfp, 0, b, env); = \ get_dfp64(&b64, b); = \ decNumberFromInt64(&dfp.t, (int64_t)b64); = \ - decimal##size##FromNumber((decimal##size *)dfp.t64, &dfp.t, &dfp.conte= xt); \ + dfp_finalize_decimal##size(&dfp); = \ CFFIX_PPs(&dfp); = \ = \ if (size =3D=3D 64) { = \ @@ -1155,8 +1162,7 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc= _fprp_t *b, \ if (s && sgn) { = \ dfp.t.bits |=3D DECNEG; = \ } = \ - decimal##size##FromNumber((decimal##size *)dfp.t64, &dfp.t, = \ - &dfp.context); = \ + dfp_finalize_decimal##size(&dfp); = \ dfp_set_FPRF_from_FRT(&dfp); = \ if ((size) =3D=3D 64) { = \ set_dfp64(t, dfp.t64); = \ @@ -1259,8 +1265,7 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc= _fprp_t *a, \ dfp.t.bits &=3D ~DECSPECIAL; = \ } \ dfp.t.exponent =3D exp - bias; = \ - decimal##size##FromNumber((decimal##size *)dfp.t64, &dfp.t, \ - &dfp.context); \ + dfp_finalize_decimal##size(&dfp); \ } \ if (size =3D=3D 64) { = \ set_dfp64(t, dfp.t64); \ @@ -1340,8 +1345,7 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc= _fprp_t *a, \ dfp.t.digits =3D max_digits - 1; \ } \ \ - decimal##size##FromNumber((decimal##size *)dfp.t64, &dfp.t, \ - &dfp.context); \ + dfp_finalize_decimal##size(&dfp); \ } else { \ if ((size) =3D=3D 64) { \ dfp.t64[0] =3D dfp.a64[0] & 0xFFFC000000000000ULL; \ --=20 2.20.1 From nobody Sun May 5 19:04:26 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.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 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1569343653; cv=none; d=zoho.com; s=zohoarc; b=A5PncZue2zumMMolvDnLPt9oTKlni44Y0McsFRtUDw2iBoqARdbZPcoxrJWPh6ZFTnC7qyATnWZr53Lzzfc1N+ZDF7RL8cuXJhhgk/qSnGW4T2Uu03yshqFk6C/353/Xy6SGMpBm7xE1NcQBCXVIkCrOvsksghv+qOhgqLlQIN4= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1569343653; h=Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=dbxWDAydwxLL6IPJhtsMcQH1mI+I5eQPA8XWEWpnFaw=; b=j8AvjpHqro9Uv74F0k84yBtkv2uc3amsUbibLACxAdiky0DdQJwtg289HrsPnly2EVMeM5oTEGzrnDCVcmRQuwxtrSNgGAl2iCPxvL9KiTbR6z27IvseM3yOLPkvXNi0zFy3XCCo6Cw/1AmXzS0TrCEwO8DMo25fFFA2tKTUex4= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1569343653619275.2751088770922; Tue, 24 Sep 2019 09:47:33 -0700 (PDT) Received: from localhost ([::1]:48374 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iCnyJ-0008HF-N6 for importer@patchew.org; Tue, 24 Sep 2019 12:47:27 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:51216) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iCmuV-0008HN-LV for qemu-devel@nongnu.org; Tue, 24 Sep 2019 11:39:31 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iCmuR-0006FM-Qo for qemu-devel@nongnu.org; Tue, 24 Sep 2019 11:39:27 -0400 Received: from mail.ilande.co.uk ([46.43.2.167]:35710 helo=mail.default.ilande.uk0.bigv.io) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iCmuP-0005f7-Mr; Tue, 24 Sep 2019 11:39:23 -0400 Received: from host86-138-245-63.range86-138.btcentralplus.com ([86.138.245.63] helo=kentang.home) by mail.default.ilande.uk0.bigv.io with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.89) (envelope-from ) id 1iCmrZ-0007WZ-Ux; Tue, 24 Sep 2019 16:36:26 +0100 From: Mark Cave-Ayland To: qemu-devel@nongnu.org, qemu-ppc@nongnu.org, pc@us.ibm.com, david@gibson.dropbear.id.au Date: Tue, 24 Sep 2019 16:35:54 +0100 Message-Id: <20190924153556.27575-6-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190924153556.27575-1-mark.cave-ayland@ilande.co.uk> References: <20190924153556.27575-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 86.138.245.63 X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 5/7] target/ppc: change struct PPC_DFP decimal storage from uint64[2] to ppc_vsr_t X-SA-Exim-Version: 4.2.1 (built Tue, 02 Aug 2016 21:08:31 +0000) X-SA-Exim-Scanned: Yes (on mail.default.ilande.uk0.bigv.io) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 46.43.2.167 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" There are several places in dfp_helper.c that access the decimal number representations in struct PPC_DFP via HI_IDX and LO_IDX defines which are s= et at the top of dfp_helper.c according to the host endian. However we can instead switch to using ppc_vsr_t for decimal numbers and th= en make subsequent use of the existing VsrD() macros to access the correct element regardless of host endian. Note that 64-bit decimals are stored in = the LSB of ppc_vsr_t (equivalent to VsrD(1)). Signed-off-by: Mark Cave-Ayland Reviewed-by: Richard Henderson --- target/ppc/dfp_helper.c | 210 +++++++++++++++++++++------------------- 1 file changed, 108 insertions(+), 102 deletions(-) diff --git a/target/ppc/dfp_helper.c b/target/ppc/dfp_helper.c index 52b123b16a..ed437f97da 100644 --- a/target/ppc/dfp_helper.c +++ b/target/ppc/dfp_helper.c @@ -36,31 +36,31 @@ #define LO_IDX 0 #endif =20 -static void get_dfp64(uint64_t *dst, ppc_fprp_t *dfp) +static void get_dfp64(ppc_vsr_t *dst, ppc_fprp_t *dfp) { - dst[0] =3D dfp->VsrD(0); + dst->VsrD(1) =3D dfp->VsrD(0); } =20 -static void get_dfp128(uint64_t *dst, ppc_fprp_t *dfp) +static void get_dfp128(ppc_vsr_t *dst, ppc_fprp_t *dfp) { - dst[HI_IDX] =3D dfp[0].VsrD(0); - dst[LO_IDX] =3D dfp[1].VsrD(0); + dst->VsrD(0) =3D dfp[0].VsrD(0); + dst->VsrD(1) =3D dfp[1].VsrD(0); } =20 -static void set_dfp64(ppc_fprp_t *dfp, uint64_t *src) +static void set_dfp64(ppc_fprp_t *dfp, ppc_vsr_t *src) { - dfp->VsrD(0) =3D src[0]; + dfp->VsrD(0) =3D src->VsrD(1); } =20 -static void set_dfp128(ppc_fprp_t *dfp, uint64_t *src) +static void set_dfp128(ppc_fprp_t *dfp, ppc_vsr_t *src) { - dfp[0].VsrD(0) =3D src[HI_IDX]; - dfp[1].VsrD(0) =3D src[LO_IDX]; + dfp[0].VsrD(0) =3D src->VsrD(0); + dfp[1].VsrD(0) =3D src->VsrD(1); } =20 struct PPC_DFP { CPUPPCState *env; - uint64_t t64[2], a64[2], b64[2]; + ppc_vsr_t vt, va, vb; decNumber t, a, b; decContext context; uint8_t crbf; @@ -151,18 +151,18 @@ static void dfp_prepare_decimal64(struct PPC_DFP *dfp= , ppc_fprp_t *a, dfp->env =3D env; =20 if (a) { - get_dfp64(dfp->a64, a); - decimal64ToNumber((decimal64 *)dfp->a64, &dfp->a); + get_dfp64(&dfp->va, a); + decimal64ToNumber((decimal64 *)&dfp->va.VsrD(1), &dfp->a); } else { - dfp->a64[0] =3D 0; + dfp->va.VsrD(1) =3D 0; decNumberZero(&dfp->a); } =20 if (b) { - get_dfp64(dfp->b64, b); - decimal64ToNumber((decimal64 *)dfp->b64, &dfp->b); + get_dfp64(&dfp->vb, b); + decimal64ToNumber((decimal64 *)&dfp->vb.VsrD(1), &dfp->b); } else { - dfp->b64[0] =3D 0; + dfp->vb.VsrD(1) =3D 0; decNumberZero(&dfp->b); } } @@ -175,30 +175,30 @@ static void dfp_prepare_decimal128(struct PPC_DFP *df= p, ppc_fprp_t *a, dfp->env =3D env; =20 if (a) { - get_dfp128(dfp->a64, a); - decimal128ToNumber((decimal128 *)dfp->a64, &dfp->a); + get_dfp128(&dfp->va, a); + decimal128ToNumber((decimal128 *)&dfp->va, &dfp->a); } else { - dfp->a64[0] =3D dfp->a64[1] =3D 0; + dfp->va.VsrD(0) =3D dfp->va.VsrD(1) =3D 0; decNumberZero(&dfp->a); } =20 if (b) { - get_dfp128(dfp->b64, b); - decimal128ToNumber((decimal128 *)dfp->b64, &dfp->b); + get_dfp128(&dfp->vb, b); + decimal128ToNumber((decimal128 *)&dfp->vb, &dfp->b); } else { - dfp->b64[0] =3D dfp->b64[1] =3D 0; + dfp->vb.VsrD(0) =3D dfp->vb.VsrD(1) =3D 0; decNumberZero(&dfp->b); } } =20 static void dfp_finalize_decimal64(struct PPC_DFP *dfp) { - decimal64FromNumber((decimal64 *)&dfp->t64, &dfp->t, &dfp->context); + decimal64FromNumber((decimal64 *)&dfp->vt.VsrD(1), &dfp->t, &dfp->cont= ext); } =20 static void dfp_finalize_decimal128(struct PPC_DFP *dfp) { - decimal128FromNumber((decimal128 *)&dfp->t64, &dfp->t, &dfp->context); + decimal128FromNumber((decimal128 *)&dfp->vt, &dfp->t, &dfp->context); } =20 static void dfp_set_FPSCR_flag(struct PPC_DFP *dfp, uint64_t flag, @@ -435,9 +435,9 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_f= prp_t *a, \ dfp_finalize_decimal##size(&dfp); = \ postprocs(&dfp); = \ if (size =3D=3D 64) { = \ - set_dfp64(t, dfp.t64); = \ + set_dfp64(t, &dfp.vt); = \ } else if (size =3D=3D 128) { = \ - set_dfp128(t, dfp.t64); = \ + set_dfp128(t, &dfp.vt); = \ } = \ } =20 @@ -647,12 +647,12 @@ uint32_t helper_##op(CPUPPCState *env, ppc_fprp_t *a,= ppc_fprp_t *b) \ { \ struct PPC_DFP dfp; \ unsigned k; \ - uint64_t a64; \ + ppc_vsr_t va; \ \ dfp_prepare_decimal##size(&dfp, 0, b, env); \ \ - get_dfp64(&a64, a); \ - k =3D a64 & 0x3F; = \ + get_dfp64(&va, a); \ + k =3D va.VsrD(1) & 0x3F; = \ \ if (unlikely(decNumberIsSpecial(&dfp.b))) { \ dfp.crbf =3D 1; = \ @@ -755,9 +755,9 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_f= prp_t *b, \ QUA_PPs(&dfp); \ \ if (size =3D=3D 64) { = \ - set_dfp64(t, dfp.t64); \ + set_dfp64(t, &dfp.vt); \ } else if (size =3D=3D 128) { = \ - set_dfp128(t, dfp.t64); \ + set_dfp128(t, &dfp.vt); \ } \ } =20 @@ -777,9 +777,9 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_f= prp_t *a, \ QUA_PPs(&dfp); \ \ if (size =3D=3D 64) { = \ - set_dfp64(t, dfp.t64); \ + set_dfp64(t, &dfp.vt); \ } else if (size =3D=3D 128) { = \ - set_dfp128(t, dfp.t64); \ + set_dfp128(t, &dfp.vt); \ } \ } =20 @@ -845,23 +845,23 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc= _fprp_t *a, \ ppc_fprp_t *b, uint32_t rmc) \ { \ struct PPC_DFP dfp; \ - uint64_t a64; \ + ppc_vsr_t va; \ int32_t ref_sig; \ int32_t xmax =3D ((size) =3D=3D 64) ? 369 : 6111; = \ \ dfp_prepare_decimal##size(&dfp, 0, b, env); \ \ - get_dfp64(&a64, a); \ - ref_sig =3D a64 & 0x3f; \ + get_dfp64(&va, a); \ + ref_sig =3D va.VsrD(1) & 0x3f; \ \ _dfp_reround(rmc, ref_sig, xmax, &dfp); \ dfp_finalize_decimal##size(&dfp); \ QUA_PPs(&dfp); \ \ if (size =3D=3D 64) { = \ - set_dfp64(t, dfp.t64); \ + set_dfp64(t, &dfp.vt); \ } else if (size =3D=3D 128) { = \ - set_dfp128(t, dfp.t64); \ + set_dfp128(t, &dfp.vt); \ } \ } =20 @@ -882,9 +882,9 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_f= prp_t *b, \ postprocs(&dfp); = \ = \ if (size =3D=3D 64) { = \ - set_dfp64(t, dfp.t64); = \ + set_dfp64(t, &dfp.vt); = \ } else if (size =3D=3D 128) { = \ - set_dfp128(t, dfp.t64); = \ + set_dfp128(t, &dfp.vt); = \ } = \ } =20 @@ -910,39 +910,39 @@ DFP_HELPER_RINT(drintnq, RINTN_PPs, 128) void helper_dctdp(CPUPPCState *env, ppc_fprp_t *t, ppc_fprp_t *b) { struct PPC_DFP dfp; - uint64_t b64; + ppc_vsr_t vb; uint32_t b_short; =20 - get_dfp64(&b64, b); - b_short =3D (uint32_t)b64; + get_dfp64(&vb, b); + b_short =3D (uint32_t)vb.VsrD(1); =20 dfp_prepare_decimal64(&dfp, 0, 0, env); decimal32ToNumber((decimal32 *)&b_short, &dfp.t); dfp_finalize_decimal64(&dfp); - set_dfp64(t, dfp.t64); + set_dfp64(t, &dfp.vt); dfp_set_FPRF_from_FRT(&dfp); } =20 void helper_dctqpq(CPUPPCState *env, ppc_fprp_t *t, ppc_fprp_t *b) { struct PPC_DFP dfp; - uint64_t b64; + ppc_vsr_t vb; dfp_prepare_decimal128(&dfp, 0, 0, env); - get_dfp64(&b64, b); - decimal64ToNumber((decimal64 *)&b64, &dfp.t); + get_dfp64(&vb, b); + decimal64ToNumber((decimal64 *)&vb.VsrD(1), &dfp.t); =20 dfp_check_for_VXSNAN_and_convert_to_QNaN(&dfp); dfp_set_FPRF_from_FRT(&dfp); =20 dfp_finalize_decimal128(&dfp); - set_dfp128(t, dfp.t64); + set_dfp128(t, &dfp.vt); } =20 void helper_drsp(CPUPPCState *env, ppc_fprp_t *t, ppc_fprp_t *b) { struct PPC_DFP dfp; uint32_t t_short =3D 0; - uint64_t t64; + ppc_vsr_t vt; dfp_prepare_decimal64(&dfp, 0, b, env); decimal32FromNumber((decimal32 *)&t_short, &dfp.b, &dfp.context); decimal32ToNumber((decimal32 *)&t_short, &dfp.t); @@ -952,16 +952,16 @@ void helper_drsp(CPUPPCState *env, ppc_fprp_t *t, ppc= _fprp_t *b) dfp_check_for_UX(&dfp); dfp_check_for_XX(&dfp); =20 - t64 =3D (uint64_t)t_short; - set_dfp64(t, &t64); + vt.VsrD(1) =3D (uint64_t)t_short; + set_dfp64(t, &vt); } =20 void helper_drdpq(CPUPPCState *env, ppc_fprp_t *t, ppc_fprp_t *b) { struct PPC_DFP dfp; dfp_prepare_decimal128(&dfp, 0, b, env); - decimal64FromNumber((decimal64 *)&dfp.t64, &dfp.b, &dfp.context); - decimal64ToNumber((decimal64 *)&dfp.t64, &dfp.t); + decimal64FromNumber((decimal64 *)&dfp.vt.VsrD(1), &dfp.b, &dfp.context= ); + decimal64ToNumber((decimal64 *)&dfp.vt.VsrD(1), &dfp.t); =20 dfp_check_for_VXSNAN_and_convert_to_QNaN(&dfp); dfp_set_FPRF_from_FRT_long(&dfp); @@ -969,26 +969,26 @@ void helper_drdpq(CPUPPCState *env, ppc_fprp_t *t, pp= c_fprp_t *b) dfp_check_for_UX(&dfp); dfp_check_for_XX(&dfp); =20 - dfp.t64[0] =3D dfp.t64[1] =3D 0; + dfp.vt.VsrD(0) =3D dfp.vt.VsrD(1) =3D 0; dfp_finalize_decimal64(&dfp); - set_dfp128(t, dfp.t64); + set_dfp128(t, &dfp.vt); } =20 #define DFP_HELPER_CFFIX(op, size) = \ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_fprp_t *b) = \ { = \ struct PPC_DFP dfp; = \ - uint64_t b64; = \ + ppc_vsr_t vb; = \ dfp_prepare_decimal##size(&dfp, 0, b, env); = \ - get_dfp64(&b64, b); = \ - decNumberFromInt64(&dfp.t, (int64_t)b64); = \ + get_dfp64(&vb, b); = \ + decNumberFromInt64(&dfp.t, (int64_t)vb.VsrD(1)); = \ dfp_finalize_decimal##size(&dfp); = \ CFFIX_PPs(&dfp); = \ = \ if (size =3D=3D 64) { = \ - set_dfp64(t, dfp.t64); = \ + set_dfp64(t, &dfp.vt); = \ } else if (size =3D=3D 128) { = \ - set_dfp128(t, dfp.t64); = \ + set_dfp128(t, &dfp.vt); = \ } = \ } =20 @@ -1010,28 +1010,30 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, p= pc_fprp_t *b) \ if (unlikely(decNumberIsSpecial(&dfp.b))) { = \ uint64_t invalid_flags =3D FP_VX | FP_VXCVI; = \ if (decNumberIsInfinite(&dfp.b)) { = \ - dfp.t64[0] =3D decNumberIsNegative(&dfp.b) ? INT64_MIN : INT64= _MAX; \ + dfp.vt.VsrD(1) =3D decNumberIsNegative(&dfp.b) ? INT64_MIN : = \ + INT64_MAX; = \ } else { /* NaN */ = \ - dfp.t64[0] =3D INT64_MIN; = \ + dfp.vt.VsrD(1) =3D INT64_MIN; = \ if (decNumberIsSNaN(&dfp.b)) { = \ invalid_flags |=3D FP_VXSNAN; = \ } = \ } = \ dfp_set_FPSCR_flag(&dfp, invalid_flags, FP_VE); = \ } else if (unlikely(decNumberIsZero(&dfp.b))) { = \ - dfp.t64[0] =3D 0; = \ + dfp.vt.VsrD(1) =3D 0; = \ } else { = \ decNumberToIntegralExact(&dfp.b, &dfp.b, &dfp.context); = \ - dfp.t64[0] =3D decNumberIntegralToInt64(&dfp.b, &dfp.context); = \ + dfp.vt.VsrD(1) =3D decNumberIntegralToInt64(&dfp.b, &dfp.context);= \ if (decContextTestStatus(&dfp.context, DEC_Invalid_operation)) { = \ - dfp.t64[0] =3D decNumberIsNegative(&dfp.b) ? INT64_MIN : INT64= _MAX; \ + dfp.vt.VsrD(1) =3D decNumberIsNegative(&dfp.b) ? INT64_MIN : = \ + INT64_MAX; = \ dfp_set_FPSCR_flag(&dfp, FP_VX | FP_VXCVI, FP_VE); = \ } else { = \ dfp_check_for_XX(&dfp); = \ } = \ } = \ = \ - set_dfp64(t, dfp.t64); = \ + set_dfp64(t, &dfp.vt); = \ } =20 DFP_HELPER_CTFIX(dctfix, 64) @@ -1075,11 +1077,11 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, p= pc_fprp_t *b, \ dfp_prepare_decimal##size(&dfp, 0, b, env); \ \ decNumberGetBCD(&dfp.b, digits); \ - dfp.t64[0] =3D dfp.t64[1] =3D 0; = \ + dfp.vt.VsrD(0) =3D dfp.vt.VsrD(1) =3D 0; = \ N =3D dfp.b.digits; = \ \ for (i =3D 0; (i < N) && (i < (size)/4); i++) { = \ - dfp_set_bcd_digit_##size(dfp.t64, digits[N-i-1], i); \ + dfp_set_bcd_digit_##size(&dfp.vt.u64[0], digits[N - i - 1], i); \ } \ \ if (sp & 2) { \ @@ -1090,13 +1092,13 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, p= pc_fprp_t *b, \ } else { \ sgn =3D ((sp & 1) ? 0xF : 0xC); = \ } \ - dfp_set_sign_##size(dfp.t64, sgn); \ + dfp_set_sign_##size(&dfp.vt.u64[0], sgn); \ } \ \ if (size =3D=3D 64) { = \ - set_dfp64(t, dfp.t64); \ + set_dfp64(t, &dfp.vt); \ } else if (size =3D=3D 128) { = \ - set_dfp128(t, dfp.t64); \ + set_dfp128(t, &dfp.vt); \ } \ } =20 @@ -1126,7 +1128,8 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc= _fprp_t *b, \ decNumberZero(&dfp.t); = \ = \ if (s) { = \ - uint8_t sgnNibble =3D dfp_get_bcd_digit_##size(dfp.b64, offset++);= \ + uint8_t sgnNibble =3D dfp_get_bcd_digit_##size(&dfp.vb.u64[0], = \ + offset++); = \ switch (sgnNibble) { = \ case 0xD: = \ case 0xB: = \ @@ -1146,7 +1149,8 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc= _fprp_t *b, \ = \ while (offset < (size) / 4) { = \ n++; = \ - digits[(size) / 4 - n] =3D dfp_get_bcd_digit_##size(dfp.b64, offse= t++); \ + digits[(size) / 4 - n] =3D dfp_get_bcd_digit_##size(&dfp.vb.u64[0]= , \ + offset++); = \ if (digits[(size) / 4 - n] > 10) { = \ dfp_set_FPSCR_flag(&dfp, FP_VX | FP_VXCVI, FPSCR_VE); = \ return; = \ @@ -1165,9 +1169,9 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc= _fprp_t *b, \ dfp_finalize_decimal##size(&dfp); = \ dfp_set_FPRF_from_FRT(&dfp); = \ if ((size) =3D=3D 64) { = \ - set_dfp64(t, dfp.t64); = \ + set_dfp64(t, &dfp.vt); = \ } else if ((size) =3D=3D 128) { = \ - set_dfp128(t, dfp.t64); = \ + set_dfp128(t, &dfp.vt); = \ } = \ } =20 @@ -1178,30 +1182,30 @@ DFP_HELPER_ENBCD(denbcdq, 128) void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_fprp_t *b) \ { \ struct PPC_DFP dfp; \ - uint64_t t64; \ + ppc_vsr_t vt; \ \ dfp_prepare_decimal##size(&dfp, 0, b, env); \ \ if (unlikely(decNumberIsSpecial(&dfp.b))) { \ if (decNumberIsInfinite(&dfp.b)) { \ - t64 =3D -1; \ + vt.VsrD(1) =3D -1; \ } else if (decNumberIsSNaN(&dfp.b)) { \ - t64 =3D -3; \ + vt.VsrD(1) =3D -3; \ } else if (decNumberIsQNaN(&dfp.b)) { \ - t64 =3D -2; \ + vt.VsrD(1) =3D -2; \ } else { \ assert(0); \ } \ - set_dfp64(t, &t64); \ + set_dfp64(t, &vt); \ } else { \ if ((size) =3D=3D 64) { \ - t64 =3D dfp.b.exponent + 398; \ + vt.VsrD(1) =3D dfp.b.exponent + 398; \ } else if ((size) =3D=3D 128) { \ - t64 =3D dfp.b.exponent + 6176; \ + vt.VsrD(1) =3D dfp.b.exponent + 6176; \ } else { \ assert(0); \ } \ - set_dfp64(t, &t64); \ + set_dfp64(t, &vt); \ } \ } =20 @@ -1225,12 +1229,13 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, p= pc_fprp_t *a, \ ppc_fprp_t *b) \ { \ struct PPC_DFP dfp; \ - uint64_t raw_qnan, raw_snan, raw_inf, max_exp, a64; \ + uint64_t raw_qnan, raw_snan, raw_inf, max_exp; \ + ppc_vsr_t va; \ int bias; \ int64_t exp; \ \ - get_dfp64(&a64, a); \ - exp =3D (int64_t)a64; = \ + get_dfp64(&va, a); \ + exp =3D (int64_t)va.VsrD(1); = \ dfp_prepare_decimal##size(&dfp, 0, b, env); \ \ if ((size) =3D=3D 64) { = \ @@ -1250,14 +1255,14 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, p= pc_fprp_t *a, \ } \ \ if (unlikely((exp < 0) || (exp > max_exp))) { \ - dfp.t64[0] =3D dfp.b64[0]; = \ - dfp.t64[1] =3D dfp.b64[1]; = \ + dfp.vt.VsrD(0) =3D dfp.vb.VsrD(0); = \ + dfp.vt.VsrD(1) =3D dfp.vb.VsrD(1); = \ if (exp =3D=3D -1) { = \ - dfp_set_raw_exp_##size(dfp.t64, raw_inf); \ + dfp_set_raw_exp_##size(&dfp.vt.u64[0], raw_inf); \ } else if (exp =3D=3D -3) { = \ - dfp_set_raw_exp_##size(dfp.t64, raw_snan); \ + dfp_set_raw_exp_##size(&dfp.vt.u64[0], raw_snan); \ } else { \ - dfp_set_raw_exp_##size(dfp.t64, raw_qnan); \ + dfp_set_raw_exp_##size(&dfp.vt.u64[0], raw_qnan); \ } \ } else { \ dfp.t =3D dfp.b; = \ @@ -1268,9 +1273,9 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc= _fprp_t *a, \ dfp_finalize_decimal##size(&dfp); \ } \ if (size =3D=3D 64) { = \ - set_dfp64(t, dfp.t64); \ + set_dfp64(t, &dfp.vt); \ } else if (size =3D=3D 128) { = \ - set_dfp128(t, dfp.t64); \ + set_dfp128(t, &dfp.vt); \ } \ } =20 @@ -1348,20 +1353,21 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, p= pc_fprp_t *a, \ dfp_finalize_decimal##size(&dfp); \ } else { \ if ((size) =3D=3D 64) { \ - dfp.t64[0] =3D dfp.a64[0] & 0xFFFC000000000000ULL; \ - dfp_clear_lmd_from_g5msb(dfp.t64); \ + dfp.vt.VsrD(1) =3D dfp.va.VsrD(1) & \ + 0xFFFC000000000000ULL; \ + dfp_clear_lmd_from_g5msb(&dfp.vt.VsrD(1)); \ } else { \ - dfp.t64[HI_IDX] =3D dfp.a64[HI_IDX] & \ - 0xFFFFC00000000000ULL; \ - dfp_clear_lmd_from_g5msb(dfp.t64 + HI_IDX); \ - dfp.t64[LO_IDX] =3D 0; \ + dfp.vt.VsrD(0) =3D dfp.va.VsrD(0) & \ + 0xFFFFC00000000000ULL; \ + dfp_clear_lmd_from_g5msb(&dfp.vt.VsrD(0)); \ + dfp.vt.VsrD(1) =3D 0; \ } \ } \ \ if ((size) =3D=3D 64) { \ - set_dfp64(t, dfp.t64); \ + set_dfp64(t, &dfp.vt); \ } else { \ - set_dfp128(t, dfp.t64); \ + set_dfp128(t, &dfp.vt); \ } \ } =20 --=20 2.20.1 From nobody Sun May 5 19:04:26 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.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 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1569342750; cv=none; d=zoho.com; s=zohoarc; b=BbHjHwqZbg7sVNZn1ZVLGvjXFNu8NJ8TXftbtttx4zIouZYBYC6dbog7ioEmFdscYm4fRfRS93wKW2LzKEnV83QrEqY+iwVLEBYaO8oDAWSZyTXuSjEDtGxxGj8svN744MKo8LKX6x4WoTW+J12AW+Npb0vHh+GhRcAT+vA3vvw= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1569342750; h=Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=qxVmposWO6QuKbnS7MCozPD2Fc929jDh2CL/LYDdpEs=; b=AEVNZhoAUiQmdnzpEs3A3sa8yCAVoOaEOn/Qs3/uY6CuwzR3T1eMZWpjcFoWmp86q/YVz67f5ptWPok27I/sos0HM7gopT2erf0Imr+1KONFzYoUFmqQCy2EZ7kwthRZP7Pss5MnOF0q9OFRion0gsvsoEthCrP7rVMuc0IZ6bU= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1569342750614150.93561644491524; Tue, 24 Sep 2019 09:32:30 -0700 (PDT) Received: from localhost ([::1]:48120 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iCnjm-0002jN-Az for importer@patchew.org; Tue, 24 Sep 2019 12:32:26 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:51212) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iCmuV-0008HI-Jr for qemu-devel@nongnu.org; Tue, 24 Sep 2019 11:39:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iCmuT-0006Gn-MW for qemu-devel@nongnu.org; Tue, 24 Sep 2019 11:39:27 -0400 Received: from mail.ilande.co.uk ([46.43.2.167]:35714 helo=mail.default.ilande.uk0.bigv.io) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iCmuR-0005fp-L7; Tue, 24 Sep 2019 11:39:25 -0400 Received: from host86-138-245-63.range86-138.btcentralplus.com ([86.138.245.63] helo=kentang.home) by mail.default.ilande.uk0.bigv.io with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.89) (envelope-from ) id 1iCmrb-0007WZ-0T; Tue, 24 Sep 2019 16:36:27 +0100 From: Mark Cave-Ayland To: qemu-devel@nongnu.org, qemu-ppc@nongnu.org, pc@us.ibm.com, david@gibson.dropbear.id.au Date: Tue, 24 Sep 2019 16:35:55 +0100 Message-Id: <20190924153556.27575-7-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190924153556.27575-1-mark.cave-ayland@ilande.co.uk> References: <20190924153556.27575-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 86.138.245.63 X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 6/7] target/ppc: use existing VsrD() macro to eliminate HI_IDX and LO_IDX from dfp_helper.c X-SA-Exim-Version: 4.2.1 (built Tue, 02 Aug 2016 21:08:31 +0000) X-SA-Exim-Scanned: Yes (on mail.default.ilande.uk0.bigv.io) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 46.43.2.167 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Switch over all accesses to the decimal numbers held in struct PPC_DFP from using HI_IDX and LO_IDX to using the VsrD() macro instead. Not only does th= is allow the compiler to ensure that the various dfp_* functions are being pas= sed a ppc_vsr_t rather than an arbitrary uint64_t pointer, but also allows the host endian-specific HI_IDX and LO_IDX to be completely removed from dfp_helper.c. Signed-off-by: Mark Cave-Ayland Reviewed-by: Richard Henderson --- target/ppc/dfp_helper.c | 70 ++++++++++++++++++----------------------- 1 file changed, 31 insertions(+), 39 deletions(-) diff --git a/target/ppc/dfp_helper.c b/target/ppc/dfp_helper.c index ed437f97da..c2d335e928 100644 --- a/target/ppc/dfp_helper.c +++ b/target/ppc/dfp_helper.c @@ -28,13 +28,6 @@ #include "libdecnumber/dpd/decimal64.h" #include "libdecnumber/dpd/decimal128.h" =20 -#if defined(HOST_WORDS_BIGENDIAN) -#define HI_IDX 0 -#define LO_IDX 1 -#else -#define HI_IDX 1 -#define LO_IDX 0 -#endif =20 static void get_dfp64(ppc_vsr_t *dst, ppc_fprp_t *dfp) { @@ -1039,31 +1032,31 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, p= pc_fprp_t *b) \ DFP_HELPER_CTFIX(dctfix, 64) DFP_HELPER_CTFIX(dctfixq, 128) =20 -static inline void dfp_set_bcd_digit_64(uint64_t *t, uint8_t digit, - unsigned n) +static inline void dfp_set_bcd_digit_64(ppc_vsr_t *t, uint8_t digit, + unsigned n) { - *t |=3D ((uint64_t)(digit & 0xF) << (n << 2)); + t->VsrD(1) |=3D ((uint64_t)(digit & 0xF) << (n << 2)); } =20 -static inline void dfp_set_bcd_digit_128(uint64_t *t, uint8_t digit, - unsigned n) +static inline void dfp_set_bcd_digit_128(ppc_vsr_t *t, uint8_t digit, + unsigned n) { - t[(n & 0x10) ? HI_IDX : LO_IDX] |=3D + t->VsrD((n & 0x10) ? 0 : 1) |=3D ((uint64_t)(digit & 0xF) << ((n & 15) << 2)); } =20 -static inline void dfp_set_sign_64(uint64_t *t, uint8_t sgn) +static inline void dfp_set_sign_64(ppc_vsr_t *t, uint8_t sgn) { - *t <<=3D 4; - *t |=3D (sgn & 0xF); + t->VsrD(1) <<=3D 4; + t->VsrD(1) |=3D (sgn & 0xF); } =20 -static inline void dfp_set_sign_128(uint64_t *t, uint8_t sgn) +static inline void dfp_set_sign_128(ppc_vsr_t *t, uint8_t sgn) { - t[HI_IDX] <<=3D 4; - t[HI_IDX] |=3D (t[LO_IDX] >> 60); - t[LO_IDX] <<=3D 4; - t[LO_IDX] |=3D (sgn & 0xF); + t->VsrD(0) <<=3D 4; + t->VsrD(0) |=3D (t->VsrD(0) >> 60); + t->VsrD(1) <<=3D 4; + t->VsrD(1) |=3D (sgn & 0xF); } =20 #define DFP_HELPER_DEDPD(op, size) \ @@ -1081,7 +1074,7 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc= _fprp_t *b, \ N =3D dfp.b.digits; = \ \ for (i =3D 0; (i < N) && (i < (size)/4); i++) { = \ - dfp_set_bcd_digit_##size(&dfp.vt.u64[0], digits[N - i - 1], i); \ + dfp_set_bcd_digit_##size(&dfp.vt, digits[N - i - 1], i); \ } \ \ if (sp & 2) { \ @@ -1092,7 +1085,7 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc= _fprp_t *b, \ } else { \ sgn =3D ((sp & 1) ? 0xF : 0xC); = \ } \ - dfp_set_sign_##size(&dfp.vt.u64[0], sgn); \ + dfp_set_sign_##size(&dfp.vt, sgn); \ } \ \ if (size =3D=3D 64) { = \ @@ -1105,14 +1098,14 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, p= pc_fprp_t *b, \ DFP_HELPER_DEDPD(ddedpd, 64) DFP_HELPER_DEDPD(ddedpdq, 128) =20 -static inline uint8_t dfp_get_bcd_digit_64(uint64_t *t, unsigned n) +static inline uint8_t dfp_get_bcd_digit_64(ppc_vsr_t *t, unsigned n) { - return *t >> ((n << 2) & 63) & 15; + return t->VsrD(1) >> ((n << 2) & 63) & 15; } =20 -static inline uint8_t dfp_get_bcd_digit_128(uint64_t *t, unsigned n) +static inline uint8_t dfp_get_bcd_digit_128(ppc_vsr_t *t, unsigned n) { - return t[(n & 0x10) ? HI_IDX : LO_IDX] >> ((n << 2) & 63) & 15; + return t->VsrD((n & 0x10) ? 0 : 1) >> ((n << 2) & 63) & 15; } =20 #define DFP_HELPER_ENBCD(op, size) = \ @@ -1128,8 +1121,7 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc= _fprp_t *b, \ decNumberZero(&dfp.t); = \ = \ if (s) { = \ - uint8_t sgnNibble =3D dfp_get_bcd_digit_##size(&dfp.vb.u64[0], = \ - offset++); = \ + uint8_t sgnNibble =3D dfp_get_bcd_digit_##size(&dfp.vb, offset++);= \ switch (sgnNibble) { = \ case 0xD: = \ case 0xB: = \ @@ -1149,7 +1141,7 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc= _fprp_t *b, \ = \ while (offset < (size) / 4) { = \ n++; = \ - digits[(size) / 4 - n] =3D dfp_get_bcd_digit_##size(&dfp.vb.u64[0]= , \ + digits[(size) / 4 - n] =3D dfp_get_bcd_digit_##size(&dfp.vb, = \ offset++); = \ if (digits[(size) / 4 - n] > 10) { = \ dfp_set_FPSCR_flag(&dfp, FP_VX | FP_VXCVI, FPSCR_VE); = \ @@ -1212,16 +1204,16 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, p= pc_fprp_t *b) \ DFP_HELPER_XEX(dxex, 64) DFP_HELPER_XEX(dxexq, 128) =20 -static void dfp_set_raw_exp_64(uint64_t *t, uint64_t raw) +static void dfp_set_raw_exp_64(ppc_vsr_t *t, uint64_t raw) { - *t &=3D 0x8003ffffffffffffULL; - *t |=3D (raw << (63 - 13)); + t->VsrD(1) &=3D 0x8003ffffffffffffULL; + t->VsrD(1) |=3D (raw << (63 - 13)); } =20 -static void dfp_set_raw_exp_128(uint64_t *t, uint64_t raw) +static void dfp_set_raw_exp_128(ppc_vsr_t *t, uint64_t raw) { - t[HI_IDX] &=3D 0x80003fffffffffffULL; - t[HI_IDX] |=3D (raw << (63 - 17)); + t->VsrD(0) &=3D 0x80003fffffffffffULL; + t->VsrD(0) |=3D (raw << (63 - 17)); } =20 #define DFP_HELPER_IEX(op, size) \ @@ -1258,11 +1250,11 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, p= pc_fprp_t *a, \ dfp.vt.VsrD(0) =3D dfp.vb.VsrD(0); = \ dfp.vt.VsrD(1) =3D dfp.vb.VsrD(1); = \ if (exp =3D=3D -1) { = \ - dfp_set_raw_exp_##size(&dfp.vt.u64[0], raw_inf); \ + dfp_set_raw_exp_##size(&dfp.vt, raw_inf); \ } else if (exp =3D=3D -3) { = \ - dfp_set_raw_exp_##size(&dfp.vt.u64[0], raw_snan); \ + dfp_set_raw_exp_##size(&dfp.vt, raw_snan); \ } else { \ - dfp_set_raw_exp_##size(&dfp.vt.u64[0], raw_qnan); \ + dfp_set_raw_exp_##size(&dfp.vt, raw_qnan); \ } \ } else { \ dfp.t =3D dfp.b; = \ --=20 2.20.1 From nobody Sun May 5 19:04:26 2024 Delivered-To: importer@patchew.org Received-SPF: pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) client-ip=209.51.188.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 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org ARC-Seal: i=1; a=rsa-sha256; t=1569342170; cv=none; d=zoho.com; s=zohoarc; b=TaIQiVYKXebP+RTqVzB5wE2SDUmL3Wc5DjYXkf2CYvBjAg6NpJmOlwjVtqv8lQ350HdxIcrWKKGm7P/8xwtwoFtgklVhA0jcH9haa/zHtO0Ct+huCpZy5dQrwJc8R8zVcjbyOsayTacTvTi0wLD8FyTLq4YL2IEsthmhivsE8Nc= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=zoho.com; s=zohoarc; t=1569342170; h=Content-Transfer-Encoding:Date:From:In-Reply-To:List-Subscribe:List-Post:List-Id:List-Archive:List-Help:List-Unsubscribe:MIME-Version:Message-ID:References:Sender:Subject:To:ARC-Authentication-Results; bh=Wxf2Z9wE3XH1g18IZhNDDG/1eENkvZ8JmM1gkxwbS0I=; b=dkD6J5OnLmiD8NMH6w4KEaEqOTMfhYTpq5oB9mm2X6dQ9mc9EHNTiM92leuFYu9ORvSOG9Nca8DmqXDPYHHPejxZIaFApDRwL6QC37qZctVeXW+pPIrgoL5InjqmtvZ1XNtLqlRW+4kZxqhvO9RO+HKsfjPdHE1TCHYKfvGlEbo= ARC-Authentication-Results: i=1; mx.zoho.com; spf=pass (zoho.com: domain of gnu.org designates 209.51.188.17 as permitted sender) smtp.mailfrom=qemu-devel-bounces+importer=patchew.org@nongnu.org Return-Path: Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) by mx.zohomail.com with SMTPS id 1569342170713577.5356271312971; Tue, 24 Sep 2019 09:22:50 -0700 (PDT) Received: from localhost ([::1]:47952 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iCnaT-0001OH-98 for importer@patchew.org; Tue, 24 Sep 2019 12:22:49 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:51214) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1iCmuV-0008HL-KT for qemu-devel@nongnu.org; Tue, 24 Sep 2019 11:39:29 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1iCmuT-0006Gg-M9 for qemu-devel@nongnu.org; Tue, 24 Sep 2019 11:39:27 -0400 Received: from mail.ilande.co.uk ([46.43.2.167]:35716 helo=mail.default.ilande.uk0.bigv.io) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1iCmuR-0005fn-Ki; Tue, 24 Sep 2019 11:39:23 -0400 Received: from host86-138-245-63.range86-138.btcentralplus.com ([86.138.245.63] helo=kentang.home) by mail.default.ilande.uk0.bigv.io with esmtpsa (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.89) (envelope-from ) id 1iCmrc-0007WZ-0s; Tue, 24 Sep 2019 16:36:28 +0100 From: Mark Cave-Ayland To: qemu-devel@nongnu.org, qemu-ppc@nongnu.org, pc@us.ibm.com, david@gibson.dropbear.id.au Date: Tue, 24 Sep 2019 16:35:56 +0100 Message-Id: <20190924153556.27575-8-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190924153556.27575-1-mark.cave-ayland@ilande.co.uk> References: <20190924153556.27575-1-mark.cave-ayland@ilande.co.uk> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable X-SA-Exim-Connect-IP: 86.138.245.63 X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk Subject: [PATCH 7/7] target/ppc: remove unnecessary if() around calls to set_dfp{64, 128}() in DFP macros X-SA-Exim-Version: 4.2.1 (built Tue, 02 Aug 2016 21:08:31 +0000) X-SA-Exim-Scanned: Yes (on mail.default.ilande.uk0.bigv.io) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 46.43.2.167 X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Type: text/plain; charset="utf-8" Now that the parameters to both set_dfp64() and set_dfp128() are exactly the same, there is no need for an explicit if() statement to determine which function should be called based upon size. Instead we can simply use the preprocessor to generate the call to set_dfp##size() directly. Signed-off-by: Mark Cave-Ayland Reviewed-by: Richard Henderson --- target/ppc/dfp_helper.c | 60 +++++++---------------------------------- 1 file changed, 10 insertions(+), 50 deletions(-) diff --git a/target/ppc/dfp_helper.c b/target/ppc/dfp_helper.c index c2d335e928..8100bfc98d 100644 --- a/target/ppc/dfp_helper.c +++ b/target/ppc/dfp_helper.c @@ -427,11 +427,7 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_= fprp_t *a, \ dnop(&dfp.t, &dfp.a, &dfp.b, &dfp.context); = \ dfp_finalize_decimal##size(&dfp); = \ postprocs(&dfp); = \ - if (size =3D=3D 64) { = \ - set_dfp64(t, &dfp.vt); = \ - } else if (size =3D=3D 128) { = \ - set_dfp128(t, &dfp.vt); = \ - } = \ + set_dfp##size(t, &dfp.vt); = \ } =20 static void ADD_PPs(struct PPC_DFP *dfp) @@ -747,11 +743,7 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_= fprp_t *b, \ dfp_finalize_decimal##size(&dfp); \ QUA_PPs(&dfp); \ \ - if (size =3D=3D 64) { = \ - set_dfp64(t, &dfp.vt); \ - } else if (size =3D=3D 128) { = \ - set_dfp128(t, &dfp.vt); \ - } \ + set_dfp##size(t, &dfp.vt); \ } =20 DFP_HELPER_QUAI(dquai, 64) @@ -769,11 +761,7 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_= fprp_t *a, \ dfp_finalize_decimal##size(&dfp); \ QUA_PPs(&dfp); \ \ - if (size =3D=3D 64) { = \ - set_dfp64(t, &dfp.vt); \ - } else if (size =3D=3D 128) { = \ - set_dfp128(t, &dfp.vt); \ - } \ + set_dfp##size(t, &dfp.vt); \ } =20 DFP_HELPER_QUA(dqua, 64) @@ -851,11 +839,7 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_= fprp_t *a, \ dfp_finalize_decimal##size(&dfp); \ QUA_PPs(&dfp); \ \ - if (size =3D=3D 64) { = \ - set_dfp64(t, &dfp.vt); \ - } else if (size =3D=3D 128) { = \ - set_dfp128(t, &dfp.vt); \ - } \ + set_dfp##size(t, &dfp.vt); \ } =20 DFP_HELPER_RRND(drrnd, 64) @@ -874,11 +858,7 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_= fprp_t *b, \ dfp_finalize_decimal##size(&dfp); = \ postprocs(&dfp); = \ = \ - if (size =3D=3D 64) { = \ - set_dfp64(t, &dfp.vt); = \ - } else if (size =3D=3D 128) { = \ - set_dfp128(t, &dfp.vt); = \ - } = \ + set_dfp##size(t, &dfp.vt); = \ } =20 static void RINTX_PPs(struct PPC_DFP *dfp) @@ -978,11 +958,7 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, ppc_= fprp_t *b) \ dfp_finalize_decimal##size(&dfp); = \ CFFIX_PPs(&dfp); = \ = \ - if (size =3D=3D 64) { = \ - set_dfp64(t, &dfp.vt); = \ - } else if (size =3D=3D 128) { = \ - set_dfp128(t, &dfp.vt); = \ - } = \ + set_dfp##size(t, &dfp.vt); = \ } =20 static void CFFIX_PPs(struct PPC_DFP *dfp) @@ -1088,11 +1064,7 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, pp= c_fprp_t *b, \ dfp_set_sign_##size(&dfp.vt, sgn); \ } \ \ - if (size =3D=3D 64) { = \ - set_dfp64(t, &dfp.vt); \ - } else if (size =3D=3D 128) { = \ - set_dfp128(t, &dfp.vt); \ - } \ + set_dfp##size(t, &dfp.vt); \ } =20 DFP_HELPER_DEDPD(ddedpd, 64) @@ -1160,11 +1132,7 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, pp= c_fprp_t *b, \ } = \ dfp_finalize_decimal##size(&dfp); = \ dfp_set_FPRF_from_FRT(&dfp); = \ - if ((size) =3D=3D 64) { = \ - set_dfp64(t, &dfp.vt); = \ - } else if ((size) =3D=3D 128) { = \ - set_dfp128(t, &dfp.vt); = \ - } = \ + set_dfp##size(t, &dfp.vt); = \ } =20 DFP_HELPER_ENBCD(denbcd, 64) @@ -1264,11 +1232,7 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, pp= c_fprp_t *a, \ dfp.t.exponent =3D exp - bias; = \ dfp_finalize_decimal##size(&dfp); \ } \ - if (size =3D=3D 64) { = \ - set_dfp64(t, &dfp.vt); \ - } else if (size =3D=3D 128) { = \ - set_dfp128(t, &dfp.vt); \ - } \ + set_dfp##size(t, &dfp.vt); \ } =20 DFP_HELPER_IEX(diex, 64) @@ -1356,11 +1320,7 @@ void helper_##op(CPUPPCState *env, ppc_fprp_t *t, pp= c_fprp_t *a, \ } \ } \ \ - if ((size) =3D=3D 64) { \ - set_dfp64(t, &dfp.vt); \ - } else { \ - set_dfp128(t, &dfp.vt); \ - } \ + set_dfp##size(t, &dfp.vt); \ } =20 DFP_HELPER_SHIFT(dscli, 64, 1) --=20 2.20.1