summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOded Gabbay <oded.gabbay@gmail.com>2015-06-16 16:54:49 +0300
committerOded Gabbay <oded.gabbay@gmail.com>2015-06-24 10:24:03 +0300
commit06a7f08f1b796ed0ca684f18ff856bdcec56ea1b (patch)
tree5159c40afb37a3f39c6368900db3dbe4bcd6e28d
parent20c58608461436b441ac200dd25d08d0e53ed374 (diff)
vmx: fix pix_multiply for ppc64lepixman-upstream-2015-06-22
vec_mergeh/l operates differently for BE and LE, because of the order of the vector elements (l->r in BE and r->l in LE). To fix that, we simply need to swap between the input parameters, in case we are working in LE. v2: replace _LITTLE_ENDIAN with WORDS_BIGENDIAN for consistency Signed-off-by: Oded Gabbay <oded.gabbay@gmail.com> Reviewed-by: Adam Jackson <ajax@redhat.com>
-rw-r--r--pixman/pixman-vmx.c37
1 files changed, 29 insertions, 8 deletions
diff --git a/pixman/pixman-vmx.c b/pixman/pixman-vmx.c
index b43ae38..1d9af10 100644
--- a/pixman/pixman-vmx.c
+++ b/pixman/pixman-vmx.c
@@ -57,12 +57,22 @@ pix_multiply (vector unsigned int p, vector unsigned int a)
/* unpack to short */
hi = (vector unsigned short)
- vec_mergeh ((vector unsigned char)AVV (0),
- (vector unsigned char)p);
+#ifndef WORDS_BIGENDIAN
+ vec_mergeh ((vector unsigned char) p,
+ (vector unsigned char) AVV (0));
+#else
+ vec_mergeh ((vector unsigned char)AVV (0),
+ (vector unsigned char)p);
+#endif
mod = (vector unsigned short)
- vec_mergeh ((vector unsigned char)AVV (0),
- (vector unsigned char)a);
+#ifndef WORDS_BIGENDIAN
+ vec_mergeh ((vector unsigned char) a,
+ (vector unsigned char) AVV (0));
+#else
+ vec_mergeh ((vector unsigned char)AVV (0),
+ (vector unsigned char)a);
+#endif
hi = vec_mladd (hi, mod, (vector unsigned short)
AVV (0x0080, 0x0080, 0x0080, 0x0080,
@@ -74,11 +84,22 @@ pix_multiply (vector unsigned int p, vector unsigned int a)
/* unpack to short */
lo = (vector unsigned short)
- vec_mergel ((vector unsigned char)AVV (0),
- (vector unsigned char)p);
+#ifndef WORDS_BIGENDIAN
+ vec_mergel ((vector unsigned char) p,
+ (vector unsigned char) AVV (0));
+#else
+ vec_mergel ((vector unsigned char)AVV (0),
+ (vector unsigned char)p);
+#endif
+
mod = (vector unsigned short)
- vec_mergel ((vector unsigned char)AVV (0),
- (vector unsigned char)a);
+#ifndef WORDS_BIGENDIAN
+ vec_mergel ((vector unsigned char) a,
+ (vector unsigned char) AVV (0));
+#else
+ vec_mergel ((vector unsigned char)AVV (0),
+ (vector unsigned char)a);
+#endif
lo = vec_mladd (lo, mod, (vector unsigned short)
AVV (0x0080, 0x0080, 0x0080, 0x0080,