From nobody Fri Nov 7 04:08:01 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.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 1545565516382979.3480227975849; Sun, 23 Dec 2018 03:45:16 -0800 (PST) Received: from localhost ([::1]:50809 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gb2C2-0005LG-Sw for importer@patchew.org; Sun, 23 Dec 2018 06:45:14 -0500 Received: from eggs.gnu.org ([2001:4830:134:3::10]:50632) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1gb26V-0000qk-Ly for qemu-devel@nongnu.org; Sun, 23 Dec 2018 06:39:33 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1gb26T-0000GN-S4 for qemu-devel@nongnu.org; Sun, 23 Dec 2018 06:39:31 -0500 Received: from chuckie.co.uk ([82.165.15.123]:48742 helo=s16892447.onlinehome-server.info) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1gb26S-00009r-0f; Sun, 23 Dec 2018 06:39:28 -0500 Received: from host86-177-178-114.range86-177.btcentralplus.com ([86.177.178.114] helo=kentang.home) by s16892447.onlinehome-server.info with esmtpsa (TLS1.0:DHE_RSA_AES_256_CBC_SHA1:32) (Exim 4.76) (envelope-from ) id 1gb26a-0000Xw-L6; Sun, 23 Dec 2018 11:39:39 +0000 From: Mark Cave-Ayland To: qemu-devel@nongnu.org, qemu-ppc@nongnu.org, richard.henderson@linaro.org, david@gibson.dropbear.id.au Date: Sun, 23 Dec 2018 11:38:59 +0000 Message-Id: <20181223113859.3675-7-mark.cave-ayland@ilande.co.uk> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20181223113859.3675-1-mark.cave-ayland@ilande.co.uk> References: <20181223113859.3675-1-mark.cave-ayland@ilande.co.uk> X-SA-Exim-Connect-IP: 86.177.178.114 X-SA-Exim-Mail-From: mark.cave-ayland@ilande.co.uk X-SA-Exim-Version: 4.2.1 (built Sun, 08 Jan 2012 02:45:44 +0000) X-SA-Exim-Scanned: Yes (on s16892447.onlinehome-server.info) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 3.x X-Received-From: 82.165.15.123 Subject: [Qemu-devel] [PATCH 6/6] target/ppc: remove various HOST_WORDS_BIGENDIAN hacks in int_helper.c 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: , Errors-To: qemu-devel-bounces+importer=patchew.org@nongnu.org Sender: "Qemu-devel" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Following on from the previous work, there are numerous endian-related hacks in int_helper.c that can now be replaced with Vsr* macros. Signed-off-by: Mark Cave-Ayland --- target/ppc/int_helper.c | 205 +++++++++++++++++---------------------------= ---- 1 file changed, 70 insertions(+), 135 deletions(-) diff --git a/target/ppc/int_helper.c b/target/ppc/int_helper.c index 4cc7fdfd25..0d97eb9383 100644 --- a/target/ppc/int_helper.c +++ b/target/ppc/int_helper.c @@ -443,8 +443,8 @@ void helper_lvsl(ppc_avr_t *r, target_ulong sh) { int i, j =3D (sh & 0xf); =20 - VECTOR_FOR_INORDER_I(i, u8) { - r->u8[i] =3D j++; + for (i =3D 0; i < ARRAY_SIZE(r->u8); i++) { + r->VsrB(i) =3D j++; } } =20 @@ -452,18 +452,14 @@ void helper_lvsr(ppc_avr_t *r, target_ulong sh) { int i, j =3D 0x10 - (sh & 0xf); =20 - VECTOR_FOR_INORDER_I(i, u8) { - r->u8[i] =3D j++; + for (i =3D 0; i < ARRAY_SIZE(r->u8); i++) { + r->VsrB(i) =3D j++; } } =20 void helper_mtvscr(CPUPPCState *env, ppc_avr_t *r) { -#if defined(HOST_WORDS_BIGENDIAN) - env->vscr =3D r->u32[3]; -#else - env->vscr =3D r->u32[0]; -#endif + env->vscr =3D r->VsrW(3); set_flush_to_zero(vscr_nj, &env->vec_status); } =20 @@ -870,8 +866,8 @@ target_ulong helper_vclzlsbb(ppc_avr_t *r) { target_ulong count =3D 0; int i; - VECTOR_FOR_INORDER_I(i, u8) { - if (r->u8[i] & 0x01) { + for (i =3D 0; i < ARRAY_SIZE(r->u8); i++) { + if (r->VsrB(i) & 0x01) { break; } count++; @@ -883,12 +879,8 @@ target_ulong helper_vctzlsbb(ppc_avr_t *r) { target_ulong count =3D 0; int i; -#if defined(HOST_WORDS_BIGENDIAN) for (i =3D ARRAY_SIZE(r->u8) - 1; i >=3D 0; i--) { -#else - for (i =3D 0; i < ARRAY_SIZE(r->u8); i++) { -#endif - if (r->u8[i] & 0x01) { + if (r->VsrB(i) & 0x01) { break; } count++; @@ -1151,18 +1143,14 @@ void helper_vperm(CPUPPCState *env, ppc_avr_t *r, p= pc_avr_t *a, ppc_avr_t *b, ppc_avr_t result; int i; =20 - VECTOR_FOR_INORDER_I(i, u8) { - int s =3D c->u8[i] & 0x1f; -#if defined(HOST_WORDS_BIGENDIAN) + for (i =3D 0; i < ARRAY_SIZE(r->u8); i++) { + int s =3D c->VsrB(i) & 0x1f; int index =3D s & 0xf; -#else - int index =3D 15 - (s & 0xf); -#endif =20 if (s & 0x10) { - result.u8[i] =3D b->u8[index]; + result.VsrB(i) =3D b->VsrB(index); } else { - result.u8[i] =3D a->u8[index]; + result.VsrB(i) =3D a->VsrB(index); } } *r =3D result; @@ -1174,18 +1162,14 @@ void helper_vpermr(CPUPPCState *env, ppc_avr_t *r, = ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t result; int i; =20 - VECTOR_FOR_INORDER_I(i, u8) { - int s =3D c->u8[i] & 0x1f; -#if defined(HOST_WORDS_BIGENDIAN) + for (i =3D 0; i < ARRAY_SIZE(r->u8); i++) { + int s =3D c->VsrB(i) & 0x1f; int index =3D 15 - (s & 0xf); -#else - int index =3D s & 0xf; -#endif =20 if (s & 0x10) { - result.u8[i] =3D a->u8[index]; + result.VsrB(i) =3D a->VsrB(index); } else { - result.u8[i] =3D b->u8[index]; + result.VsrB(i) =3D b->VsrB(index); } } *r =3D result; @@ -1882,25 +1866,14 @@ void helper_vsldoi(ppc_avr_t *r, ppc_avr_t *a, ppc_= avr_t *b, uint32_t shift) int i; ppc_avr_t result; =20 -#if defined(HOST_WORDS_BIGENDIAN) for (i =3D 0; i < ARRAY_SIZE(r->u8); i++) { int index =3D sh + i; if (index > 0xf) { - result.u8[i] =3D b->u8[index - 0x10]; - } else { - result.u8[i] =3D a->u8[index]; - } - } -#else - for (i =3D 0; i < ARRAY_SIZE(r->u8); i++) { - int index =3D (16 - sh) + i; - if (index > 0xf) { - result.u8[i] =3D a->u8[index - 0x10]; + result.VsrB(i) =3D b->VsrB(index - 0x10); } else { - result.u8[i] =3D b->u8[index]; + result.VsrB(i) =3D a->VsrB(index); } } -#endif *r =3D result; } =20 @@ -1919,25 +1892,20 @@ void helper_vslo(ppc_avr_t *r, ppc_avr_t *a, ppc_av= r_t *b) =20 /* Experimental testing shows that hardware masks the immediate. */ #define _SPLAT_MASKED(element) (splat & (ARRAY_SIZE(r->element) - 1)) -#if defined(HOST_WORDS_BIGENDIAN) #define SPLAT_ELEMENT(element) _SPLAT_MASKED(element) -#else -#define SPLAT_ELEMENT(element) \ - (ARRAY_SIZE(r->element) - 1 - _SPLAT_MASKED(element)) -#endif -#define VSPLT(suffix, element) \ +#define VSPLT(suffix, element, access) \ void helper_vsplt##suffix(ppc_avr_t *r, ppc_avr_t *b, uint32_t splat) \ { \ - uint32_t s =3D b->element[SPLAT_ELEMENT(element)]; \ + uint32_t s =3D b->access(SPLAT_ELEMENT(element)); \ int i; \ \ for (i =3D 0; i < ARRAY_SIZE(r->element); i++) { \ - r->element[i] =3D s; \ + r->access(i) =3D s; \ } \ } -VSPLT(b, u8) -VSPLT(h, u16) -VSPLT(w, u32) +VSPLT(b, u8, VsrB) +VSPLT(h, u16, VsrH) +VSPLT(w, u32, VsrW) #undef VSPLT #undef SPLAT_ELEMENT #undef _SPLAT_MASKED @@ -1998,17 +1966,10 @@ void helper_xxextractuw(CPUPPCState *env, target_ul= ong xtn, getVSR(xbn, &xb, env); memset(&xt, 0, sizeof(xt)); =20 -#if defined(HOST_WORDS_BIGENDIAN) ext_index =3D index; for (i =3D 0; i < es; i++, ext_index++) { - xt.u8[8 - es + i] =3D xb.u8[ext_index % 16]; - } -#else - ext_index =3D 15 - index; - for (i =3D es - 1; i >=3D 0; i--, ext_index--) { - xt.u8[8 + i] =3D xb.u8[ext_index % 16]; + xt.VsrB(8 - es + i) =3D xb.VsrB(ext_index % 16); } -#endif =20 putVSR(xtn, &xt, env); } @@ -2023,46 +1984,39 @@ void helper_xxinsertw(CPUPPCState *env, target_ulon= g xtn, getVSR(xbn, &xb, env); getVSR(xtn, &xt, env); =20 -#if defined(HOST_WORDS_BIGENDIAN) ins_index =3D index; for (i =3D 0; i < es && ins_index < 16; i++, ins_index++) { - xt.u8[ins_index] =3D xb.u8[8 - es + i]; - } -#else - ins_index =3D 15 - index; - for (i =3D es - 1; i >=3D 0 && ins_index >=3D 0; i--, ins_index--) { - xt.u8[ins_index] =3D xb.u8[8 + i]; + xt.VsrB(ins_index) =3D xb.VsrB(8 - es + i); } -#endif =20 putVSR(xtn, &xt, env); } =20 -#define VEXT_SIGNED(name, element, mask, cast, recast) \ +#define VEXT_SIGNED(name, element, access, mask, cast, recast) \ void helper_##name(ppc_avr_t *r, ppc_avr_t *b) \ { \ int i; \ - VECTOR_FOR_INORDER_I(i, element) { \ - r->element[i] =3D (recast)((cast)(b->element[i] & mask)); \ + for (i =3D 0; i < ARRAY_SIZE(r->element); i++) { \ + r->access(i) =3D (recast)((cast)(b->access(i) & mask)); \ } \ } -VEXT_SIGNED(vextsb2w, s32, UINT8_MAX, int8_t, int32_t) -VEXT_SIGNED(vextsb2d, s64, UINT8_MAX, int8_t, int64_t) -VEXT_SIGNED(vextsh2w, s32, UINT16_MAX, int16_t, int32_t) -VEXT_SIGNED(vextsh2d, s64, UINT16_MAX, int16_t, int64_t) -VEXT_SIGNED(vextsw2d, s64, UINT32_MAX, int32_t, int64_t) +VEXT_SIGNED(vextsb2w, s32, VsrSW, UINT8_MAX, int8_t, int32_t) +VEXT_SIGNED(vextsb2d, s64, VsrSD, UINT8_MAX, int8_t, int64_t) +VEXT_SIGNED(vextsh2w, s32, VsrSW, UINT16_MAX, int16_t, int32_t) +VEXT_SIGNED(vextsh2d, s64, VsrSD, UINT16_MAX, int16_t, int64_t) +VEXT_SIGNED(vextsw2d, s64, VsrSD, UINT32_MAX, int32_t, int64_t) #undef VEXT_SIGNED =20 -#define VNEG(name, element) \ +#define VNEG(name, element, access) \ void helper_##name(ppc_avr_t *r, ppc_avr_t *b) \ { \ int i; \ - VECTOR_FOR_INORDER_I(i, element) { \ - r->element[i] =3D -b->element[i]; \ + for (i =3D 0; i < ARRAY_SIZE(r->element); i++) { \ + r->access(i) =3D -b->access(i); \ } \ } -VNEG(vnegw, s32) -VNEG(vnegd, s64) +VNEG(vnegw, s32, VsrSW) +VNEG(vnegd, s64, VsrSD) #undef VNEG =20 #define VSPLTI(suffix, element, splat_type) \ @@ -2129,17 +2083,13 @@ void helper_vsumsws(CPUPPCState *env, ppc_avr_t *r,= ppc_avr_t *a, ppc_avr_t *b) ppc_avr_t result; int sat =3D 0; =20 -#if defined(HOST_WORDS_BIGENDIAN) - upper =3D ARRAY_SIZE(r->s32)-1; -#else - upper =3D 0; -#endif - t =3D (int64_t)b->s32[upper]; + upper =3D ARRAY_SIZE(r->s32) - 1; + t =3D (int64_t)b->VsrSW(upper); for (i =3D 0; i < ARRAY_SIZE(r->s32); i++) { - t +=3D a->s32[i]; - result.s32[i] =3D 0; + t +=3D a->VsrSW(i); + result.VsrSW(i) =3D 0; } - result.s32[upper] =3D cvtsdsw(t, &sat); + result.VsrSW(upper) =3D cvtsdsw(t, &sat); *r =3D result; =20 if (sat) { @@ -2153,19 +2103,15 @@ void helper_vsum2sws(CPUPPCState *env, ppc_avr_t *r= , ppc_avr_t *a, ppc_avr_t *b) ppc_avr_t result; int sat =3D 0; =20 -#if defined(HOST_WORDS_BIGENDIAN) upper =3D 1; -#else - upper =3D 0; -#endif for (i =3D 0; i < ARRAY_SIZE(r->u64); i++) { - int64_t t =3D (int64_t)b->s32[upper + i * 2]; + int64_t t =3D (int64_t)b->VsrSW(upper + i * 2); =20 - result.u64[i] =3D 0; + result.VsrW(i) =3D 0; for (j =3D 0; j < ARRAY_SIZE(r->u64); j++) { - t +=3D a->s32[2 * i + j]; + t +=3D a->VsrSW(2 * i + j); } - result.s32[upper + i * 2] =3D cvtsdsw(t, &sat); + result.VsrSW(upper + i * 2) =3D cvtsdsw(t, &sat); } =20 *r =3D result; @@ -2285,13 +2231,13 @@ VUPK(lsw, s64, s32, UPKLO) #undef UPKHI #undef UPKLO =20 -#define VGENERIC_DO(name, element) \ +#define VGENERIC_DO(name, element, access) \ void helper_v##name(ppc_avr_t *r, ppc_avr_t *b) \ { \ int i; \ \ - VECTOR_FOR_INORDER_I(i, element) { \ - r->element[i] =3D name(b->element[i]); \ + for (i =3D 0; i < ARRAY_SIZE(r->element); i++) { \ + r->access(i) =3D name(b->access(i)); \ } \ } =20 @@ -2300,10 +2246,10 @@ VUPK(lsw, s64, s32, UPKLO) #define clzw(v) clz32((v)) #define clzd(v) clz64((v)) =20 -VGENERIC_DO(clzb, u8) -VGENERIC_DO(clzh, u16) -VGENERIC_DO(clzw, u32) -VGENERIC_DO(clzd, u64) +VGENERIC_DO(clzb, u8, VsrB) +VGENERIC_DO(clzh, u16, VsrH) +VGENERIC_DO(clzw, u32, VsrW) +VGENERIC_DO(clzd, u64, VsrD) =20 #undef clzb #undef clzh @@ -2315,10 +2261,10 @@ VGENERIC_DO(clzd, u64) #define ctzw(v) ctz32((v)) #define ctzd(v) ctz64((v)) =20 -VGENERIC_DO(ctzb, u8) -VGENERIC_DO(ctzh, u16) -VGENERIC_DO(ctzw, u32) -VGENERIC_DO(ctzd, u64) +VGENERIC_DO(ctzb, u8, VsrB) +VGENERIC_DO(ctzh, u16, VsrH) +VGENERIC_DO(ctzw, u32, VsrW) +VGENERIC_DO(ctzd, u64, VsrD) =20 #undef ctzb #undef ctzh @@ -2330,10 +2276,10 @@ VGENERIC_DO(ctzd, u64) #define popcntw(v) ctpop32(v) #define popcntd(v) ctpop64(v) =20 -VGENERIC_DO(popcntb, u8) -VGENERIC_DO(popcnth, u16) -VGENERIC_DO(popcntw, u32) -VGENERIC_DO(popcntd, u64) +VGENERIC_DO(popcntb, u8, VsrB) +VGENERIC_DO(popcnth, u16, VsrH) +VGENERIC_DO(popcntw, u32, VsrW) +VGENERIC_DO(popcntd, u64, VsrD) =20 #undef popcntb #undef popcnth @@ -2630,20 +2576,12 @@ static int bcd_cmp_zero(ppc_avr_t *bcd) =20 static uint16_t get_national_digit(ppc_avr_t *reg, int n) { -#if defined(HOST_WORDS_BIGENDIAN) - return reg->u16[7 - n]; -#else - return reg->u16[n]; -#endif + return reg->VsrH(7 - n); } =20 static void set_national_digit(ppc_avr_t *reg, uint8_t val, int n) { -#if defined(HOST_WORDS_BIGENDIAN) - reg->u16[7 - n] =3D val; -#else - reg->u16[n] =3D val; -#endif + reg->VsrH(7 - n) =3D val; } =20 static int bcd_cmp_mag(ppc_avr_t *a, ppc_avr_t *b) @@ -3395,14 +3333,11 @@ void helper_vpermxor(ppc_avr_t *r, ppc_avr_t *a, p= pc_avr_t *b, ppc_avr_t *c) ppc_avr_t result; int i; =20 - VECTOR_FOR_INORDER_I(i, u8) { - int indexA =3D c->u8[i] >> 4; - int indexB =3D c->u8[i] & 0xF; -#if defined(HOST_WORDS_BIGENDIAN) - result.u8[i] =3D a->u8[indexA] ^ b->u8[indexB]; -#else - result.u8[i] =3D a->u8[15-indexA] ^ b->u8[15-indexB]; -#endif + for (i =3D 0; i < ARRAY_SIZE(r->u8); i++) { + int indexA =3D c->VsrB(i) >> 4; + int indexB =3D c->VsrB(i) & 0xF; + + result.VsrB(i) =3D a->VsrB(indexA) ^ b->VsrB(indexB); } *r =3D result; } --=20 2.11.0