qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
* [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2
@ 2008-12-31  3:09 Nathan Froyd
  2008-12-31  3:09 ` [Qemu-devel] [PATCH 01/40] Fix TCG error in gen_avr_ptr Nathan Froyd
                   ` (40 more replies)
  0 siblings, 41 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:09 UTC (permalink / raw)
  To: qemu-devel

This is a follow-on to:

  http://lists.gnu.org/archive/html/qemu-devel/2008-12/msg01000.html

as Aurelien asked me to modify the notation for defining instructions in
target-ppc/translate.c.  Since that change touched nearly every patch in
the series, I figured I would also take the opportunity to eliminate the
VECTOR_FOR macros that my patch used as well.  I also fixed up various
TCG errors that turned up under DEBUG_TCG.

I did, however, leave the VECTOR_FOR_INORDER_I macros in place; I think
they are the clearest way to indicate that vectors are being iterated
over in target-endian order.  Better than `#if defined(WORDS_BIGENDIAN)'
all over the code, IMHO.

As the message in:

  http://lists.gnu.org/archive/html/qemu-devel/2008-12/msg01106.html

indicated, m{f,t}vscr seems to be broken in some way; the code looks
correct to me, but I can't seem to puzzle out what's wrong with it.  All
other instructions have been tested against an Altivec hardware
implementation.  Except for the VSCR issue above, the simulated
instructions perform identically to their hardware-implemented versions.

-Nathan

^ permalink raw reply	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 01/40] Fix TCG error in gen_avr_ptr.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
@ 2008-12-31  3:09 ` 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
                   ` (39 subsequent siblings)
  40 siblings, 1 reply; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:09 UTC (permalink / raw)
  To: qemu-devel


Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
---
 target-ppc/translate.c |    2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 80a08b1..7ba9c26 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6085,7 +6085,7 @@ GEN_HANDLER2(icbt_440, "icbt", 0x1F, 0x16, 0x00, 0x03E00001, PPC_BOOKE)
 
 static always_inline TCGv_ptr gen_avr_ptr(int reg)
 {
-    TCGv_ptr r = tcg_temp_new();
+    TCGv_ptr r = tcg_temp_new_ptr();
     tcg_gen_addi_ptr(r, cpu_env, offsetof(CPUPPCState, avr[reg]));
     return r;
 }
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 02/40] Add helper macros for later patches.
  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
@ 2008-12-31  3:09 ` 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
                   ` (38 subsequent siblings)
  40 siblings, 1 reply; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:09 UTC (permalink / raw)
  To: qemu-devel

Remove N_ELEMS, VECTOR_FOR, and VECTOR_FOR_I macros.  Retain the
VECTOR_FOR_INORDER_I macros as the clearest way of expressing the intent
of iterating over elements in their stored target-endian order.

Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
---
 target-ppc/op_helper.c |   22 ++++++++++++++++++++++
 1 files changed, 22 insertions(+), 0 deletions(-)

diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 876b517..5d603ba 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -1954,6 +1954,28 @@ target_ulong helper_dlmzb (target_ulong high, target_ulong low, uint32_t update_
 }
 
 /*****************************************************************************/
+/* Altivec extension helpers */
+#if defined(WORDS_BIGENDIAN)
+#define HI_IDX 0
+#define LO_IDX 1
+#else
+#define HI_IDX 1
+#define LO_IDX 0
+#endif
+
+#if defined(WORDS_BIGENDIAN)
+#define VECTOR_FOR_INORDER_I(index, element)            \
+    for (index = 0; index < ARRAY_SIZE(r->element); index++)
+#else
+#define VECTOR_FOR_INORDER_I(index, element)            \
+  for (index = ARRAY_SIZE(r->element)-1; index >= 0; index--)
+#endif
+
+#undef VECTOR_FOR_INORDER_I
+#undef HI_IDX
+#undef LO_IDX
+
+/*****************************************************************************/
 /* SPE extension helpers */
 /* Use a table to make this quicker */
 static uint8_t hbrev[16] = {
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 03/40] Add GEN_VXFORM macro for subsequent instructions.
  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
  2008-12-31  3:09 ` [Qemu-devel] [PATCH 02/40] Add helper macros for later patches Nathan Froyd
@ 2008-12-31  3:09 ` 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
                   ` (37 subsequent siblings)
  40 siblings, 1 reply; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:09 UTC (permalink / raw)
  To: qemu-devel


Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
---
 target-ppc/translate.c |   17 +++++++++++++++++
 1 files changed, 17 insertions(+), 0 deletions(-)

diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 7ba9c26..4ae780b 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6164,6 +6164,23 @@ GEN_VX_LOGICAL(vor, tcg_gen_or_i64, 2, 18);
 GEN_VX_LOGICAL(vxor, tcg_gen_xor_i64, 2, 19);
 GEN_VX_LOGICAL(vnor, tcg_gen_nor_i64, 2, 20);
 
+#define GEN_VXFORM(name, opc2, opc3)                                    \
+GEN_HANDLER(name, 0x04, opc2, opc3, 0x00000000, PPC_ALTIVEC)            \
+{                                                                       \
+    TCGv_ptr ra, rb, rd;                                                \
+    if (unlikely(!ctx->altivec_enabled)) {                              \
+        gen_exception(ctx, POWERPC_EXCP_VPU);                           \
+        return;                                                         \
+    }                                                                   \
+    ra = gen_avr_ptr(rA(ctx->opcode));                                  \
+    rb = gen_avr_ptr(rB(ctx->opcode));                                  \
+    rd = gen_avr_ptr(rD(ctx->opcode));                                  \
+    gen_helper_##name (rd, ra, rb);                                     \
+    tcg_temp_free_ptr(ra);                                              \
+    tcg_temp_free_ptr(rb);                                              \
+    tcg_temp_free_ptr(rd);                                              \
+}
+
 /***                           SPE extension                               ***/
 /* Register moves */
 
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 04/40] Add v{add,sub}u{b,h,w}m instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (2 preceding siblings ...)
  2008-12-31  3:09 ` [Qemu-devel] [PATCH 03/40] Add GEN_VXFORM macro for subsequent instructions Nathan Froyd
@ 2008-12-31  3:09 ` 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
                   ` (36 subsequent siblings)
  40 siblings, 1 reply; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:09 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index 6b5728c..e69fceb 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -96,6 +96,15 @@ DEF_HELPER_1(fres, i64, i64)
 DEF_HELPER_1(frsqrte, i64, i64)
 DEF_HELPER_3(fsel, i64, i64, i64, i64)
 
+#define dh_alias_avr ptr
+#define dh_ctype_avr ppc_avr_t *
+
+DEF_HELPER_3(vaddubm, void, avr, avr, avr)
+DEF_HELPER_3(vadduhm, void, avr, avr, avr)
+DEF_HELPER_3(vadduwm, void, avr, avr, avr)
+DEF_HELPER_3(vsububm, void, avr, avr, avr)
+DEF_HELPER_3(vsubuhm, void, avr, avr, avr)
+DEF_HELPER_3(vsubuwm, void, avr, avr, avr)
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
 DEF_HELPER_1(efscfuf, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 5d603ba..6d4bd1e 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -1971,6 +1971,23 @@ target_ulong helper_dlmzb (target_ulong high, target_ulong low, uint32_t update_
   for (index = ARRAY_SIZE(r->element)-1; index >= 0; index--)
 #endif
 
+#define VARITH_DO(name, op, element)        \
+void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)          \
+{                                                                       \
+    int i;                                                              \
+    for (i = 0; i < ARRAY_SIZE(r->element); i++) {                      \
+        r->element[i] = a->element[i] op b->element[i];                 \
+    }                                                                   \
+}
+#define VARITH(suffix, element)                  \
+  VARITH_DO(add##suffix, +, element)             \
+  VARITH_DO(sub##suffix, -, element)
+VARITH(ubm, u8)
+VARITH(uhm, u16)
+VARITH(uwm, u32)
+#undef VARITH_DO
+#undef VARITH
+
 #undef VECTOR_FOR_INORDER_I
 #undef HI_IDX
 #undef LO_IDX
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 4ae780b..a35ff1a 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6181,6 +6181,12 @@ GEN_HANDLER(name, 0x04, opc2, opc3, 0x00000000, PPC_ALTIVEC)            \
     tcg_temp_free_ptr(rd);                                              \
 }
 
+GEN_VXFORM(vaddubm, 0, 0);
+GEN_VXFORM(vadduhm, 0, 1);
+GEN_VXFORM(vadduwm, 0, 2);
+GEN_VXFORM(vsububm, 0, 16);
+GEN_VXFORM(vsubuhm, 0, 17);
+GEN_VXFORM(vsubuwm, 0, 18);
 /***                           SPE extension                               ***/
 /* Register moves */
 
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 05/40] Add vavg{s,u}{b,h,w} instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (3 preceding siblings ...)
  2008-12-31  3:09 ` [Qemu-devel] [PATCH 04/40] Add v{add,sub}u{b,h,w}m instructions Nathan Froyd
@ 2008-12-31  3:09 ` 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
                   ` (35 subsequent siblings)
  40 siblings, 1 reply; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:09 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index e69fceb..214bbf1 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -105,6 +105,13 @@ DEF_HELPER_3(vadduwm, void, avr, avr, avr)
 DEF_HELPER_3(vsububm, void, avr, avr, avr)
 DEF_HELPER_3(vsubuhm, void, avr, avr, avr)
 DEF_HELPER_3(vsubuwm, void, avr, avr, avr)
+DEF_HELPER_3(vavgub, void, avr, avr, avr)
+DEF_HELPER_3(vavguh, void, avr, avr, avr)
+DEF_HELPER_3(vavguw, void, avr, avr, avr)
+DEF_HELPER_3(vavgsb, void, avr, avr, avr)
+DEF_HELPER_3(vavgsh, void, avr, avr, avr)
+DEF_HELPER_3(vavgsw, void, avr, avr, avr)
+
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
 DEF_HELPER_1(efscfuf, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 6d4bd1e..8f2508f 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -1988,6 +1988,25 @@ VARITH(uwm, u32)
 #undef VARITH_DO
 #undef VARITH
 
+#define VAVG_DO(name, element, etype)                                   \
+    void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)      \
+    {                                                                   \
+        int i;                                                          \
+        for (i = 0; i < ARRAY_SIZE(r->element); i++) {                  \
+            etype x = (etype)a->element[i] + (etype)b->element[i] + 1;  \
+            r->element[i] = x >> 1;                                     \
+        }                                                               \
+    }
+
+#define VAVG(type, signed_element, signed_type, unsigned_element, unsigned_type) \
+    VAVG_DO(avgs##type, signed_element, signed_type)                    \
+    VAVG_DO(avgu##type, unsigned_element, unsigned_type)
+VAVG(b, s8, int16_t, u8, uint16_t)
+VAVG(h, s16, int32_t, u16, uint32_t)
+VAVG(w, s32, int64_t, u32, uint64_t)
+#undef VAVG_DO
+#undef VAVG
+
 #undef VECTOR_FOR_INORDER_I
 #undef HI_IDX
 #undef LO_IDX
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index a35ff1a..1ccd37e 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6187,6 +6187,13 @@ GEN_VXFORM(vadduwm, 0, 2);
 GEN_VXFORM(vsububm, 0, 16);
 GEN_VXFORM(vsubuhm, 0, 17);
 GEN_VXFORM(vsubuwm, 0, 18);
+GEN_VXFORM(vavgub, 1, 16);
+GEN_VXFORM(vavguh, 1, 17);
+GEN_VXFORM(vavguw, 1, 18);
+GEN_VXFORM(vavgsb, 1, 20);
+GEN_VXFORM(vavgsh, 1, 21);
+GEN_VXFORM(vavgsw, 1, 22);
+
 /***                           SPE extension                               ***/
 /* Register moves */
 
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 06/40] Add v{min, max}{s, u}{b, h, w} instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (4 preceding siblings ...)
  2008-12-31  3:09 ` [Qemu-devel] [PATCH 05/40] Add vavg{s,u}{b,h,w} instructions Nathan Froyd
@ 2008-12-31  3:09 ` 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
                   ` (34 subsequent siblings)
  40 siblings, 1 reply; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:09 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index 214bbf1..196106e 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -111,6 +111,18 @@ DEF_HELPER_3(vavguw, void, avr, avr, avr)
 DEF_HELPER_3(vavgsb, void, avr, avr, avr)
 DEF_HELPER_3(vavgsh, void, avr, avr, avr)
 DEF_HELPER_3(vavgsw, void, avr, avr, avr)
+DEF_HELPER_3(vminsb, void, avr, avr, avr)
+DEF_HELPER_3(vminsh, void, avr, avr, avr)
+DEF_HELPER_3(vminsw, void, avr, avr, avr)
+DEF_HELPER_3(vmaxsb, void, avr, avr, avr)
+DEF_HELPER_3(vmaxsh, void, avr, avr, avr)
+DEF_HELPER_3(vmaxsw, void, avr, avr, avr)
+DEF_HELPER_3(vminub, void, avr, avr, avr)
+DEF_HELPER_3(vminuh, void, avr, avr, avr)
+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_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 8f2508f..367c366 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2007,6 +2007,30 @@ VAVG(w, s32, int64_t, u32, uint64_t)
 #undef VAVG_DO
 #undef VAVG
 
+#define VMINMAX_DO(name, compare, element)                              \
+    void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)      \
+    {                                                                   \
+        int i;                                                          \
+        for (i = 0; i < ARRAY_SIZE(r->element); i++) {                  \
+            if (a->element[i] compare b->element[i]) {                  \
+                r->element[i] = b->element[i];                          \
+            } else {                                                    \
+                r->element[i] = a->element[i];                          \
+            }                                                           \
+        }                                                               \
+    }
+#define VMINMAX(suffix, element)                \
+  VMINMAX_DO(min##suffix, >, element)           \
+  VMINMAX_DO(max##suffix, <, element)
+VMINMAX(sb, s8)
+VMINMAX(sh, s16)
+VMINMAX(sw, s32)
+VMINMAX(ub, u8)
+VMINMAX(uh, u16)
+VMINMAX(uw, u32)
+#undef VMINMAX_DO
+#undef VMINMAX
+
 #undef VECTOR_FOR_INORDER_I
 #undef HI_IDX
 #undef LO_IDX
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 1ccd37e..56d5c51 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6187,6 +6187,18 @@ GEN_VXFORM(vadduwm, 0, 2);
 GEN_VXFORM(vsububm, 0, 16);
 GEN_VXFORM(vsubuhm, 0, 17);
 GEN_VXFORM(vsubuwm, 0, 18);
+GEN_VXFORM(vmaxub, 1, 0);
+GEN_VXFORM(vmaxuh, 1, 1);
+GEN_VXFORM(vmaxuw, 1, 2);
+GEN_VXFORM(vmaxsb, 1, 4);
+GEN_VXFORM(vmaxsh, 1, 5);
+GEN_VXFORM(vmaxsw, 1, 6);
+GEN_VXFORM(vminub, 1, 8);
+GEN_VXFORM(vminuh, 1, 9);
+GEN_VXFORM(vminuw, 1, 10);
+GEN_VXFORM(vminsb, 1, 12);
+GEN_VXFORM(vminsh, 1, 13);
+GEN_VXFORM(vminsw, 1, 14);
 GEN_VXFORM(vavgub, 1, 16);
 GEN_VXFORM(vavguh, 1, 17);
 GEN_VXFORM(vavguw, 1, 18);
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 07/40] Add GEN_VXRFORM{, 1} macros for subsequent instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (5 preceding siblings ...)
  2008-12-31  3:09 ` [Qemu-devel] [PATCH 06/40] Add v{min, max}{s, u}{b, h, w} instructions Nathan Froyd
@ 2008-12-31  3:09 ` Nathan Froyd
  2009-01-03 13:58   ` 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
                   ` (33 subsequent siblings)
  40 siblings, 1 reply; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:09 UTC (permalink / raw)
  To: qemu-devel


Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
---
 target-ppc/translate.c |   27 +++++++++++++++++++++++++++
 1 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 56d5c51..967d9da 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6206,6 +6206,33 @@ GEN_VXFORM(vavgsb, 1, 20);
 GEN_VXFORM(vavgsh, 1, 21);
 GEN_VXFORM(vavgsw, 1, 22);
 
+#define GEN_VXRFORM1(opname, name, str, opc2, opc3)                     \
+    GEN_HANDLER2(name, str, 0x4, opc2, opc3, 0x00000000, PPC_ALTIVEC)   \
+    {                                                                   \
+        TCGv_ptr ra, rb, rd;                                            \
+        TCGv_i32 result;                                                \
+        if (unlikely(!ctx->altivec_enabled)) {                          \
+            gen_exception(ctx, POWERPC_EXCP_VPU);                       \
+            return;                                                     \
+        }                                                               \
+        ra = gen_avr_ptr(rA(ctx->opcode));                              \
+        rb = gen_avr_ptr(rB(ctx->opcode));                              \
+        rd = gen_avr_ptr(rD(ctx->opcode));                              \
+        result = tcg_temp_new_i32();                                    \
+        gen_helper_##opname (result, rd, ra, rb);                       \
+        if (opc3 & 0x1) {                                               \
+            tcg_gen_mov_i32(cpu_crf[6], result);                        \
+        }                                                               \
+        tcg_temp_free_ptr(ra);                                          \
+        tcg_temp_free_ptr(rb);                                          \
+        tcg_temp_free_ptr(rd);                                          \
+        tcg_temp_free_i32(result);                                      \
+    }
+
+#define GEN_VXRFORM(name, opc2, opc3)                                \
+    GEN_VXRFORM1(name, name, #name, opc2, opc3)                      \
+    GEN_VXRFORM1(name, name##_, #name ".", opc2, (opc3 | (0x1 << 4)))
+
 /***                           SPE extension                               ***/
 /* Register moves */
 
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 08/40] Add vcmpequ{b, h, w} and vcmpgt{s, u}{b, h, w} instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (6 preceding siblings ...)
  2008-12-31  3:09 ` [Qemu-devel] [PATCH 07/40] Add GEN_VXRFORM{, 1} macros for subsequent instructions Nathan Froyd
@ 2008-12-31  3:09 ` Nathan Froyd
  2009-01-03 14:02   ` Aurelien Jarno
  2008-12-31  3:09 ` [Qemu-devel] [PATCH 09/40] Add vscr access macros Nathan Froyd
                   ` (32 subsequent siblings)
  40 siblings, 1 reply; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:09 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index 196106e..efe7a1a 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -123,6 +123,15 @@ 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, i32, avr, avr, avr)
+DEF_HELPER_3(vcmpequh, i32, avr, avr, avr)
+DEF_HELPER_3(vcmpequw, i32, avr, avr, avr)
+DEF_HELPER_3(vcmpgtub, i32, avr, avr, avr)
+DEF_HELPER_3(vcmpgtuh, i32, avr, avr, avr)
+DEF_HELPER_3(vcmpgtuw, i32, avr, avr, avr)
+DEF_HELPER_3(vcmpgtsb, i32, avr, avr, avr)
+DEF_HELPER_3(vcmpgtsh, i32, avr, avr, avr)
+DEF_HELPER_3(vcmpgtsw, i32, avr, avr, avr)
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 367c366..5daa62f 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2007,6 +2007,40 @@ VAVG(w, s32, int64_t, u32, uint64_t)
 #undef VAVG_DO
 #undef VAVG
 
+#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;                                             \
+        }                                                               \
+        return ((all != 0) << 3) | ((none == 0) << 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
+
 #define VMINMAX_DO(name, compare, element)                              \
     void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)      \
     {                                                                   \
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 967d9da..7ebdb21 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6233,6 +6233,16 @@ GEN_VXFORM(vavgsw, 1, 22);
     GEN_VXRFORM1(name, name, #name, opc2, opc3)                      \
     GEN_VXRFORM1(name, 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)
+
 /***                           SPE extension                               ***/
 /* Register moves */
 
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 09/40] Add vscr access macros.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (7 preceding siblings ...)
  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
@ 2008-12-31  3:09 ` 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
                   ` (31 subsequent siblings)
  40 siblings, 1 reply; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:09 UTC (permalink / raw)
  To: qemu-devel


Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
---
 target-ppc/cpu.h |    7 +++++++
 1 files changed, 7 insertions(+), 0 deletions(-)

diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h
index f7600c4..113bba5 100644
--- a/target-ppc/cpu.h
+++ b/target-ppc/cpu.h
@@ -525,6 +525,13 @@ enum {
                    0x1F)
 
 /*****************************************************************************/
+/* Vector status and control register */
+#define VSCR_NJ		16 /* Vector non-java */
+#define VSCR_SAT	0 /* Vector saturation */
+#define vscr_nj		(((env->vscr) >> VSCR_NJ)	& 0x1)
+#define vscr_sat	(((env->vscr) >> VSCR_SAT)	& 0x1)
+
+/*****************************************************************************/
 /* The whole PowerPC CPU context */
 #define NB_MMU_MODES 3
 
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 10/40] Add vmrg{l,h}{b,h,w} instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (8 preceding siblings ...)
  2008-12-31  3:09 ` [Qemu-devel] [PATCH 09/40] Add vscr access macros Nathan Froyd
@ 2008-12-31  3:09 ` Nathan Froyd
  2008-12-31  3:09 ` [Qemu-devel] [PATCH 11/40] Add vmul{e,o}{s,u}{b,h} instructions Nathan Froyd
                   ` (30 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:09 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index efe7a1a..5a05157 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -123,6 +123,12 @@ 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(vmrglb, void, avr, avr, avr)
+DEF_HELPER_3(vmrglh, void, avr, avr, avr)
+DEF_HELPER_3(vmrglw, void, avr, avr, avr)
+DEF_HELPER_3(vmrghb, void, avr, avr, avr)
+DEF_HELPER_3(vmrghh, void, avr, avr, avr)
+DEF_HELPER_3(vmrghw, void, avr, avr, avr)
 DEF_HELPER_3(vcmpequb, i32, avr, avr, avr)
 DEF_HELPER_3(vcmpequh, i32, avr, avr, avr)
 DEF_HELPER_3(vcmpequw, i32, avr, avr, avr)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 5daa62f..0e502bc 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2065,6 +2065,41 @@ VMINMAX(uw, u32)
 #undef VMINMAX_DO
 #undef VMINMAX
 
+#define VMRG_DO(name, element, highp)                                   \
+    void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)      \
+    {                                                                   \
+        ppc_avr_t result;                                               \
+        int i;                                                          \
+        size_t n_elems = N_ELEMS(element);                              \
+        for (i = 0; i < n_elems/2; i++) {                               \
+            if (highp) {                                                \
+                result.element[i*2+HI_IDX] = a->element[i];             \
+                result.element[i*2+LO_IDX] = b->element[i];             \
+            } else {                                                    \
+                result.element[n_elems - i*2 - (1+HI_IDX)] = b->element[n_elems - i - 1]; \
+                result.element[n_elems - i*2 - (1+LO_IDX)] = a->element[n_elems - i - 1]; \
+            }                                                           \
+        }                                                               \
+        *r = result;                                                    \
+    }
+#if defined(WORDS_BIGENDIAN)
+#define MRGHI 0
+#define MRGL0 1
+#else
+#define MRGHI 1
+#define MRGLO 0
+#endif
+#define VMRG(suffix, element)                   \
+  VMRG_DO(mrgl##suffix, element, MRGHI)         \
+  VMRG_DO(mrgh##suffix, element, MRGLO)
+VMRG(b, u8)
+VMRG(h, u16)
+VMRG(w, u32)
+#undef VMRG_DO
+#undef VMRG
+#undef MRGHI
+#undef MRGLO
+
 #undef VECTOR_FOR_INORDER_I
 #undef HI_IDX
 #undef LO_IDX
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 7ebdb21..13fccf3 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6205,6 +6205,12 @@ GEN_VXFORM(vavguw, 1, 18);
 GEN_VXFORM(vavgsb, 1, 20);
 GEN_VXFORM(vavgsh, 1, 21);
 GEN_VXFORM(vavgsw, 1, 22);
+GEN_VXFORM(vmrghb, 6, 0);
+GEN_VXFORM(vmrghh, 6, 1);
+GEN_VXFORM(vmrghw, 6, 2);
+GEN_VXFORM(vmrglb, 6, 4);
+GEN_VXFORM(vmrglh, 6, 5);
+GEN_VXFORM(vmrglw, 6, 6);
 
 #define GEN_VXRFORM1(opname, name, str, opc2, opc3)                     \
     GEN_HANDLER2(name, str, 0x4, opc2, opc3, 0x00000000, PPC_ALTIVEC)   \
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 11/40] Add vmul{e,o}{s,u}{b,h} instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (9 preceding siblings ...)
  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 ` Nathan Froyd
  2008-12-31  3:09 ` [Qemu-devel] [PATCH 12/40] Add vsr{,a}{b,h,w} instructions Nathan Froyd
                   ` (29 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:09 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index 5a05157..6b74c3d 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -138,6 +138,14 @@ DEF_HELPER_3(vcmpgtuw, i32, avr, avr, avr)
 DEF_HELPER_3(vcmpgtsb, i32, avr, avr, avr)
 DEF_HELPER_3(vcmpgtsh, i32, avr, avr, avr)
 DEF_HELPER_3(vcmpgtsw, i32, avr, avr, avr)
+DEF_HELPER_3(vmulesb, void, avr, avr, avr)
+DEF_HELPER_3(vmulesh, void, avr, avr, avr)
+DEF_HELPER_3(vmuleub, void, avr, avr, avr)
+DEF_HELPER_3(vmuleuh, void, avr, avr, avr)
+DEF_HELPER_3(vmulosb, void, avr, avr, avr)
+DEF_HELPER_3(vmulosh, void, avr, avr, avr)
+DEF_HELPER_3(vmuloub, void, avr, avr, avr)
+DEF_HELPER_3(vmulouh, void, avr, avr, avr)
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 0e502bc..ab8e15b 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2100,6 +2100,28 @@ VMRG(w, u32)
 #undef MRGHI
 #undef MRGLO
 
+#define VMUL_DO(name, mul_element, prod_element, evenp)                 \
+    void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)      \
+    {                                                                   \
+        int i;                                                          \
+        VECTOR_FOR_INORDER_I(i, prod_element) {                         \
+            if (evenp) {                                                \
+                r->prod_element[i] = a->mul_element[i*2+HI_IDX] * b->mul_element[i*2+HI_IDX]; \
+            } else {                                                    \
+                r->prod_element[i] = a->mul_element[i*2+LO_IDX] * b->mul_element[i*2+LO_IDX]; \
+            }                                                           \
+        }                                                               \
+    }
+#define VMUL(suffix, mul_element, prod_element) \
+  VMUL_DO(mule##suffix, mul_element, prod_element, 1) \
+  VMUL_DO(mulo##suffix, mul_element, prod_element, 0)
+VMUL(sb, s8, s16)
+VMUL(sh, s16, s32)
+VMUL(ub, u8, u16)
+VMUL(uh, u16, u32)
+#undef VMUL_DO
+#undef VMUL
+
 #undef VECTOR_FOR_INORDER_I
 #undef HI_IDX
 #undef LO_IDX
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 13fccf3..741bbc9 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6211,6 +6211,14 @@ GEN_VXFORM(vmrghw, 6, 2);
 GEN_VXFORM(vmrglb, 6, 4);
 GEN_VXFORM(vmrglh, 6, 5);
 GEN_VXFORM(vmrglw, 6, 6);
+GEN_VXFORM(vmuloub, 4, 0);
+GEN_VXFORM(vmulouh, 4, 1);
+GEN_VXFORM(vmulosb, 4, 4);
+GEN_VXFORM(vmulosh, 4, 5);
+GEN_VXFORM(vmuleub, 4, 8);
+GEN_VXFORM(vmuleuh, 4, 9);
+GEN_VXFORM(vmulesb, 4, 12);
+GEN_VXFORM(vmulesh, 4, 13);
 
 #define GEN_VXRFORM1(opname, name, str, opc2, opc3)                     \
     GEN_HANDLER2(name, str, 0x4, opc2, opc3, 0x00000000, PPC_ALTIVEC)   \
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 12/40] Add vsr{,a}{b,h,w} instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (10 preceding siblings ...)
  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 ` Nathan Froyd
  2008-12-31  3:09 ` [Qemu-devel] [PATCH 13/40] Add vsl{b,h,w} instructions Nathan Froyd
                   ` (28 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:09 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index 6b74c3d..f2e91ca 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -146,6 +146,12 @@ DEF_HELPER_3(vmulosb, void, avr, avr, avr)
 DEF_HELPER_3(vmulosh, void, avr, avr, avr)
 DEF_HELPER_3(vmuloub, void, avr, avr, avr)
 DEF_HELPER_3(vmulouh, void, avr, avr, avr)
+DEF_HELPER_3(vsrab, void, avr, avr, avr)
+DEF_HELPER_3(vsrah, void, avr, avr, avr)
+DEF_HELPER_3(vsraw, void, avr, avr, avr)
+DEF_HELPER_3(vsrb, void, avr, avr, avr)
+DEF_HELPER_3(vsrh, void, avr, avr, avr)
+DEF_HELPER_3(vsrw, void, avr, avr, avr)
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index ab8e15b..55f9c8b 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2122,6 +2122,24 @@ VMUL(uh, u16, u32)
 #undef VMUL_DO
 #undef VMUL
 
+#define VSR(suffix, element)                                            \
+    void helper_vsr##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)  \
+    {                                                                   \
+        int i;                                                          \
+        for (i = 0; i < ARRAY_SIZE(r->element); i++) {                  \
+            unsigned int mask = ((1 << (3 + (sizeof (a->element[0]) >> 1))) - 1); \
+            unsigned int shift = b->element[i] & mask;                  \
+            r->element[i] = a->element[i] >> shift;                     \
+        }                                                               \
+    }
+VSR(ab, s8)
+VSR(ah, s16)
+VSR(aw, s32)
+VSR(b, u8)
+VSR(h, u16)
+VSR(w, u32)
+#undef VSR
+
 #undef VECTOR_FOR_INORDER_I
 #undef HI_IDX
 #undef LO_IDX
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 741bbc9..246a8fd 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6219,6 +6219,12 @@ GEN_VXFORM(vmuleub, 4, 8);
 GEN_VXFORM(vmuleuh, 4, 9);
 GEN_VXFORM(vmulesb, 4, 12);
 GEN_VXFORM(vmulesh, 4, 13);
+GEN_VXFORM(vsrb, 2, 8);
+GEN_VXFORM(vsrh, 2, 9);
+GEN_VXFORM(vsrw, 2, 10);
+GEN_VXFORM(vsrab, 2, 12);
+GEN_VXFORM(vsrah, 2, 13);
+GEN_VXFORM(vsraw, 2, 14);
 
 #define GEN_VXRFORM1(opname, name, str, opc2, opc3)                     \
     GEN_HANDLER2(name, str, 0x4, opc2, opc3, 0x00000000, PPC_ALTIVEC)   \
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 13/40] Add vsl{b,h,w} instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (11 preceding siblings ...)
  2008-12-31  3:09 ` [Qemu-devel] [PATCH 12/40] Add vsr{,a}{b,h,w} instructions Nathan Froyd
@ 2008-12-31  3:09 ` Nathan Froyd
  2008-12-31  3:09 ` [Qemu-devel] [PATCH 14/40] Add vs{l,r}o instructions Nathan Froyd
                   ` (27 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:09 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index f2e91ca..7f3b011 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -152,6 +152,9 @@ DEF_HELPER_3(vsraw, void, avr, avr, avr)
 DEF_HELPER_3(vsrb, void, avr, avr, avr)
 DEF_HELPER_3(vsrh, void, avr, avr, avr)
 DEF_HELPER_3(vsrw, void, avr, avr, avr)
+DEF_HELPER_3(vslb, void, avr, avr, avr)
+DEF_HELPER_3(vslh, void, avr, avr, avr)
+DEF_HELPER_3(vslw, void, avr, avr, avr)
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 55f9c8b..4addf9a 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2122,6 +2122,21 @@ VMUL(uh, u16, u32)
 #undef VMUL_DO
 #undef VMUL
 
+#define VSL(suffix, element)                                            \
+    void helper_vsl##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)  \
+    {                                                                   \
+        int i;                                                          \
+        for (i = 0; i < ARRAY_SIZE(r->element); i++) {                  \
+            unsigned int mask = ((1 << (3 + (sizeof (a->element[0]) >> 1))) - 1); \
+            unsigned int shift = b->element[i] & mask;                  \
+            r->element[i] = a->element[i] << shift;                     \
+        }                                                               \
+    }
+VSL(b, u8)
+VSL(h, u16)
+VSL(w, u32)
+#undef VSL
+
 #define VSR(suffix, element)                                            \
     void helper_vsr##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)  \
     {                                                                   \
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 246a8fd..ff3fcb1 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6219,6 +6219,9 @@ GEN_VXFORM(vmuleub, 4, 8);
 GEN_VXFORM(vmuleuh, 4, 9);
 GEN_VXFORM(vmulesb, 4, 12);
 GEN_VXFORM(vmulesh, 4, 13);
+GEN_VXFORM(vslb, 2, 4);
+GEN_VXFORM(vslh, 2, 5);
+GEN_VXFORM(vslw, 2, 6);
 GEN_VXFORM(vsrb, 2, 8);
 GEN_VXFORM(vsrh, 2, 9);
 GEN_VXFORM(vsrw, 2, 10);
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 14/40] Add vs{l,r}o instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (12 preceding siblings ...)
  2008-12-31  3:09 ` [Qemu-devel] [PATCH 13/40] Add vsl{b,h,w} instructions Nathan Froyd
@ 2008-12-31  3:09 ` Nathan Froyd
  2008-12-31  3:09 ` [Qemu-devel] [PATCH 15/40] Add v{add,sub}cuw instructions Nathan Froyd
                   ` (26 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:09 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index 7f3b011..8f6f059 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -155,6 +155,8 @@ DEF_HELPER_3(vsrw, void, avr, avr, avr)
 DEF_HELPER_3(vslb, void, avr, avr, avr)
 DEF_HELPER_3(vslh, void, avr, avr, avr)
 DEF_HELPER_3(vslw, void, avr, avr, avr)
+DEF_HELPER_3(vslo, void, avr, avr, avr)
+DEF_HELPER_3(vsro, void, avr, avr, avr)
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 4addf9a..5451403 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -17,6 +17,7 @@
  * License along with this library; if not, write to the Free Software
  * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
+#include <string.h>
 #include "exec.h"
 #include "host-utils.h"
 #include "helper.h"
@@ -2137,6 +2138,19 @@ VSL(h, u16)
 VSL(w, u32)
 #undef VSL
 
+void helper_vslo (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
+{
+  int sh = (b->u8[LO_IDX*0xf] >> 3) & 0xf;
+
+#if defined (WORDS_BIGENDIAN)
+  memmove (&r->u8[0], &a->u8[sh], 0x10-sh);
+  memset (&r->u8[16-sh], 0, sh);
+#else
+  memmove (&r->u8[sh], &a->u8[0], 0x10-sh);
+  memset (&r->u8[0], 0, sh);
+#endif
+}
+
 #define VSR(suffix, element)                                            \
     void helper_vsr##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)  \
     {                                                                   \
@@ -2155,6 +2169,19 @@ VSR(h, u16)
 VSR(w, u32)
 #undef VSR
 
+void helper_vsro (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
+{
+  int sh = (b->u8[LO_IDX*0xf] >> 3) & 0xf;
+
+#if defined (WORDS_BIGENDIAN)
+  memmove (&r->u8[sh], &a->u8[0], 0x10-sh);
+  memset (&r->u8[0], 0, sh);
+#else
+  memmove (&r->u8[0], &a->u8[sh], 0x10-sh);
+  memset (&r->u8[0x10-sh], 0, sh);
+#endif
+}
+
 #undef VECTOR_FOR_INORDER_I
 #undef HI_IDX
 #undef LO_IDX
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index ff3fcb1..2c4b29a 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6228,6 +6228,8 @@ GEN_VXFORM(vsrw, 2, 10);
 GEN_VXFORM(vsrab, 2, 12);
 GEN_VXFORM(vsrah, 2, 13);
 GEN_VXFORM(vsraw, 2, 14);
+GEN_VXFORM(vslo, 6, 16);
+GEN_VXFORM(vsro, 6, 17);
 
 #define GEN_VXRFORM1(opname, name, str, opc2, opc3)                     \
     GEN_HANDLER2(name, str, 0x4, opc2, opc3, 0x00000000, PPC_ALTIVEC)   \
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 15/40] Add v{add,sub}cuw instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (13 preceding siblings ...)
  2008-12-31  3:09 ` [Qemu-devel] [PATCH 14/40] Add vs{l,r}o instructions Nathan Froyd
@ 2008-12-31  3:09 ` Nathan Froyd
  2008-12-31  3:09 ` [Qemu-devel] [PATCH 16/40] Add lvs{l,r} instructions Nathan Froyd
                   ` (25 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:09 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index 8f6f059..a784fae 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -157,6 +157,8 @@ DEF_HELPER_3(vslh, void, avr, avr, avr)
 DEF_HELPER_3(vslw, void, avr, avr, avr)
 DEF_HELPER_3(vslo, void, avr, avr, avr)
 DEF_HELPER_3(vsro, void, avr, avr, avr)
+DEF_HELPER_3(vaddcuw, void, avr, avr, avr)
+DEF_HELPER_3(vsubcuw, void, avr, avr, avr)
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 5451403..b671247 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -1972,6 +1972,14 @@ target_ulong helper_dlmzb (target_ulong high, target_ulong low, uint32_t update_
   for (index = ARRAY_SIZE(r->element)-1; index >= 0; index--)
 #endif
 
+void helper_vaddcuw (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
+{
+    int i;
+    for (i = 0; i < ARRAY_SIZE(r->u32); i++) {
+        r->u32[i] = ~a->u32[i] < b->u32[i];
+    }
+}
+
 #define VARITH_DO(name, op, element)        \
 void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)          \
 {                                                                       \
@@ -2182,6 +2190,14 @@ void helper_vsro (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
 #endif
 }
 
+void helper_vsubcuw (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
+{
+    int i;
+    for (i = 0; i < ARRAY_SIZE(r->u32); i++) {
+        r->u32[i] = a->u32[i] >= b->u32[i];
+    }
+}
+
 #undef VECTOR_FOR_INORDER_I
 #undef HI_IDX
 #undef LO_IDX
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 2c4b29a..8dbe14a 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6230,6 +6230,8 @@ GEN_VXFORM(vsrah, 2, 13);
 GEN_VXFORM(vsraw, 2, 14);
 GEN_VXFORM(vslo, 6, 16);
 GEN_VXFORM(vsro, 6, 17);
+GEN_VXFORM(vaddcuw, 0, 6);
+GEN_VXFORM(vsubcuw, 0, 22);
 
 #define GEN_VXRFORM1(opname, name, str, opc2, opc3)                     \
     GEN_HANDLER2(name, str, 0x4, opc2, opc3, 0x00000000, PPC_ALTIVEC)   \
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 16/40] Add lvs{l,r} instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (14 preceding siblings ...)
  2008-12-31  3:09 ` [Qemu-devel] [PATCH 15/40] Add v{add,sub}cuw instructions Nathan Froyd
@ 2008-12-31  3:09 ` Nathan Froyd
  2008-12-31  3:09 ` [Qemu-devel] [PATCH 17/40] Add m{f,t}vscr instructions Nathan Froyd
                   ` (24 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:09 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index a784fae..1d05cb2 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -159,6 +159,8 @@ DEF_HELPER_3(vslo, void, avr, avr, avr)
 DEF_HELPER_3(vsro, void, avr, avr, avr)
 DEF_HELPER_3(vaddcuw, void, avr, avr, avr)
 DEF_HELPER_3(vsubcuw, void, avr, avr, avr)
+DEF_HELPER_2(lvsl, void, avr, tl);
+DEF_HELPER_2(lvsr, void, avr, tl);
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index b671247..0b44e7c 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -1972,6 +1972,24 @@ target_ulong helper_dlmzb (target_ulong high, target_ulong low, uint32_t update_
   for (index = ARRAY_SIZE(r->element)-1; index >= 0; index--)
 #endif
 
+void helper_lvsl (ppc_avr_t *r, target_ulong sh)
+{
+    int i, j = (sh & 0xf);
+
+    VECTOR_FOR_INORDER_I (i, u8) {
+        r->u8[i] = j++;
+    }
+}
+
+void helper_lvsr (ppc_avr_t *r, target_ulong sh)
+{
+    int i, j = 0x10 - (sh & 0xf);
+
+    VECTOR_FOR_INORDER_I (i, u8) {
+        r->u8[i] = j++;
+    }
+}
+
 void helper_vaddcuw (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
 {
     int i;
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 8dbe14a..4e1bd23 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6146,6 +6146,38 @@ GEN_VR_STX(svx, 0x07, 0x07);
 /* As we don't emulate the cache, stvxl is stricly equivalent to stvx */
 GEN_VR_STX(svxl, 0x07, 0x0F);
 
+GEN_HANDLER(lvsl, 0x1f, 0x06, 0x00, 0x00000001, PPC_ALTIVEC)
+{
+    TCGv_ptr rd;
+    TCGv EA;
+    if (unlikely(!ctx->altivec_enabled)) {
+        gen_exception(ctx, POWERPC_EXCP_VPU);
+        return;
+    }
+    EA = tcg_temp_new();
+    gen_addr_reg_index(ctx, EA);
+    rd = gen_avr_ptr(rD(ctx->opcode));
+    gen_helper_lvsl(rd, EA);
+    tcg_temp_free(EA);
+    tcg_temp_free_ptr(rd);
+}
+
+GEN_HANDLER(lvsr, 0x1f, 0x06, 0x01, 0x00000001, PPC_ALTIVEC)
+{
+    TCGv_ptr rd;
+    TCGv EA;
+    if (unlikely(!ctx->altivec_enabled)) {
+        gen_exception(ctx, POWERPC_EXCP_VPU);
+        return;
+    }
+    EA = tcg_temp_new();
+    gen_addr_reg_index(ctx, EA);
+    rd = gen_avr_ptr(rD(ctx->opcode));
+    gen_helper_lvsr(rd, EA);
+    tcg_temp_free(EA);
+    tcg_temp_free_ptr(rd);
+}
+
 /* Logical operations */
 #define GEN_VX_LOGICAL(name, tcg_op, opc2, opc3)                        \
 GEN_HANDLER(name, 0x04, opc2, opc3, 0x00000000, PPC_ALTIVEC)            \
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 17/40] Add m{f,t}vscr instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (15 preceding siblings ...)
  2008-12-31  3:09 ` [Qemu-devel] [PATCH 16/40] Add lvs{l,r} instructions Nathan Froyd
@ 2008-12-31  3:09 ` 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
                   ` (23 subsequent siblings)
  40 siblings, 1 reply; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:09 UTC (permalink / raw)
  To: qemu-devel


Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
---
 target-ppc/translate.c |   37 +++++++++++++++++++++++++++++++++++++
 1 files changed, 37 insertions(+), 0 deletions(-)

diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 4e1bd23..5c13ed2 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6178,6 +6178,43 @@ GEN_HANDLER(lvsr, 0x1f, 0x06, 0x01, 0x00000001, PPC_ALTIVEC)
     tcg_temp_free_ptr(rd);
 }
 
+static always_inline uint32_t gen_vscr_offset (int r)
+{
+#if defined(WORDS_BIGENDIAN)
+    return offsetof(CPUPPCState, avr[r].u32[3]);
+#else
+    return offsetof(CPUPPCState, avr[r].u32[0]);
+#endif
+}
+
+GEN_HANDLER(mfvscr, 0x04, 0x2, 0x18, 0x001ff800, PPC_ALTIVEC)
+{
+    TCGv_i32 t;
+    if (unlikely(!ctx->altivec_enabled)) {
+        gen_exception(ctx, POWERPC_EXCP_VPU);
+        return;
+    }
+    tcg_gen_movi_i64(cpu_avrh[rD(ctx->opcode)], 0);
+    tcg_gen_movi_i64(cpu_avrl[rD(ctx->opcode)], 0);
+    t = tcg_temp_new_i32();
+    tcg_gen_ld_i32(t, cpu_env, offsetof(CPUState, vscr));
+    tcg_gen_st_i32(t, cpu_env, gen_vscr_offset(rD(ctx->opcode)));
+    tcg_temp_free_i32(t);
+}
+
+GEN_HANDLER(mtvscr, 0x04, 0x2, 0x19, 0x03ff0000, PPC_ALTIVEC)
+{
+    TCGv_i32 t;
+    if (unlikely(!ctx->altivec_enabled)) {
+        gen_exception(ctx, POWERPC_EXCP_VPU);
+        return;
+    }
+    t = tcg_temp_new_i32();
+    tcg_gen_ld_i32(t, cpu_env, gen_vscr_offset(rB(ctx->opcode)));
+    tcg_gen_st_i32(t, cpu_env, offsetof(CPUState, vscr));
+    tcg_temp_free_i32(t);
+}
+
 /* Logical operations */
 #define GEN_VX_LOGICAL(name, tcg_op, opc2, opc3)                        \
 GEN_HANDLER(name, 0x04, opc2, opc3, 0x00000000, PPC_ALTIVEC)            \
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 18/40] Add v{add, sub}{s, u}{b, h, w}s instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (16 preceding siblings ...)
  2008-12-31  3:09 ` [Qemu-devel] [PATCH 17/40] Add m{f,t}vscr instructions Nathan Froyd
@ 2008-12-31  3:10 ` Nathan Froyd
  2009-01-03 21:13   ` Aurelien Jarno
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 19/40] Add vrl{b,h,w} instructions Nathan Froyd
                   ` (22 subsequent siblings)
  40 siblings, 1 reply; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:10 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index 1d05cb2..4e1c307 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -161,6 +161,18 @@ DEF_HELPER_3(vaddcuw, void, avr, avr, avr)
 DEF_HELPER_3(vsubcuw, void, avr, avr, avr)
 DEF_HELPER_2(lvsl, void, avr, tl);
 DEF_HELPER_2(lvsr, void, avr, tl);
+DEF_HELPER_3(vaddsbs, void, avr, avr, avr)
+DEF_HELPER_3(vaddshs, void, avr, avr, avr)
+DEF_HELPER_3(vaddsws, void, avr, avr, avr)
+DEF_HELPER_3(vsubsbs, void, avr, avr, avr)
+DEF_HELPER_3(vsubshs, void, avr, avr, avr)
+DEF_HELPER_3(vsubsws, void, avr, avr, avr)
+DEF_HELPER_3(vaddubs, void, avr, avr, avr)
+DEF_HELPER_3(vadduhs, void, avr, avr, avr)
+DEF_HELPER_3(vadduws, void, avr, avr, avr)
+DEF_HELPER_3(vsububs, void, avr, avr, avr)
+DEF_HELPER_3(vsubuhs, void, avr, avr, avr)
+DEF_HELPER_3(vsubuws, void, avr, avr, avr)
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 0b44e7c..1468656 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2015,6 +2015,52 @@ VARITH(uwm, u32)
 #undef VARITH_DO
 #undef VARITH
 
+#define VARITHSAT_CASE(type, op, min, max, use_min, use_max, element)   \
+    {                                                                   \
+        type result = (type)a->element[i] op (type)b->element[i];       \
+        if (use_min && result < min) {                                  \
+            result = min;                                               \
+            sat = 1;                                                    \
+        } else if (use_max && result > max) {                           \
+            result = max;                                               \
+            sat = 1;                                                    \
+        }                                                               \
+        r->element[i] = result;                                         \
+    }
+
+#define VARITHSAT_DO(name, op, min, max, use_min, use_max, element)     \
+    void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)      \
+    {                                                                   \
+        int sat = 0;                                                    \
+        int i;                                                          \
+        for (i = 0; i < ARRAY_SIZE(r->element); i++) {                  \
+            switch (sizeof(r->element[0])) {                            \
+            case 1: VARITHSAT_CASE(int16_t, op, min, max, use_min, use_max, element); break; \
+            case 2: VARITHSAT_CASE(int32_t, op, min, max, use_min, use_max, element); break; \
+            case 4: VARITHSAT_CASE(int64_t, op, min, max, use_min, use_max, element); break; \
+            }                                                           \
+        }                                                               \
+        if (sat) {                                                      \
+            env->vscr |= (1 << VSCR_SAT);                               \
+        }                                                               \
+    }
+#define VARITHSAT_SIGNED(suffix, element, min, max)             \
+  VARITHSAT_DO(adds##suffix##s, +, min, max, 1, 1, element)     \
+  VARITHSAT_DO(subs##suffix##s, -, min, max, 1, 1, element)
+#define VARITHSAT_UNSIGNED(suffix, element, max)                 \
+  VARITHSAT_DO(addu##suffix##s, +, 0, max, 0, 1, element)        \
+  VARITHSAT_DO(subu##suffix##s, -, 0, max, 1, 0, element)
+VARITHSAT_SIGNED(b, s8, INT8_MIN, INT8_MAX)
+VARITHSAT_SIGNED(h, s16, INT16_MIN, INT16_MAX)
+VARITHSAT_SIGNED(w, s32, INT32_MIN, INT32_MAX)
+VARITHSAT_UNSIGNED(b, u8, UINT8_MAX)
+VARITHSAT_UNSIGNED(h, u16, UINT16_MAX)
+VARITHSAT_UNSIGNED(w, u32, UINT32_MAX)
+#undef VARITHSAT_CASE
+#undef VARITHSAT_DO
+#undef VARITHSAT_SIGNED
+#undef VARITHSAT_UNSIGNED
+
 #define VAVG_DO(name, element, etype)                                   \
     void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)      \
     {                                                                   \
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 5c13ed2..7a6c6e4 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6301,6 +6301,18 @@ GEN_VXFORM(vslo, 6, 16);
 GEN_VXFORM(vsro, 6, 17);
 GEN_VXFORM(vaddcuw, 0, 6);
 GEN_VXFORM(vsubcuw, 0, 22);
+GEN_VXFORM(vaddubs, 0, 8);
+GEN_VXFORM(vadduhs, 0, 9);
+GEN_VXFORM(vadduws, 0, 10);
+GEN_VXFORM(vaddsbs, 0, 12);
+GEN_VXFORM(vaddshs, 0, 13);
+GEN_VXFORM(vaddsws, 0, 14);
+GEN_VXFORM(vsububs, 0, 24);
+GEN_VXFORM(vsubuhs, 0, 25);
+GEN_VXFORM(vsubuws, 0, 26);
+GEN_VXFORM(vsubsbs, 0, 28);
+GEN_VXFORM(vsubshs, 0, 29);
+GEN_VXFORM(vsubsws, 0, 30);
 
 #define GEN_VXRFORM1(opname, name, str, opc2, opc3)                     \
     GEN_HANDLER2(name, str, 0x4, opc2, opc3, 0x00000000, PPC_ALTIVEC)   \
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 19/40] Add vrl{b,h,w} instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (17 preceding siblings ...)
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 18/40] Add v{add, sub}{s, u}{b, h, w}s instructions Nathan Froyd
@ 2008-12-31  3:10 ` Nathan Froyd
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 20/40] Add vs{l,r} instructions Nathan Froyd
                   ` (21 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:10 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index 4e1c307..cf2a655 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -173,6 +173,9 @@ DEF_HELPER_3(vadduws, void, avr, avr, avr)
 DEF_HELPER_3(vsububs, void, avr, avr, avr)
 DEF_HELPER_3(vsubuhs, void, avr, avr, avr)
 DEF_HELPER_3(vsubuws, void, avr, avr, avr)
+DEF_HELPER_3(vrlb, void, avr, avr, avr)
+DEF_HELPER_3(vrlh, void, avr, avr, avr)
+DEF_HELPER_3(vrlw, void, avr, avr, avr)
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 1468656..15eee72 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2195,6 +2195,21 @@ VMUL(uh, u16, u32)
 #undef VMUL_DO
 #undef VMUL
 
+#define VROTATE(suffix, element)                                        \
+    void helper_vrl##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)  \
+    {                                                                   \
+        int i;                                                          \
+        for (i = 0; i < ARRAY_SIZE(r->element); i++) {                  \
+            unsigned int mask = ((1 << (3 + (sizeof (a->element[0]) >> 1))) - 1); \
+            unsigned int shift = b->element[i] & mask;                  \
+            r->element[i] = (a->element[i] << shift) | (a->element[i] >> (sizeof(a->element[0]) * 8 - shift)); \
+        }                                                               \
+    }
+VROTATE(b, u8)
+VROTATE(h, u16)
+VROTATE(w, u32)
+#undef VROTATE
+
 #define VSL(suffix, element)                                            \
     void helper_vsl##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)  \
     {                                                                   \
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 7a6c6e4..a853683 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6313,6 +6313,9 @@ GEN_VXFORM(vsubuws, 0, 26);
 GEN_VXFORM(vsubsbs, 0, 28);
 GEN_VXFORM(vsubshs, 0, 29);
 GEN_VXFORM(vsubsws, 0, 30);
+GEN_VXFORM(vrlb, 2, 0);
+GEN_VXFORM(vrlh, 2, 1);
+GEN_VXFORM(vrlw, 2, 2);
 
 #define GEN_VXRFORM1(opname, name, str, opc2, opc3)                     \
     GEN_HANDLER2(name, str, 0x4, opc2, opc3, 0x00000000, PPC_ALTIVEC)   \
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 20/40] Add vs{l,r} instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (18 preceding siblings ...)
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 19/40] Add vrl{b,h,w} instructions Nathan Froyd
@ 2008-12-31  3:10 ` Nathan Froyd
  2009-01-03 21:26   ` Aurelien Jarno
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 21/40] Add vsldoi instruction Nathan Froyd
                   ` (20 subsequent siblings)
  40 siblings, 1 reply; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:10 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index cf2a655..5f94e9f 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -176,6 +176,8 @@ DEF_HELPER_3(vsubuws, void, avr, avr, avr)
 DEF_HELPER_3(vrlb, void, avr, avr, avr)
 DEF_HELPER_3(vrlh, void, avr, avr, avr)
 DEF_HELPER_3(vrlw, void, avr, avr, avr)
+DEF_HELPER_3(vsl, void, avr, avr, avr)
+DEF_HELPER_3(vsr, void, avr, avr, avr)
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 15eee72..ce47ef1 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2210,6 +2210,42 @@ VROTATE(h, u16)
 VROTATE(w, u32)
 #undef VROTATE
 
+#if defined(WORDS_BIGENDIAN)
+#define LEFT 0
+#define RIGHT 1
+#else
+#define LEFT 1
+#define RIGHT 0
+#endif
+#define VSHIFT(suffix, leftp)                                           \
+    void helper_vs##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)   \
+    {                                                                   \
+        int shift = b->u8[LO_IDX*0x15] & 0x7;                           \
+        int doit = 1;                                                   \
+        int i;                                                          \
+        for (i = 0; i < ARRAY_SIZE(r->u8); i++) {                       \
+            doit = doit && ((b->u8[i] & 0x7) == shift);                 \
+        }                                                               \
+        if (doit) {                                                     \
+            if (shift == 0) {                                           \
+                *r = *a;                                                \
+            } else if (leftp) {                                         \
+                uint64_t carry = a->u64[LO_IDX] >> (64 - shift);        \
+                r->u64[HI_IDX] = (a->u64[HI_IDX] << shift) | carry;     \
+                r->u64[LO_IDX] = a->u64[LO_IDX] << shift;               \
+            } else {                                                    \
+                uint64_t carry = a->u64[HI_IDX] << (64 - shift);        \
+                r->u64[LO_IDX] = (a->u64[LO_IDX] >> shift) | carry;     \
+                r->u64[HI_IDX] = a->u64[HI_IDX] >> shift;               \
+            }                                                           \
+        }                                                               \
+    }
+VSHIFT(l, LEFT)
+VSHIFT(r, RIGHT)
+#undef VSHIFT
+#undef LEFT
+#undef RIGHT
+
 #define VSL(suffix, element)                                            \
     void helper_vsl##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)  \
     {                                                                   \
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index a853683..b50aba3 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6316,6 +6316,8 @@ GEN_VXFORM(vsubsws, 0, 30);
 GEN_VXFORM(vrlb, 2, 0);
 GEN_VXFORM(vrlh, 2, 1);
 GEN_VXFORM(vrlw, 2, 2);
+GEN_VXFORM(vsl, 2, 7);
+GEN_VXFORM(vsr, 2, 11);
 
 #define GEN_VXRFORM1(opname, name, str, opc2, opc3)                     \
     GEN_HANDLER2(name, str, 0x4, opc2, opc3, 0x00000000, PPC_ALTIVEC)   \
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 21/40] Add vsldoi instruction.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (19 preceding siblings ...)
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 20/40] Add vs{l,r} instructions Nathan Froyd
@ 2008-12-31  3:10 ` Nathan Froyd
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 22/40] Add GEN_VXFORM_SIMM macro for subsequent instructions Nathan Froyd
                   ` (19 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:10 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index 5f94e9f..02e3c10 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -178,6 +178,7 @@ DEF_HELPER_3(vrlh, void, avr, avr, avr)
 DEF_HELPER_3(vrlw, void, avr, avr, avr)
 DEF_HELPER_3(vsl, void, avr, avr, avr)
 DEF_HELPER_3(vsr, void, avr, avr, avr)
+DEF_HELPER_4(vsldoi, void, avr, avr, avr, i32)
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index ce47ef1..d0748b2 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2261,6 +2261,34 @@ VSL(h, u16)
 VSL(w, u32)
 #undef VSL
 
+void helper_vsldoi (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, uint32_t shift)
+{
+    int sh = shift & 0xf;
+    int i;
+    ppc_avr_t result;
+
+#if defined(WORDS_BIGENDIAN)
+    for (i = 0; i < ARRAY_SIZE(r->u8); i++) {
+        int index = sh + i;
+        if (index > 0xf) {
+            result.u8[i] = b->u8[index-0x10];
+        } else {
+            result.u8[i] = a->u8[index];
+        }
+    }
+#else
+    for (i = 0; i < ARRAY_SIZE(r->u8); i++) {
+        int index = (16 - sh) + i;
+        if (index > 0xf) {
+            result.u8[i] = a->u8[index-0x10];
+        } else {
+            result.u8[i] = b->u8[index];
+        }
+    }
+#endif
+    *r = result;
+}
+
 void helper_vslo (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
 {
   int sh = (b->u8[LO_IDX*0xf] >> 3) & 0xf;
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index b50aba3..4516ba6 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -374,6 +374,8 @@ EXTRACT_HELPER(UIMM, 0, 16);
 EXTRACT_HELPER(NB, 11, 5);
 /* Shift count */
 EXTRACT_HELPER(SH, 11, 5);
+/* Vector shift count */
+EXTRACT_HELPER(VSH, 6, 4);
 /* Mask start */
 EXTRACT_HELPER(MB, 6, 5);
 /* Mask end */
@@ -6356,6 +6358,25 @@ GEN_VXRFORM(vcmpgtub, 3, 8)
 GEN_VXRFORM(vcmpgtuh, 3, 9)
 GEN_VXRFORM(vcmpgtuw, 3, 10)
 
+GEN_HANDLER(vsldoi, 0x04, 0x16, 0xFF, 0x00000400, PPC_ALTIVEC)
+{
+    TCGv_ptr ra, rb, rd;
+    TCGv sh;
+    if (unlikely(!ctx->altivec_enabled)) {
+        gen_exception(ctx, POWERPC_EXCP_VPU);
+        return;
+    }
+    ra = gen_avr_ptr(rA(ctx->opcode));
+    rb = gen_avr_ptr(rB(ctx->opcode));
+    rd = gen_avr_ptr(rD(ctx->opcode));
+    sh = tcg_const_i32(VSH(ctx->opcode));
+    gen_helper_vsldoi (rd, ra, rb, sh);
+    tcg_temp_free_ptr(ra);
+    tcg_temp_free_ptr(rb);
+    tcg_temp_free_ptr(rd);
+    tcg_temp_free(sh);
+}
+
 /***                           SPE extension                               ***/
 /* Register moves */
 
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 22/40] Add GEN_VXFORM_SIMM macro for subsequent instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (20 preceding siblings ...)
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 21/40] Add vsldoi instruction Nathan Froyd
@ 2008-12-31  3:10 ` Nathan Froyd
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 23/40] Add vspltis{b,h,w} instructions Nathan Froyd
                   ` (18 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:10 UTC (permalink / raw)
  To: qemu-devel


Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
---
 target-ppc/translate.c |   18 ++++++++++++++++++
 1 files changed, 18 insertions(+), 0 deletions(-)

diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 4516ba6..e590476 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -370,6 +370,8 @@ EXTRACT_HELPER(IMM, 12, 8);
 EXTRACT_SHELPER(SIMM, 0, 16);
 /* 16 bits unsigned immediate value */
 EXTRACT_HELPER(UIMM, 0, 16);
+/* 5 bits signed immediate value */
+EXTRACT_HELPER(SIMM5, 16, 5);
 /* Bit count */
 EXTRACT_HELPER(NB, 11, 5);
 /* Shift count */
@@ -6321,6 +6323,22 @@ GEN_VXFORM(vrlw, 2, 2);
 GEN_VXFORM(vsl, 2, 7);
 GEN_VXFORM(vsr, 2, 11);
 
+#define GEN_VXFORM_SIMM(name, opc2, opc3)                               \
+    GEN_HANDLER(name, 0x04, opc2, opc3, 0x00000000, PPC_ALTIVEC)        \
+    {                                                                   \
+        TCGv_ptr rd;                                                    \
+        TCGv_i32 simm;                                                  \
+        if (unlikely(!ctx->altivec_enabled)) {                          \
+            gen_exception(ctx, POWERPC_EXCP_VPU);                       \
+            return;                                                     \
+        }                                                               \
+        simm = tcg_const_i32(SIMM5(ctx->opcode));                       \
+        rd = gen_avr_ptr(rD(ctx->opcode));                              \
+        gen_helper_##name (rd, simm);                                   \
+        tcg_temp_free_i32(simm);                                        \
+        tcg_temp_free_ptr(rd);                                          \
+    }
+
 #define GEN_VXRFORM1(opname, name, str, opc2, opc3)                     \
     GEN_HANDLER2(name, str, 0x4, opc2, opc3, 0x00000000, PPC_ALTIVEC)   \
     {                                                                   \
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 23/40] Add vspltis{b,h,w} instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (21 preceding siblings ...)
  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 ` Nathan Froyd
  2009-01-03 21:43   ` Aurelien Jarno
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 24/40] Add GEN_VXFORM_UIMM macro for subsequent instructions Nathan Froyd
                   ` (17 subsequent siblings)
  40 siblings, 1 reply; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:10 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index 02e3c10..9fbcc4a 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -179,6 +179,9 @@ DEF_HELPER_3(vrlw, void, avr, avr, avr)
 DEF_HELPER_3(vsl, void, avr, avr, avr)
 DEF_HELPER_3(vsr, void, avr, avr, avr)
 DEF_HELPER_4(vsldoi, void, avr, avr, avr, i32)
+DEF_HELPER_2(vspltisb, void, avr, i32)
+DEF_HELPER_2(vspltish, void, avr, i32)
+DEF_HELPER_2(vspltisw, void, avr, i32)
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index d0748b2..55f341f 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2302,6 +2302,23 @@ void helper_vslo (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
 #endif
 }
 
+#define VSPLTI(suffix, element, splat_type)                     \
+    void helper_vspltis##suffix (ppc_avr_t *r, uint32_t splat)  \
+    {                                                           \
+        splat_type x = (splat_type)splat;                       \
+        int i;                                                  \
+        /* 5-bit sign extension.  */                            \
+        if (x & 0x10)                                           \
+            x -= 0x20;                                          \
+        for (i = 0; i < ARRAY_SIZE(r->element); i++) {          \
+            r->element[i] = x;                                  \
+        }                                                       \
+    }
+VSPLTI(b, s8, int8_t)
+VSPLTI(h, s16, int16_t)
+VSPLTI(w, s32, int32_t)
+#undef VSPLTI
+
 #define VSR(suffix, element)                                            \
     void helper_vsr##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)  \
     {                                                                   \
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index e590476..d9c1e60 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6339,6 +6339,10 @@ GEN_VXFORM(vsr, 2, 11);
         tcg_temp_free_ptr(rd);                                          \
     }
 
+GEN_VXFORM_SIMM(vspltisb, 6, 12);
+GEN_VXFORM_SIMM(vspltish, 6, 13);
+GEN_VXFORM_SIMM(vspltisw, 6, 14);
+
 #define GEN_VXRFORM1(opname, name, str, opc2, opc3)                     \
     GEN_HANDLER2(name, str, 0x4, opc2, opc3, 0x00000000, PPC_ALTIVEC)   \
     {                                                                   \
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 24/40] Add GEN_VXFORM_UIMM macro for subsequent instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (22 preceding siblings ...)
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 23/40] Add vspltis{b,h,w} instructions Nathan Froyd
@ 2008-12-31  3:10 ` Nathan Froyd
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 25/40] Add vsplt{b,h,w} instructions Nathan Froyd
                   ` (16 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:10 UTC (permalink / raw)
  To: qemu-devel


Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
---
 target-ppc/translate.c |   20 ++++++++++++++++++++
 1 files changed, 20 insertions(+), 0 deletions(-)

diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index d9c1e60..77e93cb 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -372,6 +372,8 @@ EXTRACT_SHELPER(SIMM, 0, 16);
 EXTRACT_HELPER(UIMM, 0, 16);
 /* 5 bits signed immediate value */
 EXTRACT_HELPER(SIMM5, 16, 5);
+/* 5 bits signed immediate value */
+EXTRACT_HELPER(UIMM5, 16, 5);
 /* Bit count */
 EXTRACT_HELPER(NB, 11, 5);
 /* Shift count */
@@ -6343,6 +6345,24 @@ GEN_VXFORM_SIMM(vspltisb, 6, 12);
 GEN_VXFORM_SIMM(vspltish, 6, 13);
 GEN_VXFORM_SIMM(vspltisw, 6, 14);
 
+#define GEN_VXFORM_UIMM(name, opc2, opc3)                               \
+    GEN_HANDLER(name, 0x04, opc2, opc3, 0x00000000, PPC_ALTIVEC)        \
+    {                                                                   \
+        TCGv_ptr rb, rd;                                                \
+        TCGv_i32 uimm;                                                  \
+        if (unlikely(!ctx->altivec_enabled)) {                          \
+            gen_exception(ctx, POWERPC_EXCP_VPU);                       \
+            return;                                                     \
+        }                                                               \
+        uimm = tcg_const_i32(UIMM5(ctx->opcode));                       \
+        rb = gen_avr_ptr(rB(ctx->opcode));                              \
+        rd = gen_avr_ptr(rD(ctx->opcode));                              \
+        gen_helper_##name (rd, rb, uimm);                               \
+        tcg_temp_free_i32(uimm);                                        \
+        tcg_temp_free_ptr(rb);                                          \
+        tcg_temp_free_ptr(rd);                                          \
+    }
+
 #define GEN_VXRFORM1(opname, name, str, opc2, opc3)                     \
     GEN_HANDLER2(name, str, 0x4, opc2, opc3, 0x00000000, PPC_ALTIVEC)   \
     {                                                                   \
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 25/40] Add vsplt{b,h,w} instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (23 preceding siblings ...)
  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 ` Nathan Froyd
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 26/40] Add GEN_VXFORM_NOA macro for subsequent instructions Nathan Froyd
                   ` (15 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:10 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index 9fbcc4a..2ca4e26 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -182,6 +182,9 @@ DEF_HELPER_4(vsldoi, void, avr, avr, avr, i32)
 DEF_HELPER_2(vspltisb, void, avr, i32)
 DEF_HELPER_2(vspltish, void, avr, i32)
 DEF_HELPER_2(vspltisw, void, avr, i32)
+DEF_HELPER_3(vspltb, void, avr, avr, i32)
+DEF_HELPER_3(vsplth, void, avr, avr, i32)
+DEF_HELPER_3(vspltw, void, avr, avr, i32)
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 55f341f..28b1fb6 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2302,6 +2302,29 @@ void helper_vslo (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
 #endif
 }
 
+/* Experimental testing shows that hardware masks the immediate.  */
+#define _SPLAT_MASKED(element) (splat & (ARRAY_SIZE(r->element) - 1))
+#if defined(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)                                          \
+    void helper_vsplt##suffix (ppc_avr_t *r, ppc_avr_t *b, uint32_t splat) \
+    {                                                                   \
+        uint32_t s = b->element[SPLAT_ELEMENT(element)];                \
+        int i;                                                          \
+        for (i = 0; i < ARRAY_SIZE(r->element); i++) {                  \
+            r->element[i] = s;                                          \
+        }                                                               \
+    }
+VSPLT(b, u8)
+VSPLT(h, u16)
+VSPLT(w, u32)
+#undef VSPLT
+#undef SPLAT_ELEMENT
+#undef _SPLAT_MASKED
+
 #define VSPLTI(suffix, element, splat_type)                     \
     void helper_vspltis##suffix (ppc_avr_t *r, uint32_t splat)  \
     {                                                           \
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 77e93cb..bade2c8 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6363,6 +6363,10 @@ GEN_VXFORM_SIMM(vspltisw, 6, 14);
         tcg_temp_free_ptr(rd);                                          \
     }
 
+GEN_VXFORM_UIMM(vspltb, 6, 8);
+GEN_VXFORM_UIMM(vsplth, 6, 9);
+GEN_VXFORM_UIMM(vspltw, 6, 10);
+
 #define GEN_VXRFORM1(opname, name, str, opc2, opc3)                     \
     GEN_HANDLER2(name, str, 0x4, opc2, opc3, 0x00000000, PPC_ALTIVEC)   \
     {                                                                   \
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 26/40] Add GEN_VXFORM_NOA macro for subsequent instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (24 preceding siblings ...)
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 25/40] Add vsplt{b,h,w} instructions Nathan Froyd
@ 2008-12-31  3:10 ` Nathan Froyd
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 27/40] Add vupk{h,l}px instructions Nathan Froyd
                   ` (14 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:10 UTC (permalink / raw)
  To: qemu-devel


Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
---
 target-ppc/translate.c |   15 +++++++++++++++
 1 files changed, 15 insertions(+), 0 deletions(-)

diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index bade2c8..b8a7cab 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6325,6 +6325,21 @@ GEN_VXFORM(vrlw, 2, 2);
 GEN_VXFORM(vsl, 2, 7);
 GEN_VXFORM(vsr, 2, 11);
 
+#define GEN_VXFORM_NOA(name, opc2, opc3)                                \
+    GEN_HANDLER(name, 0x04, opc2, opc3, 0x001f0000, PPC_ALTIVEC)        \
+    {                                                                   \
+        TCGv_ptr rb, rd;                                                \
+        if (unlikely(!ctx->altivec_enabled)) {                          \
+            gen_exception(ctx, POWERPC_EXCP_VPU);                       \
+            return;                                                     \
+        }                                                               \
+        rb = gen_avr_ptr(rB(ctx->opcode));                              \
+        rd = gen_avr_ptr(rD(ctx->opcode));                              \
+        gen_helper_##name (rd, rb);                                     \
+        tcg_temp_free_ptr(rb);                                          \
+        tcg_temp_free_ptr(rd);                                         \
+    }
+
 #define GEN_VXFORM_SIMM(name, opc2, opc3)                               \
     GEN_HANDLER(name, 0x04, opc2, opc3, 0x00000000, PPC_ALTIVEC)        \
     {                                                                   \
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 27/40] Add vupk{h,l}px instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (25 preceding siblings ...)
  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 ` Nathan Froyd
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 28/40] Add vupk{h,l}s{b,h} instructions Nathan Froyd
                   ` (13 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:10 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index 2ca4e26..9352a67 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -185,6 +185,8 @@ DEF_HELPER_2(vspltisw, void, avr, i32)
 DEF_HELPER_3(vspltb, void, avr, avr, i32)
 DEF_HELPER_3(vsplth, void, avr, avr, i32)
 DEF_HELPER_3(vspltw, void, avr, avr, i32)
+DEF_HELPER_2(vupkhpx, void, avr, avr)
+DEF_HELPER_2(vupklpx, void, avr, avr)
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 28b1fb6..5d8e678 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2381,6 +2381,35 @@ void helper_vsubcuw (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
     }
 }
 
+#if defined(WORDS_BIGENDIAN)
+#define UPKHI 1
+#define UPKLO 0
+#else
+#define UPKHI 0
+#define UPKLO 1
+#endif
+#define VUPKPX(suffix, hi)                                      \
+    void helper_vupk##suffix (ppc_avr_t *r, ppc_avr_t *b)       \
+    {                                                           \
+        int i;                                                  \
+        ppc_avr_t result;                                       \
+        for (i = 0; i < ARRAY_SIZE(r->u32); i++) {              \
+            uint16_t e = b->u16[hi ? i : i+4];                  \
+            uint8_t a = (e >> 15) ? 0xff : 0;                   \
+            uint8_t r = (e >> 10) & 0x1f;                       \
+            uint8_t g = (e >> 5) & 0x1f;                        \
+            uint8_t b = e & 0x1f;                               \
+            result.u32[i] = (a << 24) | (r << 16) | (g << 8) | b;       \
+        }                                                               \
+        *r = result;                                                    \
+    }
+VUPKPX(lpx, UPKLO)
+VUPKPX(hpx, UPKHI)
+#undef VUPKPX
+
+#undef UPKHI
+#undef UPKLO
+
 #undef VECTOR_FOR_INORDER_I
 #undef HI_IDX
 #undef LO_IDX
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index b8a7cab..a280db1 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6340,6 +6340,9 @@ GEN_VXFORM(vsr, 2, 11);
         tcg_temp_free_ptr(rd);                                         \
     }
 
+GEN_VXFORM_NOA(vupkhpx, 7, 13);
+GEN_VXFORM_NOA(vupklpx, 7, 15);
+
 #define GEN_VXFORM_SIMM(name, opc2, opc3)                               \
     GEN_HANDLER(name, 0x04, opc2, opc3, 0x00000000, PPC_ALTIVEC)        \
     {                                                                   \
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 28/40] Add vupk{h,l}s{b,h} instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (26 preceding siblings ...)
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 27/40] Add vupk{h,l}px instructions Nathan Froyd
@ 2008-12-31  3:10 ` Nathan Froyd
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 29/40] Add GEN_VAFORM_PAIRED macro for subsequent instructions Nathan Froyd
                   ` (12 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:10 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index 9352a67..26ff038 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -187,6 +187,10 @@ DEF_HELPER_3(vsplth, void, avr, avr, i32)
 DEF_HELPER_3(vspltw, void, avr, avr, i32)
 DEF_HELPER_2(vupkhpx, void, avr, avr)
 DEF_HELPER_2(vupklpx, void, avr, avr)
+DEF_HELPER_2(vupkhsb, void, avr, avr)
+DEF_HELPER_2(vupkhsh, void, avr, avr)
+DEF_HELPER_2(vupklsb, void, avr, avr)
+DEF_HELPER_2(vupklsh, void, avr, avr)
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 5d8e678..29c1f5d 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2407,6 +2407,27 @@ VUPKPX(lpx, UPKLO)
 VUPKPX(hpx, UPKHI)
 #undef VUPKPX
 
+#define VUPK(suffix, unpacked, packee, hi)                              \
+    void helper_vupk##suffix (ppc_avr_t *r, ppc_avr_t *b)               \
+    {                                                                   \
+        int i;                                                          \
+        ppc_avr_t result;                                               \
+        if (hi) {                                                       \
+            for (i = 0; i < ARRAY_SIZE(r->unpacked); i++) {             \
+                result.unpacked[i] = b->packee[i];                      \
+            }                                                           \
+        } else {                                                        \
+            for (i = ARRAY_SIZE(r->unpacked); i < ARRAY_SIZE(r->packee); i++) { \
+                result.unpacked[i-ARRAY_SIZE(r->unpacked)] = b->packee[i]; \
+            }                                                           \
+        }                                                               \
+        *r = result;                                                    \
+    }
+VUPK(hsb, s16, s8, UPKHI)
+VUPK(hsh, s32, s16, UPKHI)
+VUPK(lsb, s16, s8, UPKLO)
+VUPK(lsh, s32, s16, UPKLO)
+#undef VUPK
 #undef UPKHI
 #undef UPKLO
 
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index a280db1..17784d7 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6340,6 +6340,10 @@ GEN_VXFORM(vsr, 2, 11);
         tcg_temp_free_ptr(rd);                                         \
     }
 
+GEN_VXFORM_NOA(vupkhsb, 7, 8);
+GEN_VXFORM_NOA(vupkhsh, 7, 9);
+GEN_VXFORM_NOA(vupklsb, 7, 10);
+GEN_VXFORM_NOA(vupklsh, 7, 11);
 GEN_VXFORM_NOA(vupkhpx, 7, 13);
 GEN_VXFORM_NOA(vupklpx, 7, 15);
 
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 29/40] Add GEN_VAFORM_PAIRED macro for subsequent instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (27 preceding siblings ...)
  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 ` Nathan Froyd
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 30/40] Add vmsum{u,m}bm instructions Nathan Froyd
                   ` (11 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:10 UTC (permalink / raw)
  To: qemu-devel


Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
---
 target-ppc/translate.c |   23 +++++++++++++++++++++++
 1 files changed, 23 insertions(+), 0 deletions(-)

diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 17784d7..94086b3 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6445,6 +6445,29 @@ GEN_HANDLER(vsldoi, 0x04, 0x16, 0xFF, 0x00000400, PPC_ALTIVEC)
     tcg_temp_free(sh);
 }
 
+#define GEN_VAFORM_PAIRED(name0, name1, opc2)                           \
+    GEN_HANDLER(name0##_##name1, 0x04, opc2, 0xFF, 0x00000000, PPC_ALTIVEC) \
+    {                                                                   \
+        TCGv_ptr ra, rb, rc, rd;                                        \
+        if (unlikely(!ctx->altivec_enabled)) {                          \
+            gen_exception(ctx, POWERPC_EXCP_VPU);                       \
+            return;                                                     \
+        }                                                               \
+        ra = gen_avr_ptr(rA(ctx->opcode));                              \
+        rb = gen_avr_ptr(rB(ctx->opcode));                              \
+        rc = gen_avr_ptr(rC(ctx->opcode));                              \
+        rd = gen_avr_ptr(rD(ctx->opcode));                              \
+        if (Rc(ctx->opcode)) {                                          \
+            gen_helper_##name1 (rd, ra, rb, rc);                        \
+        } else {                                                        \
+            gen_helper_##name0 (rd, ra, rb, rc);                        \
+        }                                                               \
+        tcg_temp_free_ptr(ra);                                          \
+        tcg_temp_free_ptr(rb);                                          \
+        tcg_temp_free_ptr(rc);                                          \
+        tcg_temp_free_ptr(rd);                                          \
+    }
+
 /***                           SPE extension                               ***/
 /* Register moves */
 
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 30/40] Add vmsum{u,m}bm instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (28 preceding siblings ...)
  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 ` Nathan Froyd
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 31/40] Add vsel and vperm instructions Nathan Froyd
                   ` (10 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:10 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index 26ff038..dbd00f5 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -191,6 +191,8 @@ DEF_HELPER_2(vupkhsb, void, avr, avr)
 DEF_HELPER_2(vupkhsh, void, avr, avr)
 DEF_HELPER_2(vupklsb, void, avr, avr)
 DEF_HELPER_2(vupklsh, void, avr, avr)
+DEF_HELPER_4(vmsumubm, void, avr, avr, avr, avr)
+DEF_HELPER_4(vmsummbm, void, avr, avr, avr, avr)
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 29c1f5d..7b4824e 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2173,6 +2173,34 @@ VMRG(w, u32)
 #undef MRGHI
 #undef MRGLO
 
+void helper_vmsummbm (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
+{
+    int32_t prod[16];
+    int i;
+
+    for (i = 0; i < ARRAY_SIZE(r->s8); i++) {
+        prod[i] = (int32_t)a->s8[i] * b->u8[i];
+    }
+
+    VECTOR_FOR_INORDER_I(i, s32) {
+        r->s32[i] = c->s32[i] + prod[4*i] + prod[4*i+1] + prod[4*i+2] + prod[4*i+3];
+    }
+}
+
+void helper_vmsumubm (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
+{
+    uint16_t prod[16];
+    int i;
+
+    for (i = 0; i < ARRAY_SIZE(r->u8); i++) {
+        prod[i] = a->u8[i] * b->u8[i];
+    }
+
+    VECTOR_FOR_INORDER_I(i, u32) {
+        r->u32[i] = c->u32[i] + prod[4*i] + prod[4*i+1] + prod[4*i+2] + prod[4*i+3];
+    }
+}
+
 #define VMUL_DO(name, mul_element, prod_element, evenp)                 \
     void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)      \
     {                                                                   \
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 94086b3..a73c4ad 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6468,6 +6468,8 @@ GEN_HANDLER(vsldoi, 0x04, 0x16, 0xFF, 0x00000400, PPC_ALTIVEC)
         tcg_temp_free_ptr(rd);                                          \
     }
 
+GEN_VAFORM_PAIRED(vmsumubm, vmsummbm, 18)
+
 /***                           SPE extension                               ***/
 /* Register moves */
 
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 31/40] Add vsel and vperm instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (29 preceding siblings ...)
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 30/40] Add vmsum{u,m}bm instructions Nathan Froyd
@ 2008-12-31  3:10 ` Nathan Froyd
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 32/40] Add saturating arithmetic conversion functions for subsequent instructions Nathan Froyd
                   ` (9 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:10 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index dbd00f5..8bd8cf3 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -193,6 +193,8 @@ DEF_HELPER_2(vupklsb, void, avr, avr)
 DEF_HELPER_2(vupklsh, void, avr, avr)
 DEF_HELPER_4(vmsumubm, void, avr, avr, avr, avr)
 DEF_HELPER_4(vmsummbm, void, avr, avr, avr, avr)
+DEF_HELPER_4(vsel, void, avr, avr, avr, avr)
+DEF_HELPER_4(vperm, void, avr, avr, avr, avr)
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 7b4824e..7170d05 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2223,6 +2223,26 @@ VMUL(uh, u16, u32)
 #undef VMUL_DO
 #undef VMUL
 
+void helper_vperm (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
+{
+    ppc_avr_t result;
+    int i;
+    VECTOR_FOR_INORDER_I (i, u8) {
+        int s = c->u8[i] & 0x1f;
+#if defined(WORDS_BIGENDIAN)
+        int index = s & 0xf;
+#else
+        int index = 15 - (s & 0xf);
+#endif
+        if (s & 0x10) {
+            result.u8[i] = b->u8[index];
+        } else {
+            result.u8[i] = a->u8[index];
+        }
+    }
+    *r = result;
+}
+
 #define VROTATE(suffix, element)                                        \
     void helper_vrl##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)  \
     {                                                                   \
@@ -2238,6 +2258,12 @@ VROTATE(h, u16)
 VROTATE(w, u32)
 #undef VROTATE
 
+void helper_vsel (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
+{
+    r->u64[0] = (a->u64[0] & ~c->u64[0]) | (b->u64[0] & c->u64[0]);
+    r->u64[1] = (a->u64[1] & ~c->u64[1]) | (b->u64[1] & c->u64[1]);
+}
+
 #if defined(WORDS_BIGENDIAN)
 #define LEFT 0
 #define RIGHT 1
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index a73c4ad..7cf2171 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6469,6 +6469,7 @@ GEN_HANDLER(vsldoi, 0x04, 0x16, 0xFF, 0x00000400, PPC_ALTIVEC)
     }
 
 GEN_VAFORM_PAIRED(vmsumubm, vmsummbm, 18)
+GEN_VAFORM_PAIRED(vsel, vperm, 21)
 
 /***                           SPE extension                               ***/
 /* Register moves */
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 32/40] Add saturating arithmetic conversion functions for subsequent instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (30 preceding siblings ...)
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 31/40] Add vsel and vperm instructions Nathan Froyd
@ 2008-12-31  3:10 ` 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
                   ` (8 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:10 UTC (permalink / raw)
  To: qemu-devel


Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
---
 target-ppc/op_helper.c |   27 +++++++++++++++++++++++++++
 1 files changed, 27 insertions(+), 0 deletions(-)

diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 7170d05..09e1368 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -1972,6 +1972,33 @@ target_ulong helper_dlmzb (target_ulong high, target_ulong low, uint32_t update_
   for (index = ARRAY_SIZE(r->element)-1; index >= 0; index--)
 #endif
 
+/* Saturating arithmetic helpers.  */
+#define SATCVT(from, to, from_type, to_type, min, max, use_min, use_max) \
+    static always_inline to_type cvt##from##to (from_type x, int *sat)  \
+    {                                                                   \
+        to_type r;                                                      \
+        if (use_min && x < min) {                                       \
+            r = min;                                                    \
+            *sat = 1;                                                   \
+        } else if (use_max && x > max) {                                \
+            r = max;                                                    \
+            *sat = 1;                                                   \
+        } else {                                                        \
+            r = x;                                                      \
+        }                                                               \
+        return r;                                                       \
+    }
+SATCVT(sh, sb, int16_t, int8_t, INT8_MIN, INT8_MAX, 1, 1)
+SATCVT(sw, sh, int32_t, int16_t, INT16_MIN, INT16_MAX, 1, 1)
+SATCVT(sd, sw, int64_t, int32_t, INT32_MIN, INT32_MAX, 1, 1)
+SATCVT(uh, ub, uint16_t, uint8_t, 0, UINT8_MAX, 0, 1)
+SATCVT(uw, uh, uint32_t, uint16_t, 0, UINT16_MAX, 0, 1)
+SATCVT(ud, uw, uint64_t, uint32_t, 0, UINT32_MAX, 0, 1)
+SATCVT(sh, ub, int16_t, uint8_t, 0, UINT8_MAX, 1, 1)
+SATCVT(sw, uh, int32_t, uint16_t, 0, UINT16_MAX, 1, 1)
+SATCVT(sd, uw, int64_t, uint32_t, 0, UINT32_MAX, 1, 1)
+#undef SATCVT
+
 void helper_lvsl (ppc_avr_t *r, target_ulong sh)
 {
     int i, j = (sh & 0xf);
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 33/40] Add vpks{h, w}{s, u}s, vpku{h, w}us, and vpku{h, w}um instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (31 preceding siblings ...)
  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 ` Nathan Froyd
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 34/40] Add vpkpx instruction Nathan Froyd
                   ` (7 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:10 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index 8bd8cf3..a1ef4df 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -195,6 +195,14 @@ DEF_HELPER_4(vmsumubm, void, avr, avr, avr, avr)
 DEF_HELPER_4(vmsummbm, void, avr, avr, avr, avr)
 DEF_HELPER_4(vsel, void, avr, avr, avr, avr)
 DEF_HELPER_4(vperm, void, avr, avr, avr, avr)
+DEF_HELPER_3(vpkshss, void, avr, avr, avr)
+DEF_HELPER_3(vpkshus, void, avr, avr, avr)
+DEF_HELPER_3(vpkswss, void, avr, avr, avr)
+DEF_HELPER_3(vpkswus, void, avr, avr, avr)
+DEF_HELPER_3(vpkuhus, void, avr, avr, avr)
+DEF_HELPER_3(vpkuwus, void, avr, avr, avr)
+DEF_HELPER_3(vpkuhum, void, avr, avr, avr)
+DEF_HELPER_3(vpkuwum, void, avr, avr, avr)
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 09e1368..c34e1ce 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2270,6 +2270,41 @@ void helper_vperm (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
     *r = result;
 }
 
+#if defined(WORDS_BIGENDIAN)
+#define PKBIG 1
+#else
+#define PKBIG 0
+#endif
+#define VPK(suffix, from, to, cvt, dosat)       \
+    void helper_vpk##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)  \
+    {                                                                   \
+        int i;                                                          \
+        int sat = 0;                                                    \
+        ppc_avr_t result;                                               \
+        ppc_avr_t *a0 = PKBIG ? a : b;                                  \
+        ppc_avr_t *a1 = PKBIG ? b : a;                                  \
+        VECTOR_FOR_INORDER_I (i, from) {                                \
+            result.to[i] = cvt(a0->from[i], &sat);                      \
+            result.to[i+ARRAY_SIZE(r->from)] = cvt(a1->from[i], &sat);  \
+        }                                                               \
+        *r = result;                                                    \
+        if (dosat && sat) {                                             \
+            env->vscr |= (1 << VSCR_SAT);                               \
+        }                                                               \
+    }
+#define I(x, y) (x)
+VPK(shss, s16, s8, cvtshsb, 1)
+VPK(shus, s16, u8, cvtshub, 1)
+VPK(swss, s32, s16, cvtswsh, 1)
+VPK(swus, s32, u16, cvtswuh, 1)
+VPK(uhus, u16, u8, cvtuhub, 1)
+VPK(uwus, u32, u16, cvtuwuh, 1)
+VPK(uhum, u16, u8, I, 0)
+VPK(uwum, u32, u16, I, 0)
+#undef I
+#undef VPK
+#undef PKBIG
+
 #define VROTATE(suffix, element)                                        \
     void helper_vrl##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)  \
     {                                                                   \
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 7cf2171..cf69d91 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6324,6 +6324,14 @@ GEN_VXFORM(vrlh, 2, 1);
 GEN_VXFORM(vrlw, 2, 2);
 GEN_VXFORM(vsl, 2, 7);
 GEN_VXFORM(vsr, 2, 11);
+GEN_VXFORM(vpkuhum, 7, 0);
+GEN_VXFORM(vpkuwum, 7, 1);
+GEN_VXFORM(vpkuhus, 7, 2);
+GEN_VXFORM(vpkuwus, 7, 3);
+GEN_VXFORM(vpkshus, 7, 4);
+GEN_VXFORM(vpkswus, 7, 5);
+GEN_VXFORM(vpkshss, 7, 6);
+GEN_VXFORM(vpkswss, 7, 7);
 
 #define GEN_VXFORM_NOA(name, opc2, opc3)                                \
     GEN_HANDLER(name, 0x04, opc2, opc3, 0x001f0000, PPC_ALTIVEC)        \
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 34/40] Add vpkpx instruction.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (32 preceding siblings ...)
  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 ` Nathan Froyd
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 35/40] Add vmh{,r}addshs instructions Nathan Froyd
                   ` (6 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:10 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index a1ef4df..e2ad294 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -203,6 +203,7 @@ DEF_HELPER_3(vpkuhus, void, avr, avr, avr)
 DEF_HELPER_3(vpkuwus, void, avr, avr, avr)
 DEF_HELPER_3(vpkuhum, void, avr, avr, avr)
 DEF_HELPER_3(vpkuwum, void, avr, avr, avr)
+DEF_HELPER_3(vpkpx, void, avr, avr, avr)
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index c34e1ce..d64b05c 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2275,6 +2275,27 @@ void helper_vperm (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
 #else
 #define PKBIG 0
 #endif
+void helper_vpkpx (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
+{
+    int i, j;
+    ppc_avr_t result;
+#if defined(WORDS_BIGENDIAN)
+    const ppc_avr_t *x[2] = { a, b };
+#else
+    const ppc_avr_t *x[2] = { b, a };
+#endif
+
+    VECTOR_FOR_INORDER_I (i, u64) {
+        VECTOR_FOR_INORDER_I (j, u32){
+            uint32_t e = x[i]->u32[j];
+            result.u16[4*i+j] = (((e >> 9) & 0xfc00) |
+                                 ((e >> 6) & 0x3e0) |
+                                 ((e >> 3) & 0x1f));
+        }
+    }
+    *r = result;
+}
+
 #define VPK(suffix, from, to, cvt, dosat)       \
     void helper_vpk##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)  \
     {                                                                   \
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index cf69d91..bc1a1ff 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6332,6 +6332,7 @@ GEN_VXFORM(vpkshus, 7, 4);
 GEN_VXFORM(vpkswus, 7, 5);
 GEN_VXFORM(vpkshss, 7, 6);
 GEN_VXFORM(vpkswss, 7, 7);
+GEN_VXFORM(vpkpx, 7, 12);
 
 #define GEN_VXFORM_NOA(name, opc2, opc3)                                \
     GEN_HANDLER(name, 0x04, opc2, opc3, 0x001f0000, PPC_ALTIVEC)        \
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 35/40] Add vmh{,r}addshs instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (33 preceding siblings ...)
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 34/40] Add vpkpx instruction Nathan Froyd
@ 2008-12-31  3:10 ` Nathan Froyd
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 36/40] Add vmsumuh{m,s} instructions Nathan Froyd
                   ` (5 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:10 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index e2ad294..8ea8ddd 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -204,6 +204,8 @@ DEF_HELPER_3(vpkuwus, void, avr, avr, avr)
 DEF_HELPER_3(vpkuhum, void, avr, avr, avr)
 DEF_HELPER_3(vpkuwum, void, avr, avr, avr)
 DEF_HELPER_3(vpkpx, void, avr, avr, avr)
+DEF_HELPER_4(vmhaddshs, void, avr, avr, avr, avr)
+DEF_HELPER_4(vmhraddshs, void, avr, avr, avr, avr)
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index d64b05c..8c354c3 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2141,6 +2141,38 @@ VCMP(gtsh, >, s16)
 VCMP(gtsw, >, s32)
 #undef VCMP
 
+void helper_vmhaddshs (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
+{
+    int sat = 0;
+    int i;
+
+    for (i = 0; i < ARRAY_SIZE(r->s16); i++) {
+        int32_t prod = a->s16[i] * b->s16[i];
+        int32_t t = (int32_t)c->s16[i] + (prod >> 15);
+        r->s16[i] = cvtswsh (t, &sat);
+    }
+
+    if (sat) {
+        env->vscr |= (1 << VSCR_SAT);
+    }
+}
+
+void helper_vmhraddshs (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
+{
+    int sat = 0;
+    int i;
+
+    for (i = 0; i < ARRAY_SIZE(r->s16); i++) {
+        int32_t prod = a->s16[i] * b->s16[i] + 0x00004000;
+        int32_t t = (int32_t)c->s16[i] + (prod >> 15);
+        r->s16[i] = cvtswsh (t, &sat);
+    }
+
+    if (sat) {
+        env->vscr |= (1 << VSCR_SAT);
+    }
+}
+
 #define VMINMAX_DO(name, compare, element)                              \
     void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)      \
     {                                                                   \
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index bc1a1ff..ce25033 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6477,6 +6477,8 @@ GEN_HANDLER(vsldoi, 0x04, 0x16, 0xFF, 0x00000400, PPC_ALTIVEC)
         tcg_temp_free_ptr(rd);                                          \
     }
 
+GEN_VAFORM_PAIRED(vmhaddshs, vmhraddshs, 16)
+
 GEN_VAFORM_PAIRED(vmsumubm, vmsummbm, 18)
 GEN_VAFORM_PAIRED(vsel, vperm, 21)
 
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 36/40] Add vmsumuh{m,s} instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (34 preceding siblings ...)
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 35/40] Add vmh{,r}addshs instructions Nathan Froyd
@ 2008-12-31  3:10 ` Nathan Froyd
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 37/40] Add vmsumsh{m,s} instructions Nathan Froyd
                   ` (4 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:10 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index 8ea8ddd..ceb7351 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -206,6 +206,8 @@ DEF_HELPER_3(vpkuwum, void, avr, avr, avr)
 DEF_HELPER_3(vpkpx, void, avr, avr, avr)
 DEF_HELPER_4(vmhaddshs, void, avr, avr, avr, avr)
 DEF_HELPER_4(vmhraddshs, void, avr, avr, avr, avr)
+DEF_HELPER_4(vmsumuhm, void, avr, avr, avr, avr)
+DEF_HELPER_4(vmsumuhs, void, avr, avr, avr, avr)
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 8c354c3..7c72a52 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2260,6 +2260,40 @@ void helper_vmsumubm (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
     }
 }
 
+void helper_vmsumuhm (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
+{
+    uint32_t prod[8];
+    int i;
+
+    for (i = 0; i < ARRAY_SIZE(r->u16); i++) {
+        prod[i] = a->u16[i] * b->u16[i];
+    }
+
+    VECTOR_FOR_INORDER_I(i, u32) {
+        r->u32[i] = c->u32[i] + prod[2*i] + prod[2*i+1];
+    }
+}
+
+void helper_vmsumuhs (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
+{
+    uint32_t prod[8];
+    int i;
+    int sat = 0;
+
+    for (i = 0; i < ARRAY_SIZE(r->u16); i++) {
+        prod[i] = a->u16[i] * b->u16[i];
+    }
+
+    VECTOR_FOR_INORDER_I (i, s32) {
+        uint64_t t = (uint64_t)c->u32[i] + prod[2*i] + prod[2*i+1];
+        r->u32[i] = cvtuduw(t, &sat);
+    }
+
+    if (sat) {
+        env->vscr |= (1 << VSCR_SAT);
+    }
+}
+
 #define VMUL_DO(name, mul_element, prod_element, evenp)                 \
     void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)      \
     {                                                                   \
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index ce25033..9e0b58e 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6480,6 +6480,7 @@ GEN_HANDLER(vsldoi, 0x04, 0x16, 0xFF, 0x00000400, PPC_ALTIVEC)
 GEN_VAFORM_PAIRED(vmhaddshs, vmhraddshs, 16)
 
 GEN_VAFORM_PAIRED(vmsumubm, vmsummbm, 18)
+GEN_VAFORM_PAIRED(vmsumuhm, vmsumuhs, 19)
 GEN_VAFORM_PAIRED(vsel, vperm, 21)
 
 /***                           SPE extension                               ***/
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 37/40] Add vmsumsh{m,s} instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (35 preceding siblings ...)
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 36/40] Add vmsumuh{m,s} instructions Nathan Froyd
@ 2008-12-31  3:10 ` Nathan Froyd
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 38/40] Add vmladduhm instruction Nathan Froyd
                   ` (3 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:10 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index ceb7351..b4b9521 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -208,6 +208,8 @@ DEF_HELPER_4(vmhaddshs, void, avr, avr, avr, avr)
 DEF_HELPER_4(vmhraddshs, void, avr, avr, avr, avr)
 DEF_HELPER_4(vmsumuhm, void, avr, avr, avr, avr)
 DEF_HELPER_4(vmsumuhs, void, avr, avr, avr, avr)
+DEF_HELPER_4(vmsumshm, void, avr, avr, avr, avr)
+DEF_HELPER_4(vmsumshs, void, avr, avr, avr, avr)
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 7c72a52..097153e 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2246,6 +2246,40 @@ void helper_vmsummbm (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
     }
 }
 
+void helper_vmsumshm (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
+{
+    int32_t prod[8];
+    int i;
+
+    for (i = 0; i < ARRAY_SIZE(r->s16); i++) {
+        prod[i] = a->s16[i] * b->s16[i];
+    }
+
+    VECTOR_FOR_INORDER_I(i, s32) {
+        r->s32[i] = c->s32[i] + prod[2*i] + prod[2*i+1];
+    }
+}
+
+void helper_vmsumshs (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
+{
+    int32_t prod[8];
+    int i;
+    int sat = 0;
+
+    for (i = 0; i < ARRAY_SIZE(r->s16); i++) {
+        prod[i] = (int32_t)a->s16[i] * b->s16[i];
+    }
+
+    VECTOR_FOR_INORDER_I (i, s32) {
+        int64_t t = (int64_t)c->s32[i] + prod[2*i] + prod[2*i+1];
+        r->u32[i] = cvtsdsw(t, &sat);
+    }
+
+    if (sat) {
+        env->vscr |= (1 << VSCR_SAT);
+    }
+}
+
 void helper_vmsumubm (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
 {
     uint16_t prod[16];
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 9e0b58e..a9ab8d5 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6481,6 +6481,7 @@ GEN_VAFORM_PAIRED(vmhaddshs, vmhraddshs, 16)
 
 GEN_VAFORM_PAIRED(vmsumubm, vmsummbm, 18)
 GEN_VAFORM_PAIRED(vmsumuhm, vmsumuhs, 19)
+GEN_VAFORM_PAIRED(vmsumshm, vmsumshs, 20)
 GEN_VAFORM_PAIRED(vsel, vperm, 21)
 
 /***                           SPE extension                               ***/
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 38/40] Add vmladduhm instruction.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (36 preceding siblings ...)
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 37/40] Add vmsumsh{m,s} instructions Nathan Froyd
@ 2008-12-31  3:10 ` Nathan Froyd
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 39/40] Add {l,st}ve{b,h,w}x instructions Nathan Froyd
                   ` (2 subsequent siblings)
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:10 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index b4b9521..f97480e 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -210,6 +210,7 @@ DEF_HELPER_4(vmsumuhm, void, avr, avr, avr, avr)
 DEF_HELPER_4(vmsumuhs, void, avr, avr, avr, avr)
 DEF_HELPER_4(vmsumshm, void, avr, avr, avr, avr)
 DEF_HELPER_4(vmsumshs, void, avr, avr, avr, avr)
+DEF_HELPER_4(vmladduhm, void, avr, avr, avr, avr)
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 097153e..4fe6d43 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2197,12 +2197,21 @@ VMINMAX(uw, u32)
 #undef VMINMAX_DO
 #undef VMINMAX
 
+void helper_vmladduhm (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
+{
+    int i;
+    for (i = 0; i < ARRAY_SIZE(r->s16); i++) {
+        int32_t prod = a->s16[i] * b->s16[i];
+        r->s16[i] = (int16_t) (prod + c->s16[i]);
+    }
+}
+
 #define VMRG_DO(name, element, highp)                                   \
     void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)      \
     {                                                                   \
         ppc_avr_t result;                                               \
         int i;                                                          \
-        size_t n_elems = N_ELEMS(element);                              \
+        size_t n_elems = ARRAY_SIZE(r->element);                        \
         for (i = 0; i < n_elems/2; i++) {                               \
             if (highp) {                                                \
                 result.element[i*2+HI_IDX] = a->element[i];             \
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index a9ab8d5..93cebcf 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6479,6 +6479,24 @@ GEN_HANDLER(vsldoi, 0x04, 0x16, 0xFF, 0x00000400, PPC_ALTIVEC)
 
 GEN_VAFORM_PAIRED(vmhaddshs, vmhraddshs, 16)
 
+GEN_HANDLER(vmladduhm, 0x04, 0x11, 0xFF, 0x00000000, PPC_ALTIVEC)
+{
+    TCGv_ptr ra, rb, rc, rd;
+    if (unlikely(!ctx->altivec_enabled)) {
+        gen_exception(ctx, POWERPC_EXCP_VPU);
+        return;
+    }
+    ra = gen_avr_ptr(rA(ctx->opcode));
+    rb = gen_avr_ptr(rB(ctx->opcode));
+    rc = gen_avr_ptr(rC(ctx->opcode));
+    rd = gen_avr_ptr(rD(ctx->opcode));
+    gen_helper_vmladduhm(rd, ra, rb, rc);
+    tcg_temp_free_ptr(ra);
+    tcg_temp_free_ptr(rb);
+    tcg_temp_free_ptr(rc);
+    tcg_temp_free_ptr(rd);
+}
+
 GEN_VAFORM_PAIRED(vmsumubm, vmsummbm, 18)
 GEN_VAFORM_PAIRED(vmsumuhm, vmsumuhs, 19)
 GEN_VAFORM_PAIRED(vmsumshm, vmsumshs, 20)
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 39/40] Add {l,st}ve{b,h,w}x instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (37 preceding siblings ...)
  2008-12-31  3:10 ` [Qemu-devel] [PATCH 38/40] Add vmladduhm instruction Nathan Froyd
@ 2008-12-31  3:10 ` 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
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:10 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index f97480e..1dd2cf8 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -211,6 +211,12 @@ DEF_HELPER_4(vmsumuhs, void, avr, avr, avr, avr)
 DEF_HELPER_4(vmsumshm, void, avr, avr, avr, avr)
 DEF_HELPER_4(vmsumshs, void, avr, avr, avr, avr)
 DEF_HELPER_4(vmladduhm, void, avr, avr, avr, avr)
+DEF_HELPER_2(lvebx, void, avr, tl)
+DEF_HELPER_2(lvehx, void, avr, tl)
+DEF_HELPER_2(lvewx, void, avr, tl)
+DEF_HELPER_2(stvebx, void, avr, tl)
+DEF_HELPER_2(stvehx, void, avr, tl)
+DEF_HELPER_2(stvewx, void, avr, tl)
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 4fe6d43..5c45072 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -1999,6 +1999,26 @@ SATCVT(sw, uh, int32_t, uint16_t, 0, UINT16_MAX, 1, 1)
 SATCVT(sd, uw, int64_t, uint32_t, 0, UINT32_MAX, 1, 1)
 #undef SATCVT
 
+#define LVE(name, access, swap, element)                        \
+    void helper_##name (ppc_avr_t *r, target_ulong addr)        \
+    {                                                           \
+        size_t n_elems = ARRAY_SIZE(r->element);                \
+        int adjust = HI_IDX*(n_elems-1);                        \
+        int sh = sizeof(r->element[0]) >> 1;                    \
+        int index = (addr & 0xf) >> sh;                         \
+        if(msr_le) {                                            \
+            r->element[LO_IDX ? index : (adjust - index)] = swap(access(addr)); \
+        } else {                                                        \
+            r->element[LO_IDX ? index : (adjust - index)] = access(addr); \
+        }                                                               \
+    }
+#define I(x) (x)
+LVE(lvebx, ldub, I, u8)
+LVE(lvehx, lduw, bswap16, u16)
+LVE(lvewx, ldl, bswap32, u32)
+#undef I
+#undef LVE
+
 void helper_lvsl (ppc_avr_t *r, target_ulong sh)
 {
     int i, j = (sh & 0xf);
@@ -2017,6 +2037,26 @@ void helper_lvsr (ppc_avr_t *r, target_ulong sh)
     }
 }
 
+#define STVE(name, access, swap, element)                       \
+    void helper_##name (ppc_avr_t *r, target_ulong addr)        \
+    {                                                           \
+        size_t n_elems = ARRAY_SIZE(r->element);                \
+        int adjust = HI_IDX*(n_elems-1);                        \
+        int sh = sizeof(r->element[0]) >> 1;                    \
+        int index = (addr & 0xf) >> sh;                         \
+        if(msr_le) {                                            \
+            access(addr, swap(r->element[LO_IDX ? index : (adjust - index)])); \
+        } else {                                                        \
+            access(addr, r->element[LO_IDX ? index : (adjust - index)]); \
+        }                                                               \
+    }
+#define I(x) (x)
+STVE(stvebx, stb, I, u8)
+STVE(stvehx, stw, bswap16, u16)
+STVE(stvewx, stl, bswap32, u32)
+#undef I
+#undef LVE
+
 void helper_vaddcuw (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
 {
     int i;
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 93cebcf..2ec9d19 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6144,14 +6144,58 @@ GEN_HANDLER(st##name, 0x1F, opc2, opc3, 0x00000001, PPC_ALTIVEC)              \
     tcg_temp_free(EA);                                                        \
 }
 
+#define GEN_VR_LVE(name, opc2, opc3)                                    \
+    GEN_HANDLER(lve##name, 0x1F, opc2, opc3, 0x00000001, PPC_ALTIVEC)   \
+    {                                                                   \
+        TCGv EA;                                                        \
+        TCGv_ptr rs;                                                    \
+        if (unlikely(!ctx->altivec_enabled)) {                          \
+            gen_exception(ctx, POWERPC_EXCP_VPU);                       \
+            return;                                                     \
+        }                                                               \
+        gen_set_access_type(ctx, ACCESS_INT);                           \
+        EA = tcg_temp_new();                                            \
+        gen_addr_reg_index(ctx, EA);                                    \
+        rs = gen_avr_ptr(rS(ctx->opcode));                              \
+        gen_helper_lve##name (rs, EA);                                  \
+        tcg_temp_free(EA);                                              \
+        tcg_temp_free_ptr(rs);                                          \
+    }
+
+#define GEN_VR_STVE(name, opc2, opc3)                                   \
+    GEN_HANDLER(stve##name, 0x1F, opc2, opc3, 0x00000001, PPC_ALTIVEC)  \
+    {                                                                   \
+        TCGv EA;                                                        \
+        TCGv_ptr rs;                                                    \
+        if (unlikely(!ctx->altivec_enabled)) {                          \
+            gen_exception(ctx, POWERPC_EXCP_VPU);                       \
+            return;                                                     \
+        }                                                               \
+        gen_set_access_type(ctx, ACCESS_INT);                           \
+        EA = tcg_temp_new();                                            \
+        gen_addr_reg_index(ctx, EA);                                    \
+        rs = gen_avr_ptr(rS(ctx->opcode));                              \
+        gen_helper_stve##name (rs, EA);                                 \
+        tcg_temp_free(EA);                                              \
+        tcg_temp_free_ptr(rs);                                          \
+    }
+
 GEN_VR_LDX(lvx, 0x07, 0x03);
 /* As we don't emulate the cache, lvxl is stricly equivalent to lvx */
 GEN_VR_LDX(lvxl, 0x07, 0x0B);
 
+GEN_VR_LVE(bx, 0x07, 0x00);
+GEN_VR_LVE(hx, 0x07, 0x01);
+GEN_VR_LVE(wx, 0x07, 0x02);
+
 GEN_VR_STX(svx, 0x07, 0x07);
 /* As we don't emulate the cache, stvxl is stricly equivalent to stvx */
 GEN_VR_STX(svxl, 0x07, 0x0F);
 
+GEN_VR_STVE(bx, 0x07, 0x04);
+GEN_VR_STVE(hx, 0x07, 0x05);
+GEN_VR_STVE(wx, 0x07, 0x06);
+
 GEN_HANDLER(lvsl, 0x1f, 0x06, 0x00, 0x00000001, PPC_ALTIVEC)
 {
     TCGv_ptr rd;
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* [Qemu-devel] [PATCH 40/40] Add vsumsws, vsum2sws, and vsum4{sbs, shs, ubs} instructions.
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (38 preceding siblings ...)
  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 ` Nathan Froyd
  2009-01-04 22:20 ` [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Aurelien Jarno
  40 siblings, 0 replies; 68+ messages in thread
From: Nathan Froyd @ 2008-12-31  3:10 UTC (permalink / raw)
  To: qemu-devel


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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index 1dd2cf8..51760a1 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -217,6 +217,11 @@ DEF_HELPER_2(lvewx, void, avr, tl)
 DEF_HELPER_2(stvebx, void, avr, tl)
 DEF_HELPER_2(stvehx, void, avr, tl)
 DEF_HELPER_2(stvewx, void, avr, tl)
+DEF_HELPER_3(vsumsws, void, avr, avr, avr)
+DEF_HELPER_3(vsum2sws, void, avr, avr, avr)
+DEF_HELPER_3(vsum4sbs, void, avr, avr, avr)
+DEF_HELPER_3(vsum4shs, void, avr, avr, avr)
+DEF_HELPER_3(vsum4ubs, void, avr, avr, avr)
 
 DEF_HELPER_1(efscfsi, i32, i32)
 DEF_HELPER_1(efscfui, i32, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 5c45072..d72b011 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2667,6 +2667,109 @@ void helper_vsubcuw (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
     }
 }
 
+void helper_vsumsws (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
+{
+    int64_t t;
+    int i, upper;
+    ppc_avr_t result;
+    int sat = 0;
+
+#if defined(WORDS_BIGENDIAN)
+    upper = ARRAY_SIZE(r->s32)-1;
+#else
+    upper = 0;
+#endif
+    t = (int64_t)b->s32[upper];
+    for (i = 0; i < ARRAY_SIZE(r->s32); i++) {
+        t += a->s32[i];
+        result.s32[i] = 0;
+    }
+    result.s32[upper] = cvtsdsw(t, &sat);
+    *r = result;
+
+    if (sat) {
+        env->vscr |= (1 << VSCR_SAT);
+    }
+}
+
+void helper_vsum2sws (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
+{
+    int i, j, upper;
+    ppc_avr_t result;
+    int sat = 0;
+
+#if defined(WORDS_BIGENDIAN)
+    upper = 1;
+#else
+    upper = 0;
+#endif
+    for (i = 0; i < ARRAY_SIZE(r->u64); i++) {
+        int64_t t = (int64_t)b->s32[upper+i*2];
+        result.u64[i] = 0;
+        for (j = 0; j < ARRAY_SIZE(r->u64); j++) {
+            t += a->s32[2*i+j];
+        }
+        result.s32[upper+i*2] = cvtsdsw(t, &sat);
+    }
+
+    *r = result;
+    if (sat) {
+        env->vscr |= (1 << VSCR_SAT);
+    }
+}
+
+void helper_vsum4sbs (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
+{
+    int i, j;
+    int sat = 0;
+
+    for (i = 0; i < ARRAY_SIZE(r->s32); i++) {
+        int64_t t = (int64_t)b->s32[i];
+        for (j = 0; j < ARRAY_SIZE(r->s32); j++) {
+            t += a->s8[4*i+j];
+        }
+        r->s32[i] = cvtsdsw(t, &sat);
+    }
+
+    if (sat) {
+        env->vscr |= (1 << VSCR_SAT);
+    }
+}
+
+void helper_vsum4shs (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
+{
+    int sat = 0;
+    int i;
+
+    for (i = 0; i < ARRAY_SIZE(r->s32); i++) {
+        int64_t t = (int64_t)b->s32[i];
+        t += a->s16[2*i] + a->s16[2*i+1];
+        r->s32[i] = cvtsdsw(t, &sat);
+    }
+
+    if (sat) {
+        env->vscr |= (1 << VSCR_SAT);
+    }
+}
+
+void helper_vsum4ubs (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
+{
+    int i, j;
+    int sat = 0;
+
+    for (i = 0; i < ARRAY_SIZE(r->u32); i++) {
+        uint64_t t = (uint64_t)b->u32[i];
+        for (j = 0; j < ARRAY_SIZE(r->u32); j++) {
+            t += a->u8[4*i+j];
+        }
+        r->u32[i] = cvtuduw(t, &sat);
+    }
+
+    if (sat) {
+        env->vscr |= (1 << VSCR_SAT);
+    }
+}
+
 #if defined(WORDS_BIGENDIAN)
 #define UPKHI 1
 #define UPKLO 0
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 2ec9d19..593c5dd 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6377,6 +6377,11 @@ GEN_VXFORM(vpkswus, 7, 5);
 GEN_VXFORM(vpkshss, 7, 6);
 GEN_VXFORM(vpkswss, 7, 7);
 GEN_VXFORM(vpkpx, 7, 12);
+GEN_VXFORM(vsum4ubs, 4, 24);
+GEN_VXFORM(vsum4sbs, 4, 28);
+GEN_VXFORM(vsum4shs, 4, 25);
+GEN_VXFORM(vsum2sws, 4, 26);
+GEN_VXFORM(vsumsws, 4, 30);
 
 #define GEN_VXFORM_NOA(name, opc2, opc3)                                \
     GEN_HANDLER(name, 0x04, opc2, opc3, 0x001f0000, PPC_ALTIVEC)        \
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 01/40] Fix TCG error in gen_avr_ptr.
  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
  0 siblings, 0 replies; 68+ messages in thread
From: Aurelien Jarno @ 2009-01-03 13:31 UTC (permalink / raw)
  To: Nathan Froyd; +Cc: qemu-devel

On Tue, Dec 30, 2008 at 07:09:43PM -0800, Nathan Froyd wrote:
> 
> Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
> ---

Thanks, applied.

>  target-ppc/translate.c |    2 +-
>  1 files changed, 1 insertions(+), 1 deletions(-)
> 
> diff --git a/target-ppc/translate.c b/target-ppc/translate.c
> index 80a08b1..7ba9c26 100644
> --- a/target-ppc/translate.c
> +++ b/target-ppc/translate.c
> @@ -6085,7 +6085,7 @@ GEN_HANDLER2(icbt_440, "icbt", 0x1F, 0x16, 0x00, 0x03E00001, PPC_BOOKE)
>  
>  static always_inline TCGv_ptr gen_avr_ptr(int reg)
>  {
> -    TCGv_ptr r = tcg_temp_new();
> +    TCGv_ptr r = tcg_temp_new_ptr();
>      tcg_gen_addi_ptr(r, cpu_env, offsetof(CPUPPCState, avr[reg]));
>      return r;
>  }
> -- 
> 1.6.0.5
> 
> 
> 
> 

-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 02/40] Add helper macros for later patches.
  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
  0 siblings, 0 replies; 68+ messages in thread
From: Aurelien Jarno @ 2009-01-03 13:32 UTC (permalink / raw)
  To: Nathan Froyd; +Cc: qemu-devel

On Tue, Dec 30, 2008 at 07:09:44PM -0800, Nathan Froyd wrote:
> Remove N_ELEMS, VECTOR_FOR, and VECTOR_FOR_I macros.  Retain the
> VECTOR_FOR_INORDER_I macros as the clearest way of expressing the intent
> of iterating over elements in their stored target-endian order.
> 
> Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>

Thanks, applied.

> ---
>  target-ppc/op_helper.c |   22 ++++++++++++++++++++++
>  1 files changed, 22 insertions(+), 0 deletions(-)
> 
> diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
> index 876b517..5d603ba 100644
> --- a/target-ppc/op_helper.c
> +++ b/target-ppc/op_helper.c
> @@ -1954,6 +1954,28 @@ target_ulong helper_dlmzb (target_ulong high, target_ulong low, uint32_t update_
>  }
>  
>  /*****************************************************************************/
> +/* Altivec extension helpers */
> +#if defined(WORDS_BIGENDIAN)
> +#define HI_IDX 0
> +#define LO_IDX 1
> +#else
> +#define HI_IDX 1
> +#define LO_IDX 0
> +#endif
> +
> +#if defined(WORDS_BIGENDIAN)
> +#define VECTOR_FOR_INORDER_I(index, element)            \
> +    for (index = 0; index < ARRAY_SIZE(r->element); index++)
> +#else
> +#define VECTOR_FOR_INORDER_I(index, element)            \
> +  for (index = ARRAY_SIZE(r->element)-1; index >= 0; index--)
> +#endif
> +
> +#undef VECTOR_FOR_INORDER_I
> +#undef HI_IDX
> +#undef LO_IDX
> +
> +/*****************************************************************************/
>  /* SPE extension helpers */
>  /* Use a table to make this quicker */
>  static uint8_t hbrev[16] = {
> -- 
> 1.6.0.5
> 
> 
> 
> 

-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 03/40] Add GEN_VXFORM macro for subsequent instructions.
  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
  0 siblings, 0 replies; 68+ messages in thread
From: Aurelien Jarno @ 2009-01-03 13:32 UTC (permalink / raw)
  To: Nathan Froyd; +Cc: qemu-devel

On Tue, Dec 30, 2008 at 07:09:45PM -0800, Nathan Froyd wrote:
> 
> Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
> ---
>  target-ppc/translate.c |   17 +++++++++++++++++
>  1 files changed, 17 insertions(+), 0 deletions(-)

Thanks, applied.

> diff --git a/target-ppc/translate.c b/target-ppc/translate.c
> index 7ba9c26..4ae780b 100644
> --- a/target-ppc/translate.c
> +++ b/target-ppc/translate.c
> @@ -6164,6 +6164,23 @@ GEN_VX_LOGICAL(vor, tcg_gen_or_i64, 2, 18);
>  GEN_VX_LOGICAL(vxor, tcg_gen_xor_i64, 2, 19);
>  GEN_VX_LOGICAL(vnor, tcg_gen_nor_i64, 2, 20);
>  
> +#define GEN_VXFORM(name, opc2, opc3)                                    \
> +GEN_HANDLER(name, 0x04, opc2, opc3, 0x00000000, PPC_ALTIVEC)            \
> +{                                                                       \
> +    TCGv_ptr ra, rb, rd;                                                \
> +    if (unlikely(!ctx->altivec_enabled)) {                              \
> +        gen_exception(ctx, POWERPC_EXCP_VPU);                           \
> +        return;                                                         \
> +    }                                                                   \
> +    ra = gen_avr_ptr(rA(ctx->opcode));                                  \
> +    rb = gen_avr_ptr(rB(ctx->opcode));                                  \
> +    rd = gen_avr_ptr(rD(ctx->opcode));                                  \
> +    gen_helper_##name (rd, ra, rb);                                     \
> +    tcg_temp_free_ptr(ra);                                              \
> +    tcg_temp_free_ptr(rb);                                              \
> +    tcg_temp_free_ptr(rd);                                              \
> +}
> +
>  /***                           SPE extension                               ***/
>  /* Register moves */
>  
> -- 
> 1.6.0.5
> 
> 
> 
> 

-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 04/40] Add v{add,sub}u{b,h,w}m instructions.
  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
  0 siblings, 0 replies; 68+ messages in thread
From: Aurelien Jarno @ 2009-01-03 13:33 UTC (permalink / raw)
  To: Nathan Froyd; +Cc: qemu-devel

On Tue, Dec 30, 2008 at 07:09:46PM -0800, Nathan Froyd wrote:
> 
> Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
> ---
>  target-ppc/helper.h    |    9 +++++++++
>  target-ppc/op_helper.c |   17 +++++++++++++++++
>  target-ppc/translate.c |    6 ++++++
>  3 files changed, 32 insertions(+), 0 deletions(-)

Thanks, applied.

> diff --git a/target-ppc/helper.h b/target-ppc/helper.h
> index 6b5728c..e69fceb 100644
> --- a/target-ppc/helper.h
> +++ b/target-ppc/helper.h
> @@ -96,6 +96,15 @@ DEF_HELPER_1(fres, i64, i64)
>  DEF_HELPER_1(frsqrte, i64, i64)
>  DEF_HELPER_3(fsel, i64, i64, i64, i64)
>  
> +#define dh_alias_avr ptr
> +#define dh_ctype_avr ppc_avr_t *
> +
> +DEF_HELPER_3(vaddubm, void, avr, avr, avr)
> +DEF_HELPER_3(vadduhm, void, avr, avr, avr)
> +DEF_HELPER_3(vadduwm, void, avr, avr, avr)
> +DEF_HELPER_3(vsububm, void, avr, avr, avr)
> +DEF_HELPER_3(vsubuhm, void, avr, avr, avr)
> +DEF_HELPER_3(vsubuwm, void, avr, avr, avr)
>  DEF_HELPER_1(efscfsi, i32, i32)
>  DEF_HELPER_1(efscfui, i32, i32)
>  DEF_HELPER_1(efscfuf, i32, i32)
> diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
> index 5d603ba..6d4bd1e 100644
> --- a/target-ppc/op_helper.c
> +++ b/target-ppc/op_helper.c
> @@ -1971,6 +1971,23 @@ target_ulong helper_dlmzb (target_ulong high, target_ulong low, uint32_t update_
>    for (index = ARRAY_SIZE(r->element)-1; index >= 0; index--)
>  #endif
>  
> +#define VARITH_DO(name, op, element)        \
> +void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)          \
> +{                                                                       \
> +    int i;                                                              \
> +    for (i = 0; i < ARRAY_SIZE(r->element); i++) {                      \
> +        r->element[i] = a->element[i] op b->element[i];                 \
> +    }                                                                   \
> +}
> +#define VARITH(suffix, element)                  \
> +  VARITH_DO(add##suffix, +, element)             \
> +  VARITH_DO(sub##suffix, -, element)
> +VARITH(ubm, u8)
> +VARITH(uhm, u16)
> +VARITH(uwm, u32)
> +#undef VARITH_DO
> +#undef VARITH
> +
>  #undef VECTOR_FOR_INORDER_I
>  #undef HI_IDX
>  #undef LO_IDX
> diff --git a/target-ppc/translate.c b/target-ppc/translate.c
> index 4ae780b..a35ff1a 100644
> --- a/target-ppc/translate.c
> +++ b/target-ppc/translate.c
> @@ -6181,6 +6181,12 @@ GEN_HANDLER(name, 0x04, opc2, opc3, 0x00000000, PPC_ALTIVEC)            \
>      tcg_temp_free_ptr(rd);                                              \
>  }
>  
> +GEN_VXFORM(vaddubm, 0, 0);
> +GEN_VXFORM(vadduhm, 0, 1);
> +GEN_VXFORM(vadduwm, 0, 2);
> +GEN_VXFORM(vsububm, 0, 16);
> +GEN_VXFORM(vsubuhm, 0, 17);
> +GEN_VXFORM(vsubuwm, 0, 18);
>  /***                           SPE extension                               ***/
>  /* Register moves */
>  
> -- 
> 1.6.0.5
> 
> 
> 
> 

-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 05/40] Add vavg{s,u}{b,h,w} instructions.
  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
  0 siblings, 0 replies; 68+ messages in thread
From: Aurelien Jarno @ 2009-01-03 13:33 UTC (permalink / raw)
  To: Nathan Froyd; +Cc: qemu-devel

On Tue, Dec 30, 2008 at 07:09:47PM -0800, Nathan Froyd wrote:
> 
> Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
> ---
>  target-ppc/helper.h    |    7 +++++++
>  target-ppc/op_helper.c |   19 +++++++++++++++++++
>  target-ppc/translate.c |    7 +++++++
>  3 files changed, 33 insertions(+), 0 deletions(-)

Thanks, applied.

> diff --git a/target-ppc/helper.h b/target-ppc/helper.h
> index e69fceb..214bbf1 100644
> --- a/target-ppc/helper.h
> +++ b/target-ppc/helper.h
> @@ -105,6 +105,13 @@ DEF_HELPER_3(vadduwm, void, avr, avr, avr)
>  DEF_HELPER_3(vsububm, void, avr, avr, avr)
>  DEF_HELPER_3(vsubuhm, void, avr, avr, avr)
>  DEF_HELPER_3(vsubuwm, void, avr, avr, avr)
> +DEF_HELPER_3(vavgub, void, avr, avr, avr)
> +DEF_HELPER_3(vavguh, void, avr, avr, avr)
> +DEF_HELPER_3(vavguw, void, avr, avr, avr)
> +DEF_HELPER_3(vavgsb, void, avr, avr, avr)
> +DEF_HELPER_3(vavgsh, void, avr, avr, avr)
> +DEF_HELPER_3(vavgsw, void, avr, avr, avr)
> +
>  DEF_HELPER_1(efscfsi, i32, i32)
>  DEF_HELPER_1(efscfui, i32, i32)
>  DEF_HELPER_1(efscfuf, i32, i32)
> diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
> index 6d4bd1e..8f2508f 100644
> --- a/target-ppc/op_helper.c
> +++ b/target-ppc/op_helper.c
> @@ -1988,6 +1988,25 @@ VARITH(uwm, u32)
>  #undef VARITH_DO
>  #undef VARITH
>  
> +#define VAVG_DO(name, element, etype)                                   \
> +    void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)      \
> +    {                                                                   \
> +        int i;                                                          \
> +        for (i = 0; i < ARRAY_SIZE(r->element); i++) {                  \
> +            etype x = (etype)a->element[i] + (etype)b->element[i] + 1;  \
> +            r->element[i] = x >> 1;                                     \
> +        }                                                               \
> +    }
> +
> +#define VAVG(type, signed_element, signed_type, unsigned_element, unsigned_type) \
> +    VAVG_DO(avgs##type, signed_element, signed_type)                    \
> +    VAVG_DO(avgu##type, unsigned_element, unsigned_type)
> +VAVG(b, s8, int16_t, u8, uint16_t)
> +VAVG(h, s16, int32_t, u16, uint32_t)
> +VAVG(w, s32, int64_t, u32, uint64_t)
> +#undef VAVG_DO
> +#undef VAVG
> +
>  #undef VECTOR_FOR_INORDER_I
>  #undef HI_IDX
>  #undef LO_IDX
> diff --git a/target-ppc/translate.c b/target-ppc/translate.c
> index a35ff1a..1ccd37e 100644
> --- a/target-ppc/translate.c
> +++ b/target-ppc/translate.c
> @@ -6187,6 +6187,13 @@ GEN_VXFORM(vadduwm, 0, 2);
>  GEN_VXFORM(vsububm, 0, 16);
>  GEN_VXFORM(vsubuhm, 0, 17);
>  GEN_VXFORM(vsubuwm, 0, 18);
> +GEN_VXFORM(vavgub, 1, 16);
> +GEN_VXFORM(vavguh, 1, 17);
> +GEN_VXFORM(vavguw, 1, 18);
> +GEN_VXFORM(vavgsb, 1, 20);
> +GEN_VXFORM(vavgsh, 1, 21);
> +GEN_VXFORM(vavgsw, 1, 22);
> +
>  /***                           SPE extension                               ***/
>  /* Register moves */
>  
> -- 
> 1.6.0.5
> 
> 
> 
> 

-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 06/40] Add v{min, max}{s, u}{b, h, w} instructions.
  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
  0 siblings, 0 replies; 68+ messages in thread
From: Aurelien Jarno @ 2009-01-03 13:33 UTC (permalink / raw)
  To: Nathan Froyd; +Cc: qemu-devel

On Tue, Dec 30, 2008 at 07:09:48PM -0800, Nathan Froyd wrote:
> 
> Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
> ---
>  target-ppc/helper.h    |   12 ++++++++++++
>  target-ppc/op_helper.c |   24 ++++++++++++++++++++++++
>  target-ppc/translate.c |   12 ++++++++++++
>  3 files changed, 48 insertions(+), 0 deletions(-)

Thanks, applied.

> diff --git a/target-ppc/helper.h b/target-ppc/helper.h
> index 214bbf1..196106e 100644
> --- a/target-ppc/helper.h
> +++ b/target-ppc/helper.h
> @@ -111,6 +111,18 @@ DEF_HELPER_3(vavguw, void, avr, avr, avr)
>  DEF_HELPER_3(vavgsb, void, avr, avr, avr)
>  DEF_HELPER_3(vavgsh, void, avr, avr, avr)
>  DEF_HELPER_3(vavgsw, void, avr, avr, avr)
> +DEF_HELPER_3(vminsb, void, avr, avr, avr)
> +DEF_HELPER_3(vminsh, void, avr, avr, avr)
> +DEF_HELPER_3(vminsw, void, avr, avr, avr)
> +DEF_HELPER_3(vmaxsb, void, avr, avr, avr)
> +DEF_HELPER_3(vmaxsh, void, avr, avr, avr)
> +DEF_HELPER_3(vmaxsw, void, avr, avr, avr)
> +DEF_HELPER_3(vminub, void, avr, avr, avr)
> +DEF_HELPER_3(vminuh, void, avr, avr, avr)
> +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_1(efscfsi, i32, i32)
>  DEF_HELPER_1(efscfui, i32, i32)
> diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
> index 8f2508f..367c366 100644
> --- a/target-ppc/op_helper.c
> +++ b/target-ppc/op_helper.c
> @@ -2007,6 +2007,30 @@ VAVG(w, s32, int64_t, u32, uint64_t)
>  #undef VAVG_DO
>  #undef VAVG
>  
> +#define VMINMAX_DO(name, compare, element)                              \
> +    void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)      \
> +    {                                                                   \
> +        int i;                                                          \
> +        for (i = 0; i < ARRAY_SIZE(r->element); i++) {                  \
> +            if (a->element[i] compare b->element[i]) {                  \
> +                r->element[i] = b->element[i];                          \
> +            } else {                                                    \
> +                r->element[i] = a->element[i];                          \
> +            }                                                           \
> +        }                                                               \
> +    }
> +#define VMINMAX(suffix, element)                \
> +  VMINMAX_DO(min##suffix, >, element)           \
> +  VMINMAX_DO(max##suffix, <, element)
> +VMINMAX(sb, s8)
> +VMINMAX(sh, s16)
> +VMINMAX(sw, s32)
> +VMINMAX(ub, u8)
> +VMINMAX(uh, u16)
> +VMINMAX(uw, u32)
> +#undef VMINMAX_DO
> +#undef VMINMAX
> +
>  #undef VECTOR_FOR_INORDER_I
>  #undef HI_IDX
>  #undef LO_IDX
> diff --git a/target-ppc/translate.c b/target-ppc/translate.c
> index 1ccd37e..56d5c51 100644
> --- a/target-ppc/translate.c
> +++ b/target-ppc/translate.c
> @@ -6187,6 +6187,18 @@ GEN_VXFORM(vadduwm, 0, 2);
>  GEN_VXFORM(vsububm, 0, 16);
>  GEN_VXFORM(vsubuhm, 0, 17);
>  GEN_VXFORM(vsubuwm, 0, 18);
> +GEN_VXFORM(vmaxub, 1, 0);
> +GEN_VXFORM(vmaxuh, 1, 1);
> +GEN_VXFORM(vmaxuw, 1, 2);
> +GEN_VXFORM(vmaxsb, 1, 4);
> +GEN_VXFORM(vmaxsh, 1, 5);
> +GEN_VXFORM(vmaxsw, 1, 6);
> +GEN_VXFORM(vminub, 1, 8);
> +GEN_VXFORM(vminuh, 1, 9);
> +GEN_VXFORM(vminuw, 1, 10);
> +GEN_VXFORM(vminsb, 1, 12);
> +GEN_VXFORM(vminsh, 1, 13);
> +GEN_VXFORM(vminsw, 1, 14);
>  GEN_VXFORM(vavgub, 1, 16);
>  GEN_VXFORM(vavguh, 1, 17);
>  GEN_VXFORM(vavguw, 1, 18);
> -- 
> 1.6.0.5
> 
> 
> 
> 

-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 07/40] Add GEN_VXRFORM{, 1} macros for subsequent instructions.
  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
  0 siblings, 1 reply; 68+ messages in thread
From: Aurelien Jarno @ 2009-01-03 13:58 UTC (permalink / raw)
  To: Nathan Froyd; +Cc: qemu-devel

On Tue, Dec 30, 2008 at 07:09:49PM -0800, Nathan Froyd wrote:
> 
> Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
> ---
>  target-ppc/translate.c |   27 +++++++++++++++++++++++++++
>  1 files changed, 27 insertions(+), 0 deletions(-)
> 
> diff --git a/target-ppc/translate.c b/target-ppc/translate.c
> index 56d5c51..967d9da 100644
> --- a/target-ppc/translate.c
> +++ b/target-ppc/translate.c
> @@ -6206,6 +6206,33 @@ GEN_VXFORM(vavgsb, 1, 20);
>  GEN_VXFORM(vavgsh, 1, 21);
>  GEN_VXFORM(vavgsw, 1, 22);
>  
> +#define GEN_VXRFORM1(opname, name, str, opc2, opc3)                     \
> +    GEN_HANDLER2(name, str, 0x4, opc2, opc3, 0x00000000, PPC_ALTIVEC)   \
> +    {                                                                   \
> +        TCGv_ptr ra, rb, rd;                                            \
> +        TCGv_i32 result;                                                \
> +        if (unlikely(!ctx->altivec_enabled)) {                          \
> +            gen_exception(ctx, POWERPC_EXCP_VPU);                       \
> +            return;                                                     \
> +        }                                                               \
> +        ra = gen_avr_ptr(rA(ctx->opcode));                              \
> +        rb = gen_avr_ptr(rB(ctx->opcode));                              \
> +        rd = gen_avr_ptr(rD(ctx->opcode));                              \
> +        result = tcg_temp_new_i32();                                    \
> +        gen_helper_##opname (result, rd, ra, rb);                       \
> +        if (opc3 & 0x1) {                                               \

This should be opc3 & (0x1 << 4).

> +            tcg_gen_mov_i32(cpu_crf[6], result);                        \
> +        }                                                               \

By the way, given those functions are using helpers, it may be better to
have one helper for normal functions and one helper for '.' functions
which directly write env->crf[6]. It would probably be a bit faster.

Note that the other PowerPC instructions are maybe not the best
templates for that, given they have been translated from dyngen. I am
planning to fold part of the TCG code directly into the helper for some
of them.

> +        tcg_temp_free_ptr(ra);                                          \
> +        tcg_temp_free_ptr(rb);                                          \
> +        tcg_temp_free_ptr(rd);                                          \
> +        tcg_temp_free_i32(result);                                      \
> +    }
> +
> +#define GEN_VXRFORM(name, opc2, opc3)                                \
> +    GEN_VXRFORM1(name, name, #name, opc2, opc3)                      \
> +    GEN_VXRFORM1(name, name##_, #name ".", opc2, (opc3 | (0x1 << 4)))
> +
>  /***                           SPE extension                               ***/
>  /* Register moves */
>  
> -- 
> 1.6.0.5
> 
> 
> 
> 

-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 08/40] Add vcmpequ{b, h, w} and vcmpgt{s, u}{b, h, w} instructions.
  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
  0 siblings, 1 reply; 68+ messages in thread
From: Aurelien Jarno @ 2009-01-03 14:02 UTC (permalink / raw)
  To: Nathan Froyd; +Cc: qemu-devel

On Tue, Dec 30, 2008 at 07:09:50PM -0800, Nathan Froyd wrote:
> 
> Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
> ---
>  target-ppc/helper.h    |    9 +++++++++
>  target-ppc/op_helper.c |   34 ++++++++++++++++++++++++++++++++++
>  target-ppc/translate.c |   10 ++++++++++
>  3 files changed, 53 insertions(+), 0 deletions(-)
> 
> diff --git a/target-ppc/helper.h b/target-ppc/helper.h
> index 196106e..efe7a1a 100644
> --- a/target-ppc/helper.h
> +++ b/target-ppc/helper.h
> @@ -123,6 +123,15 @@ 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, i32, avr, avr, avr)
> +DEF_HELPER_3(vcmpequh, i32, avr, avr, avr)
> +DEF_HELPER_3(vcmpequw, i32, avr, avr, avr)
> +DEF_HELPER_3(vcmpgtub, i32, avr, avr, avr)
> +DEF_HELPER_3(vcmpgtuh, i32, avr, avr, avr)
> +DEF_HELPER_3(vcmpgtuw, i32, avr, avr, avr)
> +DEF_HELPER_3(vcmpgtsb, i32, avr, avr, avr)
> +DEF_HELPER_3(vcmpgtsh, i32, avr, avr, avr)
> +DEF_HELPER_3(vcmpgtsw, i32, avr, avr, avr)
>  
>  DEF_HELPER_1(efscfsi, i32, i32)
>  DEF_HELPER_1(efscfui, i32, i32)
> diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
> index 367c366..5daa62f 100644
> --- a/target-ppc/op_helper.c
> +++ b/target-ppc/op_helper.c
> @@ -2007,6 +2007,40 @@ VAVG(w, s32, int64_t, u32, uint64_t)
>  #undef VAVG_DO
>  #undef VAVG
>  
> +#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;

> +        return ((all != 0) << 3) | ((none == 0) << 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
> +
>  #define VMINMAX_DO(name, compare, element)                              \
>      void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)      \
>      {                                                                   \
> diff --git a/target-ppc/translate.c b/target-ppc/translate.c
> index 967d9da..7ebdb21 100644
> --- a/target-ppc/translate.c
> +++ b/target-ppc/translate.c
> @@ -6233,6 +6233,16 @@ GEN_VXFORM(vavgsw, 1, 22);
>      GEN_VXRFORM1(name, name, #name, opc2, opc3)                      \
>      GEN_VXRFORM1(name, 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)
> +
>  /***                           SPE extension                               ***/
>  /* Register moves */
>  
> -- 
> 1.6.0.5
> 
> 
> 
> 

-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 09/40] Add vscr access macros.
  2008-12-31  3:09 ` [Qemu-devel] [PATCH 09/40] Add vscr access macros Nathan Froyd
@ 2009-01-03 14:04   ` Aurelien Jarno
  0 siblings, 0 replies; 68+ messages in thread
From: Aurelien Jarno @ 2009-01-03 14:04 UTC (permalink / raw)
  To: Nathan Froyd; +Cc: qemu-devel

On Tue, Dec 30, 2008 at 07:09:51PM -0800, Nathan Froyd wrote:
> 
> Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
> ---
>  target-ppc/cpu.h |    7 +++++++
>  1 files changed, 7 insertions(+), 0 deletions(-)

Thanks, applied.

> diff --git a/target-ppc/cpu.h b/target-ppc/cpu.h
> index f7600c4..113bba5 100644
> --- a/target-ppc/cpu.h
> +++ b/target-ppc/cpu.h
> @@ -525,6 +525,13 @@ enum {
>                     0x1F)
>  
>  /*****************************************************************************/
> +/* Vector status and control register */
> +#define VSCR_NJ		16 /* Vector non-java */
> +#define VSCR_SAT	0 /* Vector saturation */
> +#define vscr_nj		(((env->vscr) >> VSCR_NJ)	& 0x1)
> +#define vscr_sat	(((env->vscr) >> VSCR_SAT)	& 0x1)
> +
> +/*****************************************************************************/
>  /* The whole PowerPC CPU context */
>  #define NB_MMU_MODES 3
>  
> -- 
> 1.6.0.5
> 
> 
> 
> 

-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 17/40] Add m{f,t}vscr instructions.
  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
  0 siblings, 0 replies; 68+ messages in thread
From: Aurelien Jarno @ 2009-01-03 19:43 UTC (permalink / raw)
  To: Nathan Froyd; +Cc: qemu-devel

On Tue, Dec 30, 2008 at 07:09:59PM -0800, Nathan Froyd wrote:
> 
> Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
> ---
>  target-ppc/translate.c |   37 +++++++++++++++++++++++++++++++++++++
>  1 files changed, 37 insertions(+), 0 deletions(-)
> 
> diff --git a/target-ppc/translate.c b/target-ppc/translate.c
> index 4e1bd23..5c13ed2 100644
> --- a/target-ppc/translate.c
> +++ b/target-ppc/translate.c
> @@ -6178,6 +6178,43 @@ GEN_HANDLER(lvsr, 0x1f, 0x06, 0x01, 0x00000001, PPC_ALTIVEC)
>      tcg_temp_free_ptr(rd);
>  }
>  
> +static always_inline uint32_t gen_vscr_offset (int r)
> +{
> +#if defined(WORDS_BIGENDIAN)
> +    return offsetof(CPUPPCState, avr[r].u32[3]);
> +#else
> +    return offsetof(CPUPPCState, avr[r].u32[0]);
> +#endif
> +}
> +
> +GEN_HANDLER(mfvscr, 0x04, 0x2, 0x18, 0x001ff800, PPC_ALTIVEC)
> +{
> +    TCGv_i32 t;
> +    if (unlikely(!ctx->altivec_enabled)) {
> +        gen_exception(ctx, POWERPC_EXCP_VPU);
> +        return;
> +    }
> +    tcg_gen_movi_i64(cpu_avrh[rD(ctx->opcode)], 0);
> +    tcg_gen_movi_i64(cpu_avrl[rD(ctx->opcode)], 0);
> +    t = tcg_temp_new_i32();
> +    tcg_gen_ld_i32(t, cpu_env, offsetof(CPUState, vscr));
> +    tcg_gen_st_i32(t, cpu_env, gen_vscr_offset(rD(ctx->opcode)));
> +    tcg_temp_free_i32(t);
> +}

TCG doesn't like when a variable is accessed through both a TCG register
and a TCG load/store in the same TB. This is most probably the problem
you are seeing with mfvscr/mtvscr.

I suggest you to replace the movi_i64 to cpu_avrl and the st_i32 by a
extu_i32_i64 to cpu_avrl.

> +GEN_HANDLER(mtvscr, 0x04, 0x2, 0x19, 0x03ff0000, PPC_ALTIVEC)
> +{
> +    TCGv_i32 t;
> +    if (unlikely(!ctx->altivec_enabled)) {
> +        gen_exception(ctx, POWERPC_EXCP_VPU);
> +        return;
> +    }
> +    t = tcg_temp_new_i32();
> +    tcg_gen_ld_i32(t, cpu_env, gen_vscr_offset(rB(ctx->opcode)));
> +    tcg_gen_st_i32(t, cpu_env, offsetof(CPUState, vscr));
> +    tcg_temp_free_i32(t);
> +}

The same way, the ld_i32 can be replaced by a trunc_i64_i32 on cpu_avrl.
This way you can get rid of gen_vscr_offset().

>  /* Logical operations */
>  #define GEN_VX_LOGICAL(name, tcg_op, opc2, opc3)                        \
>  GEN_HANDLER(name, 0x04, opc2, opc3, 0x00000000, PPC_ALTIVEC)            \

-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 18/40] Add v{add, sub}{s, u}{b, h, w}s instructions.
  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
  0 siblings, 1 reply; 68+ messages in thread
From: Aurelien Jarno @ 2009-01-03 21:13 UTC (permalink / raw)
  To: Nathan Froyd; +Cc: qemu-devel

On Tue, Dec 30, 2008 at 07:10:00PM -0800, Nathan Froyd wrote:
> 
> Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
> ---
>  target-ppc/helper.h    |   12 ++++++++++++
>  target-ppc/op_helper.c |   46 ++++++++++++++++++++++++++++++++++++++++++++++
>  target-ppc/translate.c |   12 ++++++++++++
>  3 files changed, 70 insertions(+), 0 deletions(-)
> 
> diff --git a/target-ppc/helper.h b/target-ppc/helper.h
> index 1d05cb2..4e1c307 100644
> --- a/target-ppc/helper.h
> +++ b/target-ppc/helper.h
> @@ -161,6 +161,18 @@ DEF_HELPER_3(vaddcuw, void, avr, avr, avr)
>  DEF_HELPER_3(vsubcuw, void, avr, avr, avr)
>  DEF_HELPER_2(lvsl, void, avr, tl);
>  DEF_HELPER_2(lvsr, void, avr, tl);
> +DEF_HELPER_3(vaddsbs, void, avr, avr, avr)
> +DEF_HELPER_3(vaddshs, void, avr, avr, avr)
> +DEF_HELPER_3(vaddsws, void, avr, avr, avr)
> +DEF_HELPER_3(vsubsbs, void, avr, avr, avr)
> +DEF_HELPER_3(vsubshs, void, avr, avr, avr)
> +DEF_HELPER_3(vsubsws, void, avr, avr, avr)
> +DEF_HELPER_3(vaddubs, void, avr, avr, avr)
> +DEF_HELPER_3(vadduhs, void, avr, avr, avr)
> +DEF_HELPER_3(vadduws, void, avr, avr, avr)
> +DEF_HELPER_3(vsububs, void, avr, avr, avr)
> +DEF_HELPER_3(vsubuhs, void, avr, avr, avr)
> +DEF_HELPER_3(vsubuws, void, avr, avr, avr)
>  
>  DEF_HELPER_1(efscfsi, i32, i32)
>  DEF_HELPER_1(efscfui, i32, i32)
> diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
> index 0b44e7c..1468656 100644
> --- a/target-ppc/op_helper.c
> +++ b/target-ppc/op_helper.c
> @@ -2015,6 +2015,52 @@ VARITH(uwm, u32)
>  #undef VARITH_DO
>  #undef VARITH
>  
> +#define VARITHSAT_CASE(type, op, min, max, use_min, use_max, element)   \
> +    {                                                                   \
> +        type result = (type)a->element[i] op (type)b->element[i];       \
> +        if (use_min && result < min) {                                  \
> +            result = min;                                               \
> +            sat = 1;                                                    \
> +        } else if (use_max && result > max) {                           \
> +            result = max;                                               \
> +            sat = 1;                                                    \
> +        }                                                               \
> +        r->element[i] = result;                                         \
> +    }
> +
> +#define VARITHSAT_DO(name, op, min, max, use_min, use_max, element)     \
> +    void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)      \
> +    {                                                                   \
> +        int sat = 0;                                                    \
> +        int i;                                                          \
> +        for (i = 0; i < ARRAY_SIZE(r->element); i++) {                  \
> +            switch (sizeof(r->element[0])) {                            \
> +            case 1: VARITHSAT_CASE(int16_t, op, min, max, use_min, use_max, element); break; \
> +            case 2: VARITHSAT_CASE(int32_t, op, min, max, use_min, use_max, element); break; \
> +            case 4: VARITHSAT_CASE(int64_t, op, min, max, use_min, use_max, element); break; \
> +            }                                                           \
> +        }                                                               \
> +        if (sat) {                                                      \
> +            env->vscr |= (1 << VSCR_SAT);                               \
> +        }                                                               \
> +    }
> +#define VARITHSAT_SIGNED(suffix, element, min, max)             \
> +  VARITHSAT_DO(adds##suffix##s, +, min, max, 1, 1, element)     \
> +  VARITHSAT_DO(subs##suffix##s, -, min, max, 1, 1, element)
> +#define VARITHSAT_UNSIGNED(suffix, element, max)                 \
> +  VARITHSAT_DO(addu##suffix##s, +, 0, max, 0, 1, element)        \
> +  VARITHSAT_DO(subu##suffix##s, -, 0, max, 1, 0, element)
> +VARITHSAT_SIGNED(b, s8, INT8_MIN, INT8_MAX)
> +VARITHSAT_SIGNED(h, s16, INT16_MIN, INT16_MAX)
> +VARITHSAT_SIGNED(w, s32, INT32_MIN, INT32_MAX)
> +VARITHSAT_UNSIGNED(b, u8, UINT8_MAX)
> +VARITHSAT_UNSIGNED(h, u16, UINT16_MAX)
> +VARITHSAT_UNSIGNED(w, u32, UINT32_MAX)
> +#undef VARITHSAT_CASE
> +#undef VARITHSAT_DO
> +#undef VARITHSAT_SIGNED
> +#undef VARITHSAT_UNSIGNED
> +
>  #define VAVG_DO(name, element, etype)                                   \
>      void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)      \
>      {                                                                   \
> diff --git a/target-ppc/translate.c b/target-ppc/translate.c
> index 5c13ed2..7a6c6e4 100644
> --- a/target-ppc/translate.c
> +++ b/target-ppc/translate.c
> @@ -6301,6 +6301,18 @@ GEN_VXFORM(vslo, 6, 16);
>  GEN_VXFORM(vsro, 6, 17);
>  GEN_VXFORM(vaddcuw, 0, 6);
>  GEN_VXFORM(vsubcuw, 0, 22);
> +GEN_VXFORM(vaddubs, 0, 8);
> +GEN_VXFORM(vadduhs, 0, 9);
> +GEN_VXFORM(vadduws, 0, 10);
> +GEN_VXFORM(vaddsbs, 0, 12);
> +GEN_VXFORM(vaddshs, 0, 13);
> +GEN_VXFORM(vaddsws, 0, 14);
> +GEN_VXFORM(vsububs, 0, 24);
> +GEN_VXFORM(vsubuhs, 0, 25);
> +GEN_VXFORM(vsubuws, 0, 26);
> +GEN_VXFORM(vsubsbs, 0, 28);
> +GEN_VXFORM(vsubshs, 0, 29);
> +GEN_VXFORM(vsubsws, 0, 30);
>  
>  #define GEN_VXRFORM1(opname, name, str, opc2, opc3)                     \
>      GEN_HANDLER2(name, str, 0x4, opc2, opc3, 0x00000000, PPC_ALTIVEC)   \

This patch introduces some new warnings:
/home/aurel32/git/qemu/target-ppc/op_helper.c: In function ‘helper_vaddsws’:
/home/aurel32/git/qemu/target-ppc/op_helper.c:2122: warning: overflow in implicit constant conversion
/home/aurel32/git/qemu/target-ppc/op_helper.c:2122: warning: overflow in implicit constant conversion
/home/aurel32/git/qemu/target-ppc/op_helper.c: In function ‘helper_vsubsws’:
/home/aurel32/git/qemu/target-ppc/op_helper.c:2122: warning: overflow in implicit constant conversion
/home/aurel32/git/qemu/target-ppc/op_helper.c:2122: warning: overflow in implicit constant conversion
/home/aurel32/git/qemu/target-ppc/op_helper.c: In function ‘helper_vadduws’:
/home/aurel32/git/qemu/target-ppc/op_helper.c:2125: warning: overflow in implicit constant conversion
/home/aurel32/git/qemu/target-ppc/op_helper.c: In function ‘helper_vsubuws’:
/home/aurel32/git/qemu/target-ppc/op_helper.c:2125: warning: overflow in implicit constant conversion

-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 20/40] Add vs{l,r} instructions.
  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
  0 siblings, 1 reply; 68+ messages in thread
From: Aurelien Jarno @ 2009-01-03 21:26 UTC (permalink / raw)
  To: Nathan Froyd; +Cc: qemu-devel

On Tue, Dec 30, 2008 at 07:10:02PM -0800, Nathan Froyd wrote:
> 
> Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
> ---
>  target-ppc/helper.h    |    2 ++
>  target-ppc/op_helper.c |   36 ++++++++++++++++++++++++++++++++++++
>  target-ppc/translate.c |    2 ++
>  3 files changed, 40 insertions(+), 0 deletions(-)
> 
> diff --git a/target-ppc/helper.h b/target-ppc/helper.h
> index cf2a655..5f94e9f 100644
> --- a/target-ppc/helper.h
> +++ b/target-ppc/helper.h
> @@ -176,6 +176,8 @@ DEF_HELPER_3(vsubuws, void, avr, avr, avr)
>  DEF_HELPER_3(vrlb, void, avr, avr, avr)
>  DEF_HELPER_3(vrlh, void, avr, avr, avr)
>  DEF_HELPER_3(vrlw, void, avr, avr, avr)
> +DEF_HELPER_3(vsl, void, avr, avr, avr)
> +DEF_HELPER_3(vsr, void, avr, avr, avr)
>  
>  DEF_HELPER_1(efscfsi, i32, i32)
>  DEF_HELPER_1(efscfui, i32, i32)
> diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
> index 15eee72..ce47ef1 100644
> --- a/target-ppc/op_helper.c
> +++ b/target-ppc/op_helper.c
> @@ -2210,6 +2210,42 @@ VROTATE(h, u16)
>  VROTATE(w, u32)
>  #undef VROTATE
>  
> +#if defined(WORDS_BIGENDIAN)
> +#define LEFT 0
> +#define RIGHT 1
> +#else
> +#define LEFT 1
> +#define RIGHT 0
> +#endif
> +#define VSHIFT(suffix, leftp)                                           \
> +    void helper_vs##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)   \
> +    {                                                                   \
> +        int shift = b->u8[LO_IDX*0x15] & 0x7;                           \
> +        int doit = 1;                                                   \
> +        int i;                                                          \
> +        for (i = 0; i < ARRAY_SIZE(r->u8); i++) {                       \
> +            doit = doit && ((b->u8[i] & 0x7) == shift);                 \
> +        }                                                               \

According to the specification, the result is undefined in that case. I
think that always doing the computation is fine.

> +        if (doit) {                                                     \
> +            if (shift == 0) {                                           \
> +                *r = *a;                                                \
> +            } else if (leftp) {                                         \
> +                uint64_t carry = a->u64[LO_IDX] >> (64 - shift);        \
> +                r->u64[HI_IDX] = (a->u64[HI_IDX] << shift) | carry;     \
> +                r->u64[LO_IDX] = a->u64[LO_IDX] << shift;               \
> +            } else {                                                    \
> +                uint64_t carry = a->u64[HI_IDX] << (64 - shift);        \
> +                r->u64[LO_IDX] = (a->u64[LO_IDX] >> shift) | carry;     \
> +                r->u64[HI_IDX] = a->u64[HI_IDX] >> shift;               \
> +            }                                                           \
> +        }                                                               \
> +    }
> +VSHIFT(l, LEFT)
> +VSHIFT(r, RIGHT)
> +#undef VSHIFT
> +#undef LEFT
> +#undef RIGHT
> +
>  #define VSL(suffix, element)                                            \
>      void helper_vsl##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)  \
>      {                                                                   \
> diff --git a/target-ppc/translate.c b/target-ppc/translate.c
> index a853683..b50aba3 100644
> --- a/target-ppc/translate.c
> +++ b/target-ppc/translate.c
> @@ -6316,6 +6316,8 @@ GEN_VXFORM(vsubsws, 0, 30);
>  GEN_VXFORM(vrlb, 2, 0);
>  GEN_VXFORM(vrlh, 2, 1);
>  GEN_VXFORM(vrlw, 2, 2);
> +GEN_VXFORM(vsl, 2, 7);
> +GEN_VXFORM(vsr, 2, 11);
>  
>  #define GEN_VXRFORM1(opname, name, str, opc2, opc3)                     \
>      GEN_HANDLER2(name, str, 0x4, opc2, opc3, 0x00000000, PPC_ALTIVEC)   \
> -- 
> 1.6.0.5
> 
> 
> 
> 

-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 23/40] Add vspltis{b,h,w} instructions.
  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
  0 siblings, 1 reply; 68+ messages in thread
From: Aurelien Jarno @ 2009-01-03 21:43 UTC (permalink / raw)
  To: Nathan Froyd; +Cc: qemu-devel

On Tue, Dec 30, 2008 at 07:10:05PM -0800, Nathan Froyd wrote:
> 
> Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
> ---
>  target-ppc/helper.h    |    3 +++
>  target-ppc/op_helper.c |   17 +++++++++++++++++
>  target-ppc/translate.c |    4 ++++
>  3 files changed, 24 insertions(+), 0 deletions(-)
> 
> diff --git a/target-ppc/helper.h b/target-ppc/helper.h
> index 02e3c10..9fbcc4a 100644
> --- a/target-ppc/helper.h
> +++ b/target-ppc/helper.h
> @@ -179,6 +179,9 @@ DEF_HELPER_3(vrlw, void, avr, avr, avr)
>  DEF_HELPER_3(vsl, void, avr, avr, avr)
>  DEF_HELPER_3(vsr, void, avr, avr, avr)
>  DEF_HELPER_4(vsldoi, void, avr, avr, avr, i32)
> +DEF_HELPER_2(vspltisb, void, avr, i32)
> +DEF_HELPER_2(vspltish, void, avr, i32)
> +DEF_HELPER_2(vspltisw, void, avr, i32)
>  
>  DEF_HELPER_1(efscfsi, i32, i32)
>  DEF_HELPER_1(efscfui, i32, i32)
> diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
> index d0748b2..55f341f 100644
> --- a/target-ppc/op_helper.c
> +++ b/target-ppc/op_helper.c
> @@ -2302,6 +2302,23 @@ void helper_vslo (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)
>  #endif
>  }
>  
> +#define VSPLTI(suffix, element, splat_type)                     \
> +    void helper_vspltis##suffix (ppc_avr_t *r, uint32_t splat)  \
> +    {                                                           \
> +        splat_type x = (splat_type)splat;                       \
> +        int i;                                                  \
> +        /* 5-bit sign extension.  */                            \
> +        if (x & 0x10)                                           \
> +            x -= 0x20;                                          \

I don't really like this way of doing a sign extension. I would prefer
to avoid a test and do something like:
splat_type x = (int8_t)(splat << 3) >> 3;

> +        for (i = 0; i < ARRAY_SIZE(r->element); i++) {          \
> +            r->element[i] = x;                                  \
> +        }                                                       \
> +    }
> +VSPLTI(b, s8, int8_t)
> +VSPLTI(h, s16, int16_t)
> +VSPLTI(w, s32, int32_t)
> +#undef VSPLTI
> +
>  #define VSR(suffix, element)                                            \
>      void helper_vsr##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)  \
>      {                                                                   \
> diff --git a/target-ppc/translate.c b/target-ppc/translate.c
> index e590476..d9c1e60 100644
> --- a/target-ppc/translate.c
> +++ b/target-ppc/translate.c
> @@ -6339,6 +6339,10 @@ GEN_VXFORM(vsr, 2, 11);
>          tcg_temp_free_ptr(rd);                                          \
>      }
>  
> +GEN_VXFORM_SIMM(vspltisb, 6, 12);
> +GEN_VXFORM_SIMM(vspltish, 6, 13);
> +GEN_VXFORM_SIMM(vspltisw, 6, 14);
> +
>  #define GEN_VXRFORM1(opname, name, str, opc2, opc3)                     \
>      GEN_HANDLER2(name, str, 0x4, opc2, opc3, 0x00000000, PPC_ALTIVEC)   \
>      {                                                                   \
> -- 
> 1.6.0.5
> 
> 
> 
> 

-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2
  2008-12-31  3:09 [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2 Nathan Froyd
                   ` (39 preceding siblings ...)
  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 ` Aurelien Jarno
  2009-01-04 22:54   ` Aurelien Jarno
  40 siblings, 1 reply; 68+ messages in thread
From: Aurelien Jarno @ 2009-01-04 22:20 UTC (permalink / raw)
  To: Nathan Froyd; +Cc: qemu-devel

On Tue, Dec 30, 2008 at 07:09:42PM -0800, Nathan Froyd wrote:
> This is a follow-on to:
> 
>   http://lists.gnu.org/archive/html/qemu-devel/2008-12/msg01000.html
> 
> as Aurelien asked me to modify the notation for defining instructions in
> target-ppc/translate.c.  Since that change touched nearly every patch in
> the series, I figured I would also take the opportunity to eliminate the
> VECTOR_FOR macros that my patch used as well.  I also fixed up various
> TCG errors that turned up under DEBUG_TCG.
> 
> I did, however, leave the VECTOR_FOR_INORDER_I macros in place; I think
> they are the clearest way to indicate that vectors are being iterated
> over in target-endian order.  Better than `#if defined(WORDS_BIGENDIAN)'
> all over the code, IMHO.
> 
> As the message in:
> 
>   http://lists.gnu.org/archive/html/qemu-devel/2008-12/msg01106.html
> 
> indicated, m{f,t}vscr seems to be broken in some way; the code looks
> correct to me, but I can't seem to puzzle out what's wrong with it.  All
> other instructions have been tested against an Altivec hardware
> implementation.  Except for the VSCR issue above, the simulated
> instructions perform identically to their hardware-implemented versions.
> 

Thanks for your great work. I have applied all the patches of the series
except the following ones, for which I have already send comments:

- Add GEN_VXRFORM{, 1} macros for subsequent instructions.
- Add vcmpequ{b, h, w} and vcmpgt{s, u}{b, h, w} instructions.
- Add m{f,t}vscr instructions.
- Add v{add, sub}{s, u}{b, h, w}s instructions.
- Add vs{l,r} instructions.
- Add vspltis{b,h,w} instructions.

-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH] target-ppc: add integer Altivec instructions, take 2
  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
  0 siblings, 0 replies; 68+ messages in thread
From: Aurelien Jarno @ 2009-01-04 22:54 UTC (permalink / raw)
  To: Nathan Froyd; +Cc: qemu-devel

On Sun, Jan 04, 2009 at 11:20:26PM +0100, Aurelien Jarno wrote:
> On Tue, Dec 30, 2008 at 07:09:42PM -0800, Nathan Froyd wrote:
> > This is a follow-on to:
> > 
> >   http://lists.gnu.org/archive/html/qemu-devel/2008-12/msg01000.html
> > 
> > as Aurelien asked me to modify the notation for defining instructions in
> > target-ppc/translate.c.  Since that change touched nearly every patch in
> > the series, I figured I would also take the opportunity to eliminate the
> > VECTOR_FOR macros that my patch used as well.  I also fixed up various
> > TCG errors that turned up under DEBUG_TCG.
> > 
> > I did, however, leave the VECTOR_FOR_INORDER_I macros in place; I think
> > they are the clearest way to indicate that vectors are being iterated
> > over in target-endian order.  Better than `#if defined(WORDS_BIGENDIAN)'
> > all over the code, IMHO.
> > 
> > As the message in:
> > 
> >   http://lists.gnu.org/archive/html/qemu-devel/2008-12/msg01106.html
> > 
> > indicated, m{f,t}vscr seems to be broken in some way; the code looks
> > correct to me, but I can't seem to puzzle out what's wrong with it.  All
> > other instructions have been tested against an Altivec hardware
> > implementation.  Except for the VSCR issue above, the simulated
> > instructions perform identically to their hardware-implemented versions.
> > 
> 
> Thanks for your great work. I have applied all the patches of the series
> except the following ones, for which I have already send comments:
> 
> - Add GEN_VXRFORM{, 1} macros for subsequent instructions.
> - Add vcmpequ{b, h, w} and vcmpgt{s, u}{b, h, w} instructions.
> - Add m{f,t}vscr instructions.

I have just committed a different patch for m{f,t}vscr instructions
(r6190). With this patch those instructions are working on my system.
Could you please confirm that it works with your testsuite?

-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 20/40] Add vs{l,r} instructions.
  2009-01-03 21:26   ` Aurelien Jarno
@ 2009-01-05 18:29     ` Nathan Froyd
  2009-01-05 19:27       ` Aurelien Jarno
  0 siblings, 1 reply; 68+ messages in thread
From: Nathan Froyd @ 2009-01-05 18:29 UTC (permalink / raw)
  To: qemu-devel

On Sat, Jan 03, 2009 at 10:26:55PM +0100, Aurelien Jarno wrote:
> On Tue, Dec 30, 2008 at 07:10:02PM -0800, Nathan Froyd wrote:
> > +#define VSHIFT(suffix, leftp)                                           \
> > +    void helper_vs##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)   \
> > +    {                                                                   \
> > +        int shift = b->u8[LO_IDX*0x15] & 0x7;                           \
> > +        int doit = 1;                                                   \
> > +        int i;                                                          \
> > +        for (i = 0; i < ARRAY_SIZE(r->u8); i++) {                       \
> > +            doit = doit && ((b->u8[i] & 0x7) == shift);                 \
> > +        }                                                               \
> 
> According to the specification, the result is undefined in that case. I
> think that always doing the computation is fine.

FWIW, doing the check has the nice property of delivering the same
results as real hardware.  If you're using a comparison program like
ppctester, reducing those spurious failures is a win.  (There's already
spurious failures for div instructions in corner cases.)

-Nathan

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 20/40] Add vs{l,r} instructions.
  2009-01-05 18:29     ` Nathan Froyd
@ 2009-01-05 19:27       ` Aurelien Jarno
  2009-01-07 21:25         ` Nathan Froyd
  0 siblings, 1 reply; 68+ messages in thread
From: Aurelien Jarno @ 2009-01-05 19:27 UTC (permalink / raw)
  To: Nathan Froyd; +Cc: qemu-devel

On Mon, Jan 05, 2009 at 10:29:56AM -0800, Nathan Froyd wrote:
> On Sat, Jan 03, 2009 at 10:26:55PM +0100, Aurelien Jarno wrote:
> > On Tue, Dec 30, 2008 at 07:10:02PM -0800, Nathan Froyd wrote:
> > > +#define VSHIFT(suffix, leftp)                                           \
> > > +    void helper_vs##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)   \
> > > +    {                                                                   \
> > > +        int shift = b->u8[LO_IDX*0x15] & 0x7;                           \
> > > +        int doit = 1;                                                   \
> > > +        int i;                                                          \
> > > +        for (i = 0; i < ARRAY_SIZE(r->u8); i++) {                       \
> > > +            doit = doit && ((b->u8[i] & 0x7) == shift);                 \
> > > +        }                                                               \
> > 
> > According to the specification, the result is undefined in that case. I
> > think that always doing the computation is fine.
> 
> FWIW, doing the check has the nice property of delivering the same
> results as real hardware.  If you're using a comparison program like
> ppctester, reducing those spurious failures is a win.  (There's already
> spurious failures for div instructions in corner cases.)

Then I am fine with that. Could you please just add a comment that it is
not necessary according to the spec, but done to match real hardware?

-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 07/40] Add GEN_VXRFORM{, 1} macros for subsequent instructions.
  2009-01-03 13:58   ` Aurelien Jarno
@ 2009-01-07 21:22     ` Nathan Froyd
  2009-01-08 18:55       ` Aurelien Jarno
  0 siblings, 1 reply; 68+ messages in thread
From: Nathan Froyd @ 2009-01-07 21:22 UTC (permalink / raw)
  To: qemu-devel

On Sat, Jan 03, 2009 at 02:58:03PM +0100, Aurelien Jarno wrote:
> On Tue, Dec 30, 2008 at 07:09:49PM -0800, Nathan Froyd wrote:
> > +        if (opc3 & 0x1) {                                               \
> 
> This should be opc3 & (0x1 << 4).

I knew I would screw that up, thanks for catching it.

> > +            tcg_gen_mov_i32(cpu_crf[6], result);                        \
> > +        }                                                               \
> 
> By the way, given those functions are using helpers, it may be better to
> have one helper for normal functions and one helper for '.' functions
> which directly write env->crf[6]. It would probably be a bit faster.

I'm ambivalent on this; I think that executing vcmp* instructions
happens infrequently enough that it's probably not worth optimizing them
by computing/writing the result when the record bit is set.  But the
patch below (and subsequent incoming patch for the vcmp* instructions)
implements your suggestion.

-Nathan

Use separate helpers for recording and non-recording instructions.

Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
---
 target-ppc/translate.c |   21 +++++++++++++++++++++
 1 files changed, 21 insertions(+), 0 deletions(-)

diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 03dac58..ee3c747 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6359,6 +6359,27 @@ GEN_VXFORM(vsum4shs, 4, 25);
 GEN_VXFORM(vsum2sws, 4, 26);
 GEN_VXFORM(vsumsws, 4, 30);
 
+#define GEN_VXRFORM1(opname, name, str, opc2, opc3)                     \
+    GEN_HANDLER2(name, str, 0x4, opc2, opc3, 0x00000000, PPC_ALTIVEC)   \
+    {                                                                   \
+        TCGv_ptr ra, rb, rd;                                            \
+        if (unlikely(!ctx->altivec_enabled)) {                          \
+            gen_exception(ctx, POWERPC_EXCP_VPU);                       \
+            return;                                                     \
+        }                                                               \
+        ra = gen_avr_ptr(rA(ctx->opcode));                              \
+        rb = gen_avr_ptr(rB(ctx->opcode));                              \
+        rd = gen_avr_ptr(rD(ctx->opcode));                              \
+        gen_helper_##opname (rd, ra, rb);                               \
+        tcg_temp_free_ptr(ra);                                          \
+        tcg_temp_free_ptr(rb);                                          \
+        tcg_temp_free_ptr(rd);                                          \
+    }
+
+#define GEN_VXRFORM(name, opc2, opc3)                                \
+    GEN_VXRFORM1(name, name, #name, opc2, opc3)                      \
+    GEN_VXRFORM1(name##_dot, name##_, #name ".", opc2, (opc3 | (0x1 << 4)))
+
 #define GEN_VXFORM_NOA(name, opc2, opc3)                                \
     GEN_HANDLER(name, 0x04, opc2, opc3, 0x001f0000, PPC_ALTIVEC)        \
     {                                                                   \
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 08/40] Add vcmpequ{b, h, w} and vcmpgt{s, u}{b, h, w} instructions.
  2009-01-03 14:02   ` Aurelien Jarno
@ 2009-01-07 21:23     ` Nathan Froyd
  2009-01-08 18:56       ` Aurelien Jarno
  0 siblings, 1 reply; 68+ messages in thread
From: Nathan Froyd @ 2009-01-07 21:23 UTC (permalink / raw)
  To: qemu-devel

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

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 18/40] Add v{add, sub}{s, u}{b, h, w}s instructions.
  2009-01-03 21:13   ` Aurelien Jarno
@ 2009-01-07 21:24     ` Nathan Froyd
  2009-01-08 23:19       ` Aurelien Jarno
  0 siblings, 1 reply; 68+ messages in thread
From: Nathan Froyd @ 2009-01-07 21:24 UTC (permalink / raw)
  To: qemu-devel

On Sat, Jan 03, 2009 at 10:13:20PM +0100, Aurelien Jarno wrote:
> This patch introduces some new warnings:
> /home/aurel32/git/qemu/target-ppc/op_helper.c: In function ‘helper_vaddsws’:
> /home/aurel32/git/qemu/target-ppc/op_helper.c:2122: warning: overflow in implicit constant conversion
> /home/aurel32/git/qemu/target-ppc/op_helper.c:2122: warning: overflow in implicit constant conversion
> /home/aurel32/git/qemu/target-ppc/op_helper.c: In function ‘helper_vsubsws’:
> /home/aurel32/git/qemu/target-ppc/op_helper.c:2122: warning: overflow in implicit constant conversion
> /home/aurel32/git/qemu/target-ppc/op_helper.c:2122: warning: overflow in implicit constant conversion
> /home/aurel32/git/qemu/target-ppc/op_helper.c: In function ‘helper_vadduws’:
> /home/aurel32/git/qemu/target-ppc/op_helper.c:2125: warning: overflow in implicit constant conversion
> /home/aurel32/git/qemu/target-ppc/op_helper.c: In function ‘helper_vsubuws’:
> /home/aurel32/git/qemu/target-ppc/op_helper.c:2125: warning: overflow in implicit constant conversion

Fixed thusly.  (I still get a warning for cvtuhub, which can be fixed
separately.)

-Nathan

Fix compilation warnings by using the cvt* family of functions.

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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index bae137b..009f516 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -170,6 +170,18 @@ DEF_HELPER_3(vaddcuw, void, avr, avr, avr)
 DEF_HELPER_3(vsubcuw, void, avr, avr, avr)
 DEF_HELPER_2(lvsl, void, avr, tl);
 DEF_HELPER_2(lvsr, void, avr, tl);
+DEF_HELPER_3(vaddsbs, void, avr, avr, avr)
+DEF_HELPER_3(vaddshs, void, avr, avr, avr)
+DEF_HELPER_3(vaddsws, void, avr, avr, avr)
+DEF_HELPER_3(vsubsbs, void, avr, avr, avr)
+DEF_HELPER_3(vsubshs, void, avr, avr, avr)
+DEF_HELPER_3(vsubsws, void, avr, avr, avr)
+DEF_HELPER_3(vaddubs, void, avr, avr, avr)
+DEF_HELPER_3(vadduhs, void, avr, avr, avr)
+DEF_HELPER_3(vadduws, void, avr, avr, avr)
+DEF_HELPER_3(vsububs, void, avr, avr, avr)
+DEF_HELPER_3(vsubuhs, void, avr, avr, avr)
+DEF_HELPER_3(vsubuws, void, avr, avr, avr)
 DEF_HELPER_3(vrlb, void, avr, avr, avr)
 DEF_HELPER_3(vrlh, void, avr, avr, avr)
 DEF_HELPER_3(vrlw, void, avr, avr, avr)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index eb155aa..ef19bde 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2082,6 +2082,45 @@ VARITH(uwm, u32)
 #undef VARITH_DO
 #undef VARITH
 
+#define VARITHSAT_CASE(type, op, cvt, element)                          \
+    {                                                                   \
+        type result = (type)a->element[i] op (type)b->element[i];       \
+        r->element[i] = cvt(result, &sat);                              \
+    }
+
+#define VARITHSAT_DO(name, op, optype, cvt, element)                    \
+    void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)      \
+    {                                                                   \
+        int sat = 0;                                                    \
+        int i;                                                          \
+        for (i = 0; i < ARRAY_SIZE(r->element); i++) {                  \
+            switch (sizeof(r->element[0])) {                            \
+            case 1: VARITHSAT_CASE(optype, op, cvt, element); break;    \
+            case 2: VARITHSAT_CASE(optype, op, cvt, element); break;    \
+            case 4: VARITHSAT_CASE(optype, op, cvt, element); break;    \
+            }                                                           \
+        }                                                               \
+        if (sat) {                                                      \
+            env->vscr |= (1 << VSCR_SAT);                               \
+        }                                                               \
+    }
+#define VARITHSAT_SIGNED(suffix, element, optype, cvt)        \
+    VARITHSAT_DO(adds##suffix##s, +, optype, cvt, element)    \
+    VARITHSAT_DO(subs##suffix##s, -, optype, cvt, element)
+#define VARITHSAT_UNSIGNED(suffix, element, optype, cvt)       \
+    VARITHSAT_DO(addu##suffix##s, +, optype, cvt, element)     \
+    VARITHSAT_DO(subu##suffix##s, -, optype, cvt, element)
+VARITHSAT_SIGNED(b, s8, int16_t, cvtshsb)
+VARITHSAT_SIGNED(h, s16, int32_t, cvtswsh)
+VARITHSAT_SIGNED(w, s32, int64_t, cvtsdsw)
+VARITHSAT_UNSIGNED(b, u8, uint16_t, cvtuhub)
+VARITHSAT_UNSIGNED(h, u16, uint32_t, cvtuwuh)
+VARITHSAT_UNSIGNED(w, u32, uint64_t, cvtuduw)
+#undef VARITHSAT_CASE
+#undef VARITHSAT_DO
+#undef VARITHSAT_SIGNED
+#undef VARITHSAT_UNSIGNED
+
 #define VAVG_DO(name, element, etype)                                   \
     void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)      \
     {                                                                   \
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 20e9e0c..e92156f 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6341,6 +6341,18 @@ GEN_VXFORM(vslo, 6, 16);
 GEN_VXFORM(vsro, 6, 17);
 GEN_VXFORM(vaddcuw, 0, 6);
 GEN_VXFORM(vsubcuw, 0, 22);
+GEN_VXFORM(vaddubs, 0, 8);
+GEN_VXFORM(vadduhs, 0, 9);
+GEN_VXFORM(vadduws, 0, 10);
+GEN_VXFORM(vaddsbs, 0, 12);
+GEN_VXFORM(vaddshs, 0, 13);
+GEN_VXFORM(vaddsws, 0, 14);
+GEN_VXFORM(vsububs, 0, 24);
+GEN_VXFORM(vsubuhs, 0, 25);
+GEN_VXFORM(vsubuws, 0, 26);
+GEN_VXFORM(vsubsbs, 0, 28);
+GEN_VXFORM(vsubshs, 0, 29);
+GEN_VXFORM(vsubsws, 0, 30);
 GEN_VXFORM(vrlb, 2, 0);
 GEN_VXFORM(vrlh, 2, 1);
 GEN_VXFORM(vrlw, 2, 2);
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 20/40] Add vs{l,r} instructions.
  2009-01-05 19:27       ` Aurelien Jarno
@ 2009-01-07 21:25         ` Nathan Froyd
  2009-01-08 18:56           ` Aurelien Jarno
  0 siblings, 1 reply; 68+ messages in thread
From: Nathan Froyd @ 2009-01-07 21:25 UTC (permalink / raw)
  To: qemu-devel

On Mon, Jan 05, 2009 at 08:27:30PM +0100, Aurelien Jarno wrote:
> On Mon, Jan 05, 2009 at 10:29:56AM -0800, Nathan Froyd wrote:
> > FWIW, doing the check has the nice property of delivering the same
> > results as real hardware.  If you're using a comparison program like
> > ppctester, reducing those spurious failures is a win.  (There's already
> > spurious failures for div instructions in corner cases.)
> 
> Then I am fine with that. Could you please just add a comment that it is
> not necessary according to the spec, but done to match real hardware?

Done thusly.

-Nathan

>From aa19aa5e31aa9eec36a2cdfb2e1ed806555eda96 Mon Sep 17 00:00:00 2001
From: Nathan Froyd <froydnj@codesourcery.com>
Date: Thu, 11 Dec 2008 12:02:03 -0800
Subject: [PATCH 4/5] Add vs{l,r} instructions.

Add explanatory comment about why we check equality of shift counts.

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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index 009f516..e15d6b0 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -185,6 +185,8 @@ DEF_HELPER_3(vsubuws, void, avr, avr, avr)
 DEF_HELPER_3(vrlb, void, avr, avr, avr)
 DEF_HELPER_3(vrlh, void, avr, avr, avr)
 DEF_HELPER_3(vrlw, void, avr, avr, avr)
+DEF_HELPER_3(vsl, void, avr, avr, avr)
+DEF_HELPER_3(vsr, void, avr, avr, avr)
 DEF_HELPER_4(vsldoi, void, avr, avr, avr, i32)
 DEF_HELPER_3(vspltb, void, avr, avr, i32)
 DEF_HELPER_3(vsplth, void, avr, avr, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index ef19bde..81abd63 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2491,6 +2491,45 @@ void helper_vsel (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
     r->u64[1] = (a->u64[1] & ~c->u64[1]) | (b->u64[1] & c->u64[1]);
 }
 
+#if defined(WORDS_BIGENDIAN)
+#define LEFT 0
+#define RIGHT 1
+#else
+#define LEFT 1
+#define RIGHT 0
+#endif
+/* The specification says that the results are undefined if all of the
+ * shift counts are not identical.  We check to make sure that they are
+ * to conform to what real hardware appears to do.  */
+#define VSHIFT(suffix, leftp)                                           \
+    void helper_vs##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)   \
+    {                                                                   \
+        int shift = b->u8[LO_IDX*0x15] & 0x7;                           \
+        int doit = 1;                                                   \
+        int i;                                                          \
+        for (i = 0; i < ARRAY_SIZE(r->u8); i++) {                       \
+            doit = doit && ((b->u8[i] & 0x7) == shift);                 \
+        }                                                               \
+        if (doit) {                                                     \
+            if (shift == 0) {                                           \
+                *r = *a;                                                \
+            } else if (leftp) {                                         \
+                uint64_t carry = a->u64[LO_IDX] >> (64 - shift);        \
+                r->u64[HI_IDX] = (a->u64[HI_IDX] << shift) | carry;     \
+                r->u64[LO_IDX] = a->u64[LO_IDX] << shift;               \
+            } else {                                                    \
+                uint64_t carry = a->u64[HI_IDX] << (64 - shift);        \
+                r->u64[LO_IDX] = (a->u64[LO_IDX] >> shift) | carry;     \
+                r->u64[HI_IDX] = a->u64[HI_IDX] >> shift;               \
+            }                                                           \
+        }                                                               \
+    }
+VSHIFT(l, LEFT)
+VSHIFT(r, RIGHT)
+#undef VSHIFT
+#undef LEFT
+#undef RIGHT
+
 #define VSL(suffix, element)                                            \
     void helper_vsl##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)  \
     {                                                                   \
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index e92156f..65a80f2 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6356,6 +6356,8 @@ GEN_VXFORM(vsubsws, 0, 30);
 GEN_VXFORM(vrlb, 2, 0);
 GEN_VXFORM(vrlh, 2, 1);
 GEN_VXFORM(vrlw, 2, 2);
+GEN_VXFORM(vsl, 2, 7);
+GEN_VXFORM(vsr, 2, 11);
 GEN_VXFORM(vpkuhum, 7, 0);
 GEN_VXFORM(vpkuwum, 7, 1);
 GEN_VXFORM(vpkuhus, 7, 2);
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 23/40] Add vspltis{b,h,w} instructions.
  2009-01-03 21:43   ` Aurelien Jarno
@ 2009-01-07 21:25     ` Nathan Froyd
  2009-01-08 18:57       ` Aurelien Jarno
  0 siblings, 1 reply; 68+ messages in thread
From: Nathan Froyd @ 2009-01-07 21:25 UTC (permalink / raw)
  To: qemu-devel

On Sat, Jan 03, 2009 at 10:43:54PM +0100, Aurelien Jarno wrote:
> On Tue, Dec 30, 2008 at 07:10:05PM -0800, Nathan Froyd wrote:
> > +#define VSPLTI(suffix, element, splat_type)                     \
> > +    void helper_vspltis##suffix (ppc_avr_t *r, uint32_t splat)  \
> > +    {                                                           \
> > +        splat_type x = (splat_type)splat;                       \
> > +        int i;                                                  \
> > +        /* 5-bit sign extension.  */                            \
> > +        if (x & 0x10)                                           \
> > +            x -= 0x20;                                          \
> 
> I don't really like this way of doing a sign extension. I would prefer
> to avoid a test and do something like:
> splat_type x = (int8_t)(splat << 3) >> 3;

Done thusly.

-Nathan

Use more obvious sequence for 5-bit sign extension.

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

diff --git a/target-ppc/helper.h b/target-ppc/helper.h
index e15d6b0..755bfba 100644
--- a/target-ppc/helper.h
+++ b/target-ppc/helper.h
@@ -188,6 +188,9 @@ DEF_HELPER_3(vrlw, void, avr, avr, avr)
 DEF_HELPER_3(vsl, void, avr, avr, avr)
 DEF_HELPER_3(vsr, void, avr, avr, avr)
 DEF_HELPER_4(vsldoi, void, avr, avr, avr, i32)
+DEF_HELPER_2(vspltisb, void, avr, i32)
+DEF_HELPER_2(vspltish, void, avr, i32)
+DEF_HELPER_2(vspltisw, void, avr, i32)
 DEF_HELPER_3(vspltb, void, avr, avr, i32)
 DEF_HELPER_3(vsplth, void, avr, avr, i32)
 DEF_HELPER_3(vspltw, void, avr, avr, i32)
diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
index 81abd63..dc8ddfe 100644
--- a/target-ppc/op_helper.c
+++ b/target-ppc/op_helper.c
@@ -2609,6 +2609,20 @@ VSPLT(w, u32)
 #undef SPLAT_ELEMENT
 #undef _SPLAT_MASKED
 
+#define VSPLTI(suffix, element, splat_type)                     \
+    void helper_vspltis##suffix (ppc_avr_t *r, uint32_t splat)  \
+    {                                                           \
+        splat_type x = (int8_t)(splat << 3) >> 3;               \
+        int i;                                                  \
+        for (i = 0; i < ARRAY_SIZE(r->element); i++) {          \
+            r->element[i] = x;                                  \
+        }                                                       \
+    }
+VSPLTI(b, s8, int8_t)
+VSPLTI(h, s16, int16_t)
+VSPLTI(w, s32, int32_t)
+#undef VSPLTI
+
 #define VSR(suffix, element)                                            \
     void helper_vsr##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)  \
     {                                                                   \
diff --git a/target-ppc/translate.c b/target-ppc/translate.c
index 65a80f2..6bb81d2 100644
--- a/target-ppc/translate.c
+++ b/target-ppc/translate.c
@@ -6404,6 +6404,26 @@ GEN_VXRFORM(vcmpgtub, 3, 8)
 GEN_VXRFORM(vcmpgtuh, 3, 9)
 GEN_VXRFORM(vcmpgtuw, 3, 10)
 
+#define GEN_VXFORM_SIMM(name, opc2, opc3)                               \
+    GEN_HANDLER(name, 0x04, opc2, opc3, 0x00000000, PPC_ALTIVEC)        \
+    {                                                                   \
+        TCGv_ptr rd;                                                    \
+        TCGv_i32 simm;                                                  \
+        if (unlikely(!ctx->altivec_enabled)) {                          \
+            gen_exception(ctx, POWERPC_EXCP_VPU);                       \
+            return;                                                     \
+        }                                                               \
+        simm = tcg_const_i32(SIMM5(ctx->opcode));                       \
+        rd = gen_avr_ptr(rD(ctx->opcode));                              \
+        gen_helper_##name (rd, simm);                                   \
+        tcg_temp_free_i32(simm);                                        \
+        tcg_temp_free_ptr(rd);                                          \
+    }
+
+GEN_VXFORM_SIMM(vspltisb, 6, 12);
+GEN_VXFORM_SIMM(vspltish, 6, 13);
+GEN_VXFORM_SIMM(vspltisw, 6, 14);
+
 #define GEN_VXFORM_NOA(name, opc2, opc3)                                \
     GEN_HANDLER(name, 0x04, opc2, opc3, 0x001f0000, PPC_ALTIVEC)        \
     {                                                                   \
-- 
1.6.0.5

^ permalink raw reply related	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 07/40] Add GEN_VXRFORM{, 1} macros for subsequent instructions.
  2009-01-07 21:22     ` Nathan Froyd
@ 2009-01-08 18:55       ` Aurelien Jarno
  0 siblings, 0 replies; 68+ messages in thread
From: Aurelien Jarno @ 2009-01-08 18:55 UTC (permalink / raw)
  To: Nathan Froyd; +Cc: qemu-devel

On Wed, Jan 07, 2009 at 01:22:11PM -0800, Nathan Froyd wrote:
> On Sat, Jan 03, 2009 at 02:58:03PM +0100, Aurelien Jarno wrote:
> > On Tue, Dec 30, 2008 at 07:09:49PM -0800, Nathan Froyd wrote:
> > > +        if (opc3 & 0x1) {                                               \
> > 
> > This should be opc3 & (0x1 << 4).
> 
> I knew I would screw that up, thanks for catching it.
> 
> > > +            tcg_gen_mov_i32(cpu_crf[6], result);                        \
> > > +        }                                                               \
> > 
> > By the way, given those functions are using helpers, it may be better to
> > have one helper for normal functions and one helper for '.' functions
> > which directly write env->crf[6]. It would probably be a bit faster.
> 
> I'm ambivalent on this; I think that executing vcmp* instructions
> happens infrequently enough that it's probably not worth optimizing them
> by computing/writing the result when the record bit is set.  But the
> patch below (and subsequent incoming patch for the vcmp* instructions)
> implements your suggestion.
> 
> -Nathan
> 
> Use separate helpers for recording and non-recording instructions.
> 
> Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>

Thanks, applied.

> ---
>  target-ppc/translate.c |   21 +++++++++++++++++++++
>  1 files changed, 21 insertions(+), 0 deletions(-)
> 
> diff --git a/target-ppc/translate.c b/target-ppc/translate.c
> index 03dac58..ee3c747 100644
> --- a/target-ppc/translate.c
> +++ b/target-ppc/translate.c
> @@ -6359,6 +6359,27 @@ GEN_VXFORM(vsum4shs, 4, 25);
>  GEN_VXFORM(vsum2sws, 4, 26);
>  GEN_VXFORM(vsumsws, 4, 30);
>  
> +#define GEN_VXRFORM1(opname, name, str, opc2, opc3)                     \
> +    GEN_HANDLER2(name, str, 0x4, opc2, opc3, 0x00000000, PPC_ALTIVEC)   \
> +    {                                                                   \
> +        TCGv_ptr ra, rb, rd;                                            \
> +        if (unlikely(!ctx->altivec_enabled)) {                          \
> +            gen_exception(ctx, POWERPC_EXCP_VPU);                       \
> +            return;                                                     \
> +        }                                                               \
> +        ra = gen_avr_ptr(rA(ctx->opcode));                              \
> +        rb = gen_avr_ptr(rB(ctx->opcode));                              \
> +        rd = gen_avr_ptr(rD(ctx->opcode));                              \
> +        gen_helper_##opname (rd, ra, rb);                               \
> +        tcg_temp_free_ptr(ra);                                          \
> +        tcg_temp_free_ptr(rb);                                          \
> +        tcg_temp_free_ptr(rd);                                          \
> +    }
> +
> +#define GEN_VXRFORM(name, opc2, opc3)                                \
> +    GEN_VXRFORM1(name, name, #name, opc2, opc3)                      \
> +    GEN_VXRFORM1(name##_dot, name##_, #name ".", opc2, (opc3 | (0x1 << 4)))
> +
>  #define GEN_VXFORM_NOA(name, opc2, opc3)                                \
>      GEN_HANDLER(name, 0x04, opc2, opc3, 0x001f0000, PPC_ALTIVEC)        \
>      {                                                                   \
> -- 
> 1.6.0.5
> 
> 
> 
> 
> 

-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 08/40] Add vcmpequ{b, h, w} and vcmpgt{s, u}{b, h, w} instructions.
  2009-01-07 21:23     ` Nathan Froyd
@ 2009-01-08 18:56       ` Aurelien Jarno
  0 siblings, 0 replies; 68+ messages in thread
From: Aurelien Jarno @ 2009-01-08 18:56 UTC (permalink / raw)
  To: Nathan Froyd; +Cc: qemu-devel

On Wed, Jan 07, 2009 at 01:23:10PM -0800, Nathan Froyd wrote:
> 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>

Thanks, applied.

> ---
>  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
> 
> 
> 
> 

-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 20/40] Add vs{l,r} instructions.
  2009-01-07 21:25         ` Nathan Froyd
@ 2009-01-08 18:56           ` Aurelien Jarno
  0 siblings, 0 replies; 68+ messages in thread
From: Aurelien Jarno @ 2009-01-08 18:56 UTC (permalink / raw)
  To: Nathan Froyd; +Cc: qemu-devel

On Wed, Jan 07, 2009 at 01:25:02PM -0800, Nathan Froyd wrote:
> On Mon, Jan 05, 2009 at 08:27:30PM +0100, Aurelien Jarno wrote:
> > On Mon, Jan 05, 2009 at 10:29:56AM -0800, Nathan Froyd wrote:
> > > FWIW, doing the check has the nice property of delivering the same
> > > results as real hardware.  If you're using a comparison program like
> > > ppctester, reducing those spurious failures is a win.  (There's already
> > > spurious failures for div instructions in corner cases.)
> > 
> > Then I am fine with that. Could you please just add a comment that it is
> > not necessary according to the spec, but done to match real hardware?
> 
> Done thusly.

Thanks, applied

> -Nathan
> 
> From aa19aa5e31aa9eec36a2cdfb2e1ed806555eda96 Mon Sep 17 00:00:00 2001
> From: Nathan Froyd <froydnj@codesourcery.com>
> Date: Thu, 11 Dec 2008 12:02:03 -0800
> Subject: [PATCH 4/5] Add vs{l,r} instructions.
> 
> Add explanatory comment about why we check equality of shift counts.
> 
> Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
> ---
>  target-ppc/helper.h    |    2 ++
>  target-ppc/op_helper.c |   39 +++++++++++++++++++++++++++++++++++++++
>  target-ppc/translate.c |    2 ++
>  3 files changed, 43 insertions(+), 0 deletions(-)
> 
> diff --git a/target-ppc/helper.h b/target-ppc/helper.h
> index 009f516..e15d6b0 100644
> --- a/target-ppc/helper.h
> +++ b/target-ppc/helper.h
> @@ -185,6 +185,8 @@ DEF_HELPER_3(vsubuws, void, avr, avr, avr)
>  DEF_HELPER_3(vrlb, void, avr, avr, avr)
>  DEF_HELPER_3(vrlh, void, avr, avr, avr)
>  DEF_HELPER_3(vrlw, void, avr, avr, avr)
> +DEF_HELPER_3(vsl, void, avr, avr, avr)
> +DEF_HELPER_3(vsr, void, avr, avr, avr)
>  DEF_HELPER_4(vsldoi, void, avr, avr, avr, i32)
>  DEF_HELPER_3(vspltb, void, avr, avr, i32)
>  DEF_HELPER_3(vsplth, void, avr, avr, i32)
> diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
> index ef19bde..81abd63 100644
> --- a/target-ppc/op_helper.c
> +++ b/target-ppc/op_helper.c
> @@ -2491,6 +2491,45 @@ void helper_vsel (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b, ppc_avr_t *c)
>      r->u64[1] = (a->u64[1] & ~c->u64[1]) | (b->u64[1] & c->u64[1]);
>  }
>  
> +#if defined(WORDS_BIGENDIAN)
> +#define LEFT 0
> +#define RIGHT 1
> +#else
> +#define LEFT 1
> +#define RIGHT 0
> +#endif
> +/* The specification says that the results are undefined if all of the
> + * shift counts are not identical.  We check to make sure that they are
> + * to conform to what real hardware appears to do.  */
> +#define VSHIFT(suffix, leftp)                                           \
> +    void helper_vs##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)   \
> +    {                                                                   \
> +        int shift = b->u8[LO_IDX*0x15] & 0x7;                           \
> +        int doit = 1;                                                   \
> +        int i;                                                          \
> +        for (i = 0; i < ARRAY_SIZE(r->u8); i++) {                       \
> +            doit = doit && ((b->u8[i] & 0x7) == shift);                 \
> +        }                                                               \
> +        if (doit) {                                                     \
> +            if (shift == 0) {                                           \
> +                *r = *a;                                                \
> +            } else if (leftp) {                                         \
> +                uint64_t carry = a->u64[LO_IDX] >> (64 - shift);        \
> +                r->u64[HI_IDX] = (a->u64[HI_IDX] << shift) | carry;     \
> +                r->u64[LO_IDX] = a->u64[LO_IDX] << shift;               \
> +            } else {                                                    \
> +                uint64_t carry = a->u64[HI_IDX] << (64 - shift);        \
> +                r->u64[LO_IDX] = (a->u64[LO_IDX] >> shift) | carry;     \
> +                r->u64[HI_IDX] = a->u64[HI_IDX] >> shift;               \
> +            }                                                           \
> +        }                                                               \
> +    }
> +VSHIFT(l, LEFT)
> +VSHIFT(r, RIGHT)
> +#undef VSHIFT
> +#undef LEFT
> +#undef RIGHT
> +
>  #define VSL(suffix, element)                                            \
>      void helper_vsl##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)  \
>      {                                                                   \
> diff --git a/target-ppc/translate.c b/target-ppc/translate.c
> index e92156f..65a80f2 100644
> --- a/target-ppc/translate.c
> +++ b/target-ppc/translate.c
> @@ -6356,6 +6356,8 @@ GEN_VXFORM(vsubsws, 0, 30);
>  GEN_VXFORM(vrlb, 2, 0);
>  GEN_VXFORM(vrlh, 2, 1);
>  GEN_VXFORM(vrlw, 2, 2);
> +GEN_VXFORM(vsl, 2, 7);
> +GEN_VXFORM(vsr, 2, 11);
>  GEN_VXFORM(vpkuhum, 7, 0);
>  GEN_VXFORM(vpkuwum, 7, 1);
>  GEN_VXFORM(vpkuhus, 7, 2);
> -- 
> 1.6.0.5
> 
> 
> 
> 

-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 23/40] Add vspltis{b,h,w} instructions.
  2009-01-07 21:25     ` Nathan Froyd
@ 2009-01-08 18:57       ` Aurelien Jarno
  0 siblings, 0 replies; 68+ messages in thread
From: Aurelien Jarno @ 2009-01-08 18:57 UTC (permalink / raw)
  To: Nathan Froyd; +Cc: qemu-devel

On Wed, Jan 07, 2009 at 01:25:32PM -0800, Nathan Froyd wrote:
> On Sat, Jan 03, 2009 at 10:43:54PM +0100, Aurelien Jarno wrote:
> > On Tue, Dec 30, 2008 at 07:10:05PM -0800, Nathan Froyd wrote:
> > > +#define VSPLTI(suffix, element, splat_type)                     \
> > > +    void helper_vspltis##suffix (ppc_avr_t *r, uint32_t splat)  \
> > > +    {                                                           \
> > > +        splat_type x = (splat_type)splat;                       \
> > > +        int i;                                                  \
> > > +        /* 5-bit sign extension.  */                            \
> > > +        if (x & 0x10)                                           \
> > > +            x -= 0x20;                                          \
> > 
> > I don't really like this way of doing a sign extension. I would prefer
> > to avoid a test and do something like:
> > splat_type x = (int8_t)(splat << 3) >> 3;
> 
> Done thusly.

Thanks, applied.

> -Nathan
> 
> Use more obvious sequence for 5-bit sign extension.
> 
> Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
> ---
>  target-ppc/helper.h    |    3 +++
>  target-ppc/op_helper.c |   14 ++++++++++++++
>  target-ppc/translate.c |   20 ++++++++++++++++++++
>  3 files changed, 37 insertions(+), 0 deletions(-)
> 
> diff --git a/target-ppc/helper.h b/target-ppc/helper.h
> index e15d6b0..755bfba 100644
> --- a/target-ppc/helper.h
> +++ b/target-ppc/helper.h
> @@ -188,6 +188,9 @@ DEF_HELPER_3(vrlw, void, avr, avr, avr)
>  DEF_HELPER_3(vsl, void, avr, avr, avr)
>  DEF_HELPER_3(vsr, void, avr, avr, avr)
>  DEF_HELPER_4(vsldoi, void, avr, avr, avr, i32)
> +DEF_HELPER_2(vspltisb, void, avr, i32)
> +DEF_HELPER_2(vspltish, void, avr, i32)
> +DEF_HELPER_2(vspltisw, void, avr, i32)
>  DEF_HELPER_3(vspltb, void, avr, avr, i32)
>  DEF_HELPER_3(vsplth, void, avr, avr, i32)
>  DEF_HELPER_3(vspltw, void, avr, avr, i32)
> diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
> index 81abd63..dc8ddfe 100644
> --- a/target-ppc/op_helper.c
> +++ b/target-ppc/op_helper.c
> @@ -2609,6 +2609,20 @@ VSPLT(w, u32)
>  #undef SPLAT_ELEMENT
>  #undef _SPLAT_MASKED
>  
> +#define VSPLTI(suffix, element, splat_type)                     \
> +    void helper_vspltis##suffix (ppc_avr_t *r, uint32_t splat)  \
> +    {                                                           \
> +        splat_type x = (int8_t)(splat << 3) >> 3;               \
> +        int i;                                                  \
> +        for (i = 0; i < ARRAY_SIZE(r->element); i++) {          \
> +            r->element[i] = x;                                  \
> +        }                                                       \
> +    }
> +VSPLTI(b, s8, int8_t)
> +VSPLTI(h, s16, int16_t)
> +VSPLTI(w, s32, int32_t)
> +#undef VSPLTI
> +
>  #define VSR(suffix, element)                                            \
>      void helper_vsr##suffix (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)  \
>      {                                                                   \
> diff --git a/target-ppc/translate.c b/target-ppc/translate.c
> index 65a80f2..6bb81d2 100644
> --- a/target-ppc/translate.c
> +++ b/target-ppc/translate.c
> @@ -6404,6 +6404,26 @@ GEN_VXRFORM(vcmpgtub, 3, 8)
>  GEN_VXRFORM(vcmpgtuh, 3, 9)
>  GEN_VXRFORM(vcmpgtuw, 3, 10)
>  
> +#define GEN_VXFORM_SIMM(name, opc2, opc3)                               \
> +    GEN_HANDLER(name, 0x04, opc2, opc3, 0x00000000, PPC_ALTIVEC)        \
> +    {                                                                   \
> +        TCGv_ptr rd;                                                    \
> +        TCGv_i32 simm;                                                  \
> +        if (unlikely(!ctx->altivec_enabled)) {                          \
> +            gen_exception(ctx, POWERPC_EXCP_VPU);                       \
> +            return;                                                     \
> +        }                                                               \
> +        simm = tcg_const_i32(SIMM5(ctx->opcode));                       \
> +        rd = gen_avr_ptr(rD(ctx->opcode));                              \
> +        gen_helper_##name (rd, simm);                                   \
> +        tcg_temp_free_i32(simm);                                        \
> +        tcg_temp_free_ptr(rd);                                          \
> +    }
> +
> +GEN_VXFORM_SIMM(vspltisb, 6, 12);
> +GEN_VXFORM_SIMM(vspltish, 6, 13);
> +GEN_VXFORM_SIMM(vspltisw, 6, 14);
> +
>  #define GEN_VXFORM_NOA(name, opc2, opc3)                                \
>      GEN_HANDLER(name, 0x04, opc2, opc3, 0x001f0000, PPC_ALTIVEC)        \
>      {                                                                   \
> -- 
> 1.6.0.5
> 
> 
> 
> 

-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 68+ messages in thread

* Re: [Qemu-devel] [PATCH 18/40] Add v{add, sub}{s, u}{b, h, w}s instructions.
  2009-01-07 21:24     ` Nathan Froyd
@ 2009-01-08 23:19       ` Aurelien Jarno
  0 siblings, 0 replies; 68+ messages in thread
From: Aurelien Jarno @ 2009-01-08 23:19 UTC (permalink / raw)
  To: Nathan Froyd; +Cc: qemu-devel

On Wed, Jan 07, 2009 at 01:24:30PM -0800, Nathan Froyd wrote:
> On Sat, Jan 03, 2009 at 10:13:20PM +0100, Aurelien Jarno wrote:
> > This patch introduces some new warnings:
> > /home/aurel32/git/qemu/target-ppc/op_helper.c: In function ‘helper_vaddsws’:
> > /home/aurel32/git/qemu/target-ppc/op_helper.c:2122: warning: overflow in implicit constant conversion
> > /home/aurel32/git/qemu/target-ppc/op_helper.c:2122: warning: overflow in implicit constant conversion
> > /home/aurel32/git/qemu/target-ppc/op_helper.c: In function ‘helper_vsubsws’:
> > /home/aurel32/git/qemu/target-ppc/op_helper.c:2122: warning: overflow in implicit constant conversion
> > /home/aurel32/git/qemu/target-ppc/op_helper.c:2122: warning: overflow in implicit constant conversion
> > /home/aurel32/git/qemu/target-ppc/op_helper.c: In function ‘helper_vadduws’:
> > /home/aurel32/git/qemu/target-ppc/op_helper.c:2125: warning: overflow in implicit constant conversion
> > /home/aurel32/git/qemu/target-ppc/op_helper.c: In function ‘helper_vsubuws’:
> > /home/aurel32/git/qemu/target-ppc/op_helper.c:2125: warning: overflow in implicit constant conversion
> 
> Fixed thusly.  (I still get a warning for cvtuhub, which can be fixed
> separately.)
> 
> -Nathan
> 
> Fix compilation warnings by using the cvt* family of functions.

Thanks, applied with minor fixes to pass the testsuite (use the signed
to unsigned conversion for unsigned instructions to correctly clamp the
value to 0 in case of a subtraction).

> Signed-off-by: Nathan Froyd <froydnj@codesourcery.com>
> ---
>  target-ppc/helper.h    |   12 ++++++++++++
>  target-ppc/op_helper.c |   39 +++++++++++++++++++++++++++++++++++++++
>  target-ppc/translate.c |   12 ++++++++++++
>  3 files changed, 63 insertions(+), 0 deletions(-)
> 
> diff --git a/target-ppc/helper.h b/target-ppc/helper.h
> index bae137b..009f516 100644
> --- a/target-ppc/helper.h
> +++ b/target-ppc/helper.h
> @@ -170,6 +170,18 @@ DEF_HELPER_3(vaddcuw, void, avr, avr, avr)
>  DEF_HELPER_3(vsubcuw, void, avr, avr, avr)
>  DEF_HELPER_2(lvsl, void, avr, tl);
>  DEF_HELPER_2(lvsr, void, avr, tl);
> +DEF_HELPER_3(vaddsbs, void, avr, avr, avr)
> +DEF_HELPER_3(vaddshs, void, avr, avr, avr)
> +DEF_HELPER_3(vaddsws, void, avr, avr, avr)
> +DEF_HELPER_3(vsubsbs, void, avr, avr, avr)
> +DEF_HELPER_3(vsubshs, void, avr, avr, avr)
> +DEF_HELPER_3(vsubsws, void, avr, avr, avr)
> +DEF_HELPER_3(vaddubs, void, avr, avr, avr)
> +DEF_HELPER_3(vadduhs, void, avr, avr, avr)
> +DEF_HELPER_3(vadduws, void, avr, avr, avr)
> +DEF_HELPER_3(vsububs, void, avr, avr, avr)
> +DEF_HELPER_3(vsubuhs, void, avr, avr, avr)
> +DEF_HELPER_3(vsubuws, void, avr, avr, avr)
>  DEF_HELPER_3(vrlb, void, avr, avr, avr)
>  DEF_HELPER_3(vrlh, void, avr, avr, avr)
>  DEF_HELPER_3(vrlw, void, avr, avr, avr)
> diff --git a/target-ppc/op_helper.c b/target-ppc/op_helper.c
> index eb155aa..ef19bde 100644
> --- a/target-ppc/op_helper.c
> +++ b/target-ppc/op_helper.c
> @@ -2082,6 +2082,45 @@ VARITH(uwm, u32)
>  #undef VARITH_DO
>  #undef VARITH
>  
> +#define VARITHSAT_CASE(type, op, cvt, element)                          \
> +    {                                                                   \
> +        type result = (type)a->element[i] op (type)b->element[i];       \
> +        r->element[i] = cvt(result, &sat);                              \
> +    }
> +
> +#define VARITHSAT_DO(name, op, optype, cvt, element)                    \
> +    void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)      \
> +    {                                                                   \
> +        int sat = 0;                                                    \
> +        int i;                                                          \
> +        for (i = 0; i < ARRAY_SIZE(r->element); i++) {                  \
> +            switch (sizeof(r->element[0])) {                            \
> +            case 1: VARITHSAT_CASE(optype, op, cvt, element); break;    \
> +            case 2: VARITHSAT_CASE(optype, op, cvt, element); break;    \
> +            case 4: VARITHSAT_CASE(optype, op, cvt, element); break;    \
> +            }                                                           \
> +        }                                                               \
> +        if (sat) {                                                      \
> +            env->vscr |= (1 << VSCR_SAT);                               \
> +        }                                                               \
> +    }
> +#define VARITHSAT_SIGNED(suffix, element, optype, cvt)        \
> +    VARITHSAT_DO(adds##suffix##s, +, optype, cvt, element)    \
> +    VARITHSAT_DO(subs##suffix##s, -, optype, cvt, element)
> +#define VARITHSAT_UNSIGNED(suffix, element, optype, cvt)       \
> +    VARITHSAT_DO(addu##suffix##s, +, optype, cvt, element)     \
> +    VARITHSAT_DO(subu##suffix##s, -, optype, cvt, element)
> +VARITHSAT_SIGNED(b, s8, int16_t, cvtshsb)
> +VARITHSAT_SIGNED(h, s16, int32_t, cvtswsh)
> +VARITHSAT_SIGNED(w, s32, int64_t, cvtsdsw)
> +VARITHSAT_UNSIGNED(b, u8, uint16_t, cvtuhub)
> +VARITHSAT_UNSIGNED(h, u16, uint32_t, cvtuwuh)
> +VARITHSAT_UNSIGNED(w, u32, uint64_t, cvtuduw)
> +#undef VARITHSAT_CASE
> +#undef VARITHSAT_DO
> +#undef VARITHSAT_SIGNED
> +#undef VARITHSAT_UNSIGNED
> +
>  #define VAVG_DO(name, element, etype)                                   \
>      void helper_v##name (ppc_avr_t *r, ppc_avr_t *a, ppc_avr_t *b)      \
>      {                                                                   \
> diff --git a/target-ppc/translate.c b/target-ppc/translate.c
> index 20e9e0c..e92156f 100644
> --- a/target-ppc/translate.c
> +++ b/target-ppc/translate.c
> @@ -6341,6 +6341,18 @@ GEN_VXFORM(vslo, 6, 16);
>  GEN_VXFORM(vsro, 6, 17);
>  GEN_VXFORM(vaddcuw, 0, 6);
>  GEN_VXFORM(vsubcuw, 0, 22);
> +GEN_VXFORM(vaddubs, 0, 8);
> +GEN_VXFORM(vadduhs, 0, 9);
> +GEN_VXFORM(vadduws, 0, 10);
> +GEN_VXFORM(vaddsbs, 0, 12);
> +GEN_VXFORM(vaddshs, 0, 13);
> +GEN_VXFORM(vaddsws, 0, 14);
> +GEN_VXFORM(vsububs, 0, 24);
> +GEN_VXFORM(vsubuhs, 0, 25);
> +GEN_VXFORM(vsubuws, 0, 26);
> +GEN_VXFORM(vsubsbs, 0, 28);
> +GEN_VXFORM(vsubshs, 0, 29);
> +GEN_VXFORM(vsubsws, 0, 30);
>  GEN_VXFORM(vrlb, 2, 0);
>  GEN_VXFORM(vrlh, 2, 1);
>  GEN_VXFORM(vrlw, 2, 2);
> -- 
> 1.6.0.5
> 
> 
> 
> 

-- 
  .''`.  Aurelien Jarno	            | GPG: 1024D/F1BCDB73
 : :' :  Debian developer           | Electrical Engineer
 `. `'   aurel32@debian.org         | aurelien@aurel32.net
   `-    people.debian.org/~aurel32 | www.aurel32.net

^ permalink raw reply	[flat|nested] 68+ messages in thread

end of thread, other threads:[~2009-01-08 23:19 UTC | newest]

Thread overview: 68+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
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
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

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).