All of lore.kernel.org
 help / color / mirror / Atom feed
From: Nathan Froyd <froydnj@codesourcery.com>
To: qemu-devel@nongnu.org
Subject: Re: [Qemu-devel] [PATCH 08/40] Add vcmpequ{b, h, w} and vcmpgt{s, u}{b, h, w} instructions.
Date: Wed, 7 Jan 2009 13:23:10 -0800	[thread overview]
Message-ID: <20090107212310.GC28711@codesourcery.com> (raw)
In-Reply-To: <20090103140214.GK8871@hall.aurel32.net>

On Sat, Jan 03, 2009 at 03:02:14PM +0100, Aurelien Jarno wrote:
> On Tue, Dec 30, 2008 at 07:09:50PM -0800, Nathan Froyd wrote:
> > +#define VCMP(suffix, compare, element)                                  \
> > +    uint32_t helper_vcmp##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
> > +    {                                                                   \
> > +        uint32_t ones = (sizeof (a->element[0]) == 4                    \
> > +                         ? 0xffffffff                                   \
> > +                         : (sizeof (a->element[0]) == 2                 \
> > +                            ? 0xffff                                    \
> > +                            : 0xff));                                   \
> > +        uint32_t all = ones;                                            \
> > +        uint32_t none = 0;                                              \
> > +        int i;                                                          \
> > +        for (i = 0; i < ARRAY_SIZE(r->element); i++) {                  \
> > +            uint32_t result = (a->element[i] compare b->element[i] ? ones : 0x0); \
> > +            switch (sizeof (a->element[0])) {                           \
> > +            case 4: r->u32[i] = result; break;                          \
> > +            case 2: r->u16[i] = result; break;                          \
> > +            case 1: r->u8[i] = result; break;                           \
> > +            }                                                           \
> > +            all &= result;                                              \
> > +            none |= result;                                             \
> > +        }                                                               \
> 
> The part defining the ones looks a bit complicated. You may want to
> define result as int32_t, and put either -1 or 0. Then you can just cast
> the value:
>                case 4: r->u32[i] = (int32_t)result; break;
>                case 2: r->u16[i] = (int16_t)result; break;
>                case 1: r->u8[i] = (int8_t)result; break;

Done (or something close to it) thusly.

-Nathan

Create separate helpers for record and non-recording versions.

Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
---
 target-ppc/helper.h    |   18 ++++++++++++++++++
 target-ppc/op_helper.c |   36 ++++++++++++++++++++++++++++++++++++
 target-ppc/translate.c |   10 ++++++++++
 3 files changed, 64 insertions(+), 0 deletions(-)

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index f319fdb..bae137b 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -123,6 +123,24 @@ DEF_HELPER_3(vminuw, void, avr, avr, avr)
 DEF_HELPER_3(vmaxub, void, avr, avr, avr)
 DEF_HELPER_3(vmaxuh, void, avr, avr, avr)
 DEF_HELPER_3(vmaxuw, void, avr, avr, avr)
+DEF_HELPER_3(vcmpequb, void, avr, avr, avr)
+DEF_HELPER_3(vcmpequh, void, avr, avr, avr)
+DEF_HELPER_3(vcmpequw, void, avr, avr, avr)
+DEF_HELPER_3(vcmpgtub, void, avr, avr, avr)
+DEF_HELPER_3(vcmpgtuh, void, avr, avr, avr)
+DEF_HELPER_3(vcmpgtuw, void, avr, avr, avr)
+DEF_HELPER_3(vcmpgtsb, void, avr, avr, avr)
+DEF_HELPER_3(vcmpgtsh, void, avr, avr, avr)
+DEF_HELPER_3(vcmpgtsw, void, avr, avr, avr)
+DEF_HELPER_3(vcmpequb_dot, void, avr, avr, avr)
+DEF_HELPER_3(vcmpequh_dot, void, avr, avr, avr)
+DEF_HELPER_3(vcmpequw_dot, void, avr, avr, avr)
+DEF_HELPER_3(vcmpgtub_dot, void, avr, avr, avr)
+DEF_HELPER_3(vcmpgtuh_dot, void, avr, avr, avr)
+DEF_HELPER_3(vcmpgtuw_dot, void, avr, avr, avr)
+DEF_HELPER_3(vcmpgtsb_dot, void, avr, avr, avr)
+DEF_HELPER_3(vcmpgtsh_dot, void, avr, avr, avr)
+DEF_HELPER_3(vcmpgtsw_dot, void, avr, avr, avr)
 DEF_HELPER_3(vmrglb, void, avr, avr, avr)
 DEF_HELPER_3(vmrglh, void, avr, avr, avr)
 DEF_HELPER_3(vmrglw, void, avr, avr, avr)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 5e40e42..eb155aa 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2101,6 +2101,42 @@ VAVG(w, s32, int64_t, u32, uint64_t)
 #undef VAVG_DO
 #undef VAVG
 
+#define VCMP_DO(suffix, compare, element, record)                       \
+    void helper_vcmp##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b) \
+    {                                                                   \
+        uint32_t ones = (uint32_t)-1;                                   \
+        uint32_t all = ones;                                            \
+        uint32_t none = 0;                                              \
+        int i;                                                          \
+        for (i = 0; i < ARRAY_SIZE(r->element); i++) {                  \
+            uint32_t result = (a->element[i] compare b->element[i] ? ones : 0x0); \
+            switch (sizeof (a->element[0])) {                           \
+            case 4: r->u32[i] = result; break;                          \
+            case 2: r->u16[i] = result; break;                          \
+            case 1: r->u8[i] = result; break;                           \
+            }                                                           \
+            all &= result;                                              \
+            none |= result;                                             \
+        }                                                               \
+        if (record) {                                                   \
+            env->crf[6] = ((all != 0) << 3) | ((none == 0) << 1);       \
+        }                                                               \
+    }
+#define VCMP(suffix, compare, element)          \
+    VCMP_DO(suffix, compare, element, 0)        \
+    VCMP_DO(suffix##_dot, compare, element, 1)
+VCMP(equb, ==, u8)
+VCMP(equh, ==, u16)
+VCMP(equw, ==, u32)
+VCMP(gtub, >, u8)
+VCMP(gtuh, >, u16)
+VCMP(gtuw, >, u32)
+VCMP(gtsb, >, s8)
+VCMP(gtsh, >, s16)
+VCMP(gtsw, >, s32)
+#undef VCMP_DO
+#undef VCMP
+
 void helper_vmhaddshs (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
 {
     int sat = 0;
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index ee3c747..20e9e0c 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6380,6 +6380,16 @@ GEN_VXFORM(vsumsws, 4, 30);
     GEN_VXRFORM1(name, name, #name, opc2, opc3)                      \
     GEN_VXRFORM1(name##_dot, name##_, #name ".", opc2, (opc3 | (0x1 << 4)))
 
+GEN_VXRFORM(vcmpequb, 3, 0)
+GEN_VXRFORM(vcmpequh, 3, 1)
+GEN_VXRFORM(vcmpequw, 3, 2)
+GEN_VXRFORM(vcmpgtsb, 3, 12)
+GEN_VXRFORM(vcmpgtsh, 3, 13)
+GEN_VXRFORM(vcmpgtsw, 3, 14)
+GEN_VXRFORM(vcmpgtub, 3, 8)
+GEN_VXRFORM(vcmpgtuh, 3, 9)
+GEN_VXRFORM(vcmpgtuw, 3, 10)
+
 #define GEN_VXFORM_NOA(name, opc2, opc3)                                \
     GEN_HANDLER(name, 0x04, opc2, opc3, 0x001f0000, PPC_ALTIVEC)        \
     {                                                                   \
-- 
1.6.0.5

  reply	other threads:[~2009-01-07 21:23 UTC|newest]

Thread overview: 68+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
2008-12-31  3:09 ` [Qemu-devel] [PATCH 01/40] Fix TCG error in gen_avr_ptr Nathan Froyd
2009-01-03 13:31   ` Aurelien Jarno
2008-12-31  3:09 ` [Qemu-devel] [PATCH 02/40] Add helper macros for later patches Nathan Froyd
2009-01-03 13:32   ` Aurelien Jarno
2008-12-31  3:09 ` [Qemu-devel] [PATCH 03/40] Add GEN_VXFORM macro for subsequent instructions Nathan Froyd
2009-01-03 13:32   ` Aurelien Jarno
2008-12-31  3:09 ` [Qemu-devel] [PATCH 04/40] Add v{add,sub}u{b,h,w}m instructions Nathan Froyd
2009-01-03 13:33   ` Aurelien Jarno
2008-12-31  3:09 ` [Qemu-devel] [PATCH 05/40] Add vavg{s,u}{b,h,w} instructions Nathan Froyd
2009-01-03 13:33   ` Aurelien Jarno
2008-12-31  3:09 ` [Qemu-devel] [PATCH 06/40] Add v{min, max}{s, u}{b, h, w} instructions Nathan Froyd
2009-01-03 13:33   ` Aurelien Jarno
2008-12-31  3:09 ` [Qemu-devel] [PATCH 07/40] Add GEN_VXRFORM{, 1} macros for subsequent instructions Nathan Froyd
2009-01-03 13:58   ` Aurelien Jarno
2009-01-07 21:22     ` Nathan Froyd
2009-01-08 18:55       ` Aurelien Jarno
2008-12-31  3:09 ` [Qemu-devel] [PATCH 08/40] Add vcmpequ{b, h, w} and vcmpgt{s, u}{b, h, w} instructions Nathan Froyd
2009-01-03 14:02   ` Aurelien Jarno
2009-01-07 21:23     ` Nathan Froyd [this message]
2009-01-08 18:56       ` Aurelien Jarno
2008-12-31  3:09 ` [Qemu-devel] [PATCH 09/40] Add vscr access macros Nathan Froyd
2009-01-03 14:04   ` Aurelien Jarno
2008-12-31  3:09 ` [Qemu-devel] [PATCH 10/40] Add vmrg{l,h}{b,h,w} instructions Nathan Froyd
2008-12-31  3:09 ` [Qemu-devel] [PATCH 11/40] Add vmul{e,o}{s,u}{b,h} instructions Nathan Froyd
2008-12-31  3:09 ` [Qemu-devel] [PATCH 12/40] Add vsr{,a}{b,h,w} instructions Nathan Froyd
2008-12-31  3:09 ` [Qemu-devel] [PATCH 13/40] Add vsl{b,h,w} instructions Nathan Froyd
2008-12-31  3:09 ` [Qemu-devel] [PATCH 14/40] Add vs{l,r}o instructions Nathan Froyd
2008-12-31  3:09 ` [Qemu-devel] [PATCH 15/40] Add v{add,sub}cuw instructions Nathan Froyd
2008-12-31  3:09 ` [Qemu-devel] [PATCH 16/40] Add lvs{l,r} instructions Nathan Froyd
2008-12-31  3:09 ` [Qemu-devel] [PATCH 17/40] Add m{f,t}vscr instructions Nathan Froyd
2009-01-03 19:43   ` Aurelien Jarno
2008-12-31  3:10 ` [Qemu-devel] [PATCH 18/40] Add v{add, sub}{s, u}{b, h, w}s instructions Nathan Froyd
2009-01-03 21:13   ` Aurelien Jarno
2009-01-07 21:24     ` Nathan Froyd
2009-01-08 23:19       ` Aurelien Jarno
2008-12-31  3:10 ` [Qemu-devel] [PATCH 19/40] Add vrl{b,h,w} instructions Nathan Froyd
2008-12-31  3:10 ` [Qemu-devel] [PATCH 20/40] Add vs{l,r} instructions Nathan Froyd
2009-01-03 21:26   ` Aurelien Jarno
2009-01-05 18:29     ` Nathan Froyd
2009-01-05 19:27       ` Aurelien Jarno
2009-01-07 21:25         ` Nathan Froyd
2009-01-08 18:56           ` Aurelien Jarno
2008-12-31  3:10 ` [Qemu-devel] [PATCH 21/40] Add vsldoi instruction Nathan Froyd
2008-12-31  3:10 ` [Qemu-devel] [PATCH 22/40] Add GEN_VXFORM_SIMM macro for subsequent instructions Nathan Froyd
2008-12-31  3:10 ` [Qemu-devel] [PATCH 23/40] Add vspltis{b,h,w} instructions Nathan Froyd
2009-01-03 21:43   ` Aurelien Jarno
2009-01-07 21:25     ` Nathan Froyd
2009-01-08 18:57       ` Aurelien Jarno
2008-12-31  3:10 ` [Qemu-devel] [PATCH 24/40] Add GEN_VXFORM_UIMM macro for subsequent instructions Nathan Froyd
2008-12-31  3:10 ` [Qemu-devel] [PATCH 25/40] Add vsplt{b,h,w} instructions Nathan Froyd
2008-12-31  3:10 ` [Qemu-devel] [PATCH 26/40] Add GEN_VXFORM_NOA macro for subsequent instructions Nathan Froyd
2008-12-31  3:10 ` [Qemu-devel] [PATCH 27/40] Add vupk{h,l}px instructions Nathan Froyd
2008-12-31  3:10 ` [Qemu-devel] [PATCH 28/40] Add vupk{h,l}s{b,h} instructions Nathan Froyd
2008-12-31  3:10 ` [Qemu-devel] [PATCH 29/40] Add GEN_VAFORM_PAIRED macro for subsequent instructions Nathan Froyd
2008-12-31  3:10 ` [Qemu-devel] [PATCH 30/40] Add vmsum{u,m}bm instructions Nathan Froyd
2008-12-31  3:10 ` [Qemu-devel] [PATCH 31/40] Add vsel and vperm instructions Nathan Froyd
2008-12-31  3:10 ` [Qemu-devel] [PATCH 32/40] Add saturating arithmetic conversion functions for subsequent instructions Nathan Froyd
2008-12-31  3:10 ` [Qemu-devel] [PATCH 33/40] Add vpks{h, w}{s, u}s, vpku{h, w}us, and vpku{h, w}um instructions Nathan Froyd
2008-12-31  3:10 ` [Qemu-devel] [PATCH 34/40] Add vpkpx instruction Nathan Froyd
2008-12-31  3:10 ` [Qemu-devel] [PATCH 35/40] Add vmh{,r}addshs instructions Nathan Froyd
2008-12-31  3:10 ` [Qemu-devel] [PATCH 36/40] Add vmsumuh{m,s} instructions Nathan Froyd
2008-12-31  3:10 ` [Qemu-devel] [PATCH 37/40] Add vmsumsh{m,s} instructions Nathan Froyd
2008-12-31  3:10 ` [Qemu-devel] [PATCH 38/40] Add vmladduhm instruction Nathan Froyd
2008-12-31  3:10 ` [Qemu-devel] [PATCH 39/40] Add {l,st}ve{b,h,w}x instructions Nathan Froyd
2008-12-31  3:10 ` [Qemu-devel] [PATCH 40/40] Add vsumsws, vsum2sws, and vsum4{sbs, shs, ubs} instructions Nathan Froyd
2009-01-04 22:20 ` [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Aurelien Jarno
2009-01-04 22:54   ` Aurelien Jarno

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20090107212310.GC28711@codesourcery.com \
    --to=froydnj@codesourcery.com \
    --cc=qemu-devel@nongnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.