diff options
author | Roland Scheidegger <[email protected]> | 2017-10-07 00:52:58 +0200 |
---|---|---|
committer | Roland Scheidegger <[email protected]> | 2017-10-07 00:54:09 +0200 |
commit | 52b73caaf40e79c90a105ec6d349abb3398e3c6b (patch) | |
tree | cacc8ba9fdfb6ff97314a33d2b8cb368441120b6 /src/gallium/auxiliary | |
parent | 9716c69e22613229bdc78c0a28491f39bec2520d (diff) |
gallivm: don't use pabs intrinsic with llvm version >= 6
The intrinsic is gone, causing shader compilation to crash.
While here, also change the fallback code to match what llvm's auto-updater
of these intrinsics would do (except that there will still be zext/trunc
instructions in there), which should ensure that the sequence gets recognized
and fused back into a pabs in the end (I didn't test this, and it's possible
even the old sequence would get recognized, but I don't see a reason why we
shouldn't use the same sequence in any case).
Tested-by: Vinson Lee <[email protected]>
Diffstat (limited to 'src/gallium/auxiliary')
-rw-r--r-- | src/gallium/auxiliary/gallivm/lp_bld_arit.c | 13 |
1 files changed, 4 insertions, 9 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_arit.c b/src/gallium/auxiliary/gallivm/lp_bld_arit.c index 04f86bef286..cf1958b3b63 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_arit.c +++ b/src/gallium/auxiliary/gallivm/lp_bld_arit.c @@ -1799,7 +1799,7 @@ lp_build_abs(struct lp_build_context *bld, } } - if(type.width*type.length == 128 && util_cpu_caps.has_ssse3) { + if(type.width*type.length == 128 && util_cpu_caps.has_ssse3 && HAVE_LLVM < 0x0600) { switch(type.width) { case 8: return lp_build_intrinsic_unary(builder, "llvm.x86.ssse3.pabs.b.128", vec_type, a); @@ -1809,7 +1809,7 @@ lp_build_abs(struct lp_build_context *bld, return lp_build_intrinsic_unary(builder, "llvm.x86.ssse3.pabs.d.128", vec_type, a); } } - else if (type.width*type.length == 256 && util_cpu_caps.has_avx2) { + else if (type.width*type.length == 256 && util_cpu_caps.has_avx2 && HAVE_LLVM < 0x0600) { switch(type.width) { case 8: return lp_build_intrinsic_unary(builder, "llvm.x86.avx2.pabs.b", vec_type, a); @@ -1819,14 +1819,9 @@ lp_build_abs(struct lp_build_context *bld, return lp_build_intrinsic_unary(builder, "llvm.x86.avx2.pabs.d", vec_type, a); } } - else if (type.width*type.length == 256 && util_cpu_caps.has_ssse3 && - (gallivm_debug & GALLIVM_DEBUG_PERF) && - (type.width == 8 || type.width == 16 || type.width == 32)) { - debug_printf("%s: inefficient code, should split vectors manually\n", - __FUNCTION__); - } - return lp_build_max(bld, a, LLVMBuildNeg(builder, a, "")); + return lp_build_select(bld, lp_build_cmp(bld, PIPE_FUNC_GREATER, a, bld->zero), + a, LLVMBuildNeg(builder, a, "")); } |