summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOded Gabbay <[email protected]>2016-01-17 22:15:40 +0200
committerOded Gabbay <[email protected]>2016-01-18 09:45:25 +0200
commit679a654a77f392cc9f8e2b51222b277bd1783ae5 (patch)
tree4c1d4d02f07eb9bc7dabd56a6a87eb0371953d64
parent119bef954379ebb35faf182b0b665becacddab76 (diff)
llvmpipe: use vpkswss when dst is signed
This patch fixes a bug when building a pack instruction. For POWER (altivec), in case the destination is signed and the src width is 32, we need to use vpkswss. The original code used vpkuwus, which emits an unsigned result. This fixes the following piglit tests on ppc64le: - spec@arb_color_buffer_float@gl_rgba8-drawpixels - shaders@glsl-fs-fogscale I've also corrected some coding style issues in the function. v2: Returned else statements to vmware style Signed-off-by: Oded Gabbay <[email protected]> Reviewed-by: Roland Scheidegger <[email protected]>
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_pack.c31
1 files changed, 15 insertions, 16 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_pack.c b/src/gallium/auxiliary/gallivm/lp_bld_pack.c
index cdf6d80c261..0b0f7f0147c 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_pack.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_pack.c
@@ -461,50 +461,49 @@ 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 || util_cpu_caps.has_altivec) &&
- 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;
boolean swap_intrinsic_operands = FALSE;
switch(src_type.width) {
case 32:
if (util_cpu_caps.has_sse2) {
- if(dst_type.sign) {
+ if (dst_type.sign) {
intrinsic = "llvm.x86.sse2.packssdw.128";
- }
- else {
+ } else {
if (util_cpu_caps.has_sse4_1) {
intrinsic = "llvm.x86.sse41.packusdw";
}
}
} else if (util_cpu_caps.has_altivec) {
if (dst_type.sign) {
- intrinsic = "llvm.ppc.altivec.vpkswus";
- } else {
- intrinsic = "llvm.ppc.altivec.vpkuwus";
- }
+ intrinsic = "llvm.ppc.altivec.vpkswss";
+ } else {
+ intrinsic = "llvm.ppc.altivec.vpkuwus";
+ }
#ifdef PIPE_ARCH_LITTLE_ENDIAN
- swap_intrinsic_operands = TRUE;
+ swap_intrinsic_operands = TRUE;
#endif
}
break;
case 16:
if (dst_type.sign) {
if (util_cpu_caps.has_sse2) {
- intrinsic = "llvm.x86.sse2.packsswb.128";
+ intrinsic = "llvm.x86.sse2.packsswb.128";
} else if (util_cpu_caps.has_altivec) {
- intrinsic = "llvm.ppc.altivec.vpkshss";
+ intrinsic = "llvm.ppc.altivec.vpkshss";
#ifdef PIPE_ARCH_LITTLE_ENDIAN
- swap_intrinsic_operands = TRUE;
+ swap_intrinsic_operands = TRUE;
#endif
}
} else {
if (util_cpu_caps.has_sse2) {
- intrinsic = "llvm.x86.sse2.packuswb.128";
+ intrinsic = "llvm.x86.sse2.packuswb.128";
} else if (util_cpu_caps.has_altivec) {
- intrinsic = "llvm.ppc.altivec.vpkshus";
+ intrinsic = "llvm.ppc.altivec.vpkshus";
#ifdef PIPE_ARCH_LITTLE_ENDIAN
- swap_intrinsic_operands = TRUE;
+ swap_intrinsic_operands = TRUE;
#endif
}
}