summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdhemerval Zanella <azanella@linux.vnet.ibm.com>2012-11-22 10:54:45 -0600
committerJosé Fonseca <jfonseca@vmware.com>2012-11-29 11:51:41 +0000
commit31c63b058edd988004e1bea261a03235a8752229 (patch)
treee170728ee5c5d35c0b42803212325bdabbd74ee6
parent8b6aec6533cc1fc09e27757aefa8ad3dbd662684 (diff)
gallivm: Altivec pack/unpack intrisics
This patch adds PPC Altivec support for pack/unpack operations using Altivec supported vector type (8xi8, 16xi16, 4xi32, 4xf32). Reviewed-by: Roland Scheidegger <sroland@vmware.com> Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_pack.c44
1 files changed, 30 insertions, 14 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_pack.c b/src/gallium/auxiliary/gallivm/lp_bld_pack.c
index b467d561e36..f46c080f687 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_pack.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_pack.c
@@ -433,30 +433,46 @@ lp_build_pack2(struct gallivm_state *gallivm,
assert(src_type.length * 2 == dst_type.length);
/* Check for special cases first */
- if(util_cpu_caps.has_sse2 && src_type.width * src_type.length >= 128) {
+ if((util_cpu_caps.has_sse2 || util_cpu_caps.has_altivec) &&
+ src_type.width * src_type.length >= 128) {
const char *intrinsic = NULL;
switch(src_type.width) {
case 32:
- if(dst_type.sign) {
- intrinsic = "llvm.x86.sse2.packssdw.128";
- }
- else {
- if (util_cpu_caps.has_sse4_1) {
- intrinsic = "llvm.x86.sse41.packusdw";
+ if (util_cpu_caps.has_sse2) {
+ if(dst_type.sign) {
+ intrinsic = "llvm.x86.sse2.packssdw.128";
+ }
+ else {
+ if (util_cpu_caps.has_sse4_1) {
+ intrinsic = "llvm.x86.sse41.packusdw";
#if HAVE_LLVM < 0x0207
- /* llvm < 2.7 has inconsistent signatures except for packusdw */
- intr_type = dst_type;
+ /* llvm < 2.7 has inconsistent signatures except for packusdw */
+ intr_type = dst_type;
#endif
- }
+ }
+ }
+ } else if (util_cpu_caps.has_altivec) {
+ if (dst_type.sign) {
+ intrinsic = "llvm.ppc.altivec.vpkswus";
+ } else {
+ intrinsic = "llvm.ppc.altivec.vpkuwus";
+ }
}
break;
case 16:
if (dst_type.sign) {
- intrinsic = "llvm.x86.sse2.packsswb.128";
- }
- else {
- intrinsic = "llvm.x86.sse2.packuswb.128";
+ if (util_cpu_caps.has_sse2) {
+ intrinsic = "llvm.x86.sse2.packsswb.128";
+ } else if (util_cpu_caps.has_altivec) {
+ intrinsic = "llvm.ppc.altivec.vpkshss";
+ }
+ } else {
+ if (util_cpu_caps.has_sse2) {
+ intrinsic = "llvm.x86.sse2.packuswb.128";
+ } else if (util_cpu_caps.has_altivec) {
+ intrinsic = "llvm.ppc.altivec.vpkshus";
+ }
}
break;
/* default uses generic shuffle below */