[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Bug#786345: pixman: enable vmx for ppc64el



Source: pixman
Version: 0.32.6-3
Severity: normal
Tags: patch
User: debian-powerpc@lists.debian.org

Dear Maintainer,

The package pixman had the usage of vmx disabled for ppc64el arch, because it
had tests failing when it was enabled.
That happened due to some differences on how data is treated from big to little
endian.

I am attaching a patch that re-enables vmx and includes some work arounds for
cases that have endianness conflicts.

I tested the patch on ppc64le and powerpc vms.

If you have questions or suggestions, please let me know.

Regards.
Fernando

-- System Information:
Debian Release: 8.0
  APT prefers stable-updates
  APT policy: (500, 'stable-updates'), (500, 'unstable'), (500, 'stable')
Architecture: ppc64el (ppc64le)

Kernel: Linux 3.16.0-4-powerpc64le (SMP w/16 CPU cores)
Locale: LANG=en_US.UTF-8, LC_CTYPE=en_US.UTF-8 (charmap=UTF-8)
Shell: /bin/sh linked to /bin/dash
Init: systemd (via /run/systemd/system)
diff -u pixman-0.32.6/debian/changelog pixman-0.32.6/debian/changelog
--- pixman-0.32.6/debian/changelog
+++ pixman-0.32.6/debian/changelog
@@ -1,3 +1,10 @@
+pixman (0.32.6-3ppc64el1) UNRELEASED; urgency=medium
+
+  * Reenabled vmx for ppc64el and provided some workarounds so vmx works for
+    both endiannesses. 
+
+ -- Fernando Seiti Furusato <ferseiti@br.ibm.com>  Wed, 20 May 2015 15:21:10 -0400
+
 pixman (0.32.6-3) sid; urgency=medium
 
   [ intrigeri ]
diff -u pixman-0.32.6/debian/patches/series pixman-0.32.6/debian/patches/series
--- pixman-0.32.6/debian/patches/series
+++ pixman-0.32.6/debian/patches/series
@@ -1,2 +1,3 @@
-ppc64el.diff
+#ppc64el.diff
 test-increase-timeout.diff
+vmx-le.patch
only in patch2:
unchanged:
--- pixman-0.32.6.orig/debian/patches/vmx-le.patch
+++ pixman-0.32.6/debian/patches/vmx-le.patch
@@ -0,0 +1,126 @@
+--- a/pixman/pixman-vmx.c
++++ b/pixman/pixman-vmx.c
+@@ -34,13 +34,25 @@
+ 
+ #define AVV(x...) {x}
+ 
++#ifndef __LITTLE_ENDIAN__
++#define MERGEH(a,b) vec_mergeh(a,b)
++#define MERGEL(a,b) vec_mergel(a,b)
++#define SPLAT_VEC AVV(						\
++		0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04,	\
++		0x08, 0x08, 0x08, 0x08, 0x0C, 0x0C, 0x0C, 0x0C)
++#else
++#define MERGEH(a,b) vec_mergeh(b,a)
++#define MERGEL(a,b) vec_mergel(b,a)
++#define SPLAT_VEC AVV(             				\
++		0x03, 0x03, 0x03, 0x03, 0x07, 0x07, 0x07, 0x07,	\
++		0x0B, 0x0B, 0x0B, 0x0B, 0x0F, 0x0F, 0x0F, 0x0F)
++#endif
++
+ static force_inline vector unsigned int
+ splat_alpha (vector unsigned int pix)
+ {
+     return vec_perm (pix, pix,
+-		     (vector unsigned char)AVV (
+-			 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x04,
+-			 0x08, 0x08, 0x08, 0x08, 0x0C, 0x0C, 0x0C, 0x0C));
++		     (vector unsigned char)SPLAT_VEC);
+ }
+ 
+ static force_inline vector unsigned int
+@@ -50,11 +62,11 @@
+ 
+     /* unpack to short */
+     hi = (vector unsigned short)
+-	vec_mergeh ((vector unsigned char)AVV (0),
++	MERGEH ((vector unsigned char)AVV (0),
+ 		    (vector unsigned char)p);
+ 
+     mod = (vector unsigned short)
+-	vec_mergeh ((vector unsigned char)AVV (0),
++	MERGEH ((vector unsigned char)AVV (0),
+ 		    (vector unsigned char)a);
+ 
+     hi = vec_mladd (hi, mod, (vector unsigned short)
+@@ -67,10 +79,10 @@
+ 
+     /* unpack to short */
+     lo = (vector unsigned short)
+-	vec_mergel ((vector unsigned char)AVV (0),
++	MERGEL ((vector unsigned char)AVV (0),
+ 		    (vector unsigned char)p);
+     mod = (vector unsigned short)
+-	vec_mergel ((vector unsigned char)AVV (0),
++	MERGEL ((vector unsigned char)AVV (0),
+ 		    (vector unsigned char)a);
+ 
+     lo = vec_mladd (lo, mod, (vector unsigned short)
+@@ -125,25 +137,35 @@
+ }
+ 
+ /* in == pix_multiply */
++#ifndef __LITTLE_ENDIAN__
++#define MASK_SHIFT(pointer) vec_lvsl(0,pointer)
++#else
++#define MASK_SHIFT(pointer)							\
++    vec_xor(*((typeof(pointer ## _mask)*)pointer),			\
++	     (typeof(pointer ## _mask))AVV(				\
++		0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 	\
++		0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03, 0x03))
++#endif
++
+ #define in_over(src, srca, mask, dest)					\
+     over (pix_multiply (src, mask),					\
+           pix_multiply (srca, mask), dest)
+ 
+-
+ #define COMPUTE_SHIFT_MASK(source)					\
+-    source ## _mask = vec_lvsl (0, source);
++    source ## _mask = MASK_SHIFT(source);
+ 
+ #define COMPUTE_SHIFT_MASKS(dest, source)				\
+-    source ## _mask = vec_lvsl (0, source);
++    source ## _mask = MASK_SHIFT(source);
+ 
+ #define COMPUTE_SHIFT_MASKC(dest, source, mask)				\
+-    mask ## _mask = vec_lvsl (0, mask);					\
+-    source ## _mask = vec_lvsl (0, source);
++    mask ## _mask = MASK_SHIFT(mask);					\
++    source ## _mask = MASK_SHIFT(source);
+ 
+ /* notice you have to declare temp vars...
+  * Note: tmp3 and tmp4 must remain untouched!
+  */
+ 
++#ifndef __LITTLE_ENDIAN__
+ #define LOAD_VECTORS(dest, source)			  \
+     tmp1 = (typeof(tmp1))vec_ld (0, source);		  \
+     tmp2 = (typeof(tmp2))vec_ld (15, source);		  \
+@@ -162,11 +184,22 @@
+     v ## mask = (typeof(v ## mask))			  \
+ 	vec_perm (tmp1, tmp2, mask ## _mask);
+ 
+-#define LOAD_VECTORSM(dest, source, mask)				\
+-    LOAD_VECTORSC (dest, source, mask)					\
+-    v ## source = pix_multiply (v ## source,				\
++#else
++#define LOAD_VECTORS(dest, source)                        \
++    v ## source = *((typeof(v ## source)*)source);        \
++    v ## dest = *((typeof(v ## dest)*)dest);
++
++#define LOAD_VECTORSC(dest, source, mask)                 \
++    v ## source = *((typeof(v ## source)*)source);        \
++    v ## dest = *((typeof(v ## dest)*)dest);              \
++    v ## mask = *((typeof(v ## mask)*)mask);
++
++#endif
++
++#define LOAD_VECTORSM(dest, source, mask)                               \
++    LOAD_VECTORSC (dest, source, mask)                                  \
++    v ## source = pix_multiply (v ## source,                            \
+                                 splat_alpha (v ## mask));
+-
+ #define STORE_VECTOR(dest)						\
+     vec_st ((vector unsigned int) v ## dest, 0, dest);
+ 

Reply to: