mirror of
https://gitlab.freedesktop.org/mesa/mesa.git
synced 2026-05-06 13:48:06 +02:00
gallivm: Fix saturated signed psub/padd intrinsics on llvm 8
LLVM 8 did remove both the signed and unsigned sse2/avx intrinsics in
the end, and provide arch-independent llvm intrinsics instead.
Fixes a crash when using snorm framebuffers (tested with piglit
arb_color_buffer_float-render GL_RGBA8_SNORM -auto).
Reviewed-by: Jose Fonseca <jfonseca@vmware.com>
Reviewed-by: Dave Airlie <airlied@redhat.com>
CC: <mesa-stable@lists.freedesktop.org>
(cherry picked from commit 045f05a2f6)
Conflicts resolved by Dylan Baker
This commit is contained in:
parent
01e31f8cab
commit
16af8e9772
1 changed files with 10 additions and 18 deletions
|
|
@ -555,7 +555,7 @@ lp_build_add(struct lp_build_context *bld,
|
|||
return bld->one;
|
||||
|
||||
if (!type.floating && !type.fixed) {
|
||||
if (HAVE_LLVM >= 0x0900) {
|
||||
if (HAVE_LLVM >= 0x0800) {
|
||||
char intrin[32];
|
||||
intrinsic = type.sign ? "llvm.sadd.sat" : "llvm.uadd.sat";
|
||||
lp_format_intrinsic(intrin, sizeof intrin, intrinsic, bld->vec_type);
|
||||
|
|
@ -564,11 +564,9 @@ lp_build_add(struct lp_build_context *bld,
|
|||
if (type.width * type.length == 128) {
|
||||
if (util_cpu_caps.has_sse2) {
|
||||
if (type.width == 8)
|
||||
intrinsic = type.sign ? "llvm.x86.sse2.padds.b" :
|
||||
HAVE_LLVM < 0x0800 ? "llvm.x86.sse2.paddus.b" : NULL;
|
||||
intrinsic = type.sign ? "llvm.x86.sse2.padds.b" : "llvm.x86.sse2.paddus.b";
|
||||
if (type.width == 16)
|
||||
intrinsic = type.sign ? "llvm.x86.sse2.padds.w" :
|
||||
HAVE_LLVM < 0x0800 ? "llvm.x86.sse2.paddus.w" : NULL;
|
||||
intrinsic = type.sign ? "llvm.x86.sse2.padds.w" : "llvm.x86.sse2.paddus.w";
|
||||
} else if (util_cpu_caps.has_altivec) {
|
||||
if (type.width == 8)
|
||||
intrinsic = type.sign ? "llvm.ppc.altivec.vaddsbs" : "llvm.ppc.altivec.vaddubs";
|
||||
|
|
@ -579,11 +577,9 @@ lp_build_add(struct lp_build_context *bld,
|
|||
if (type.width * type.length == 256) {
|
||||
if (util_cpu_caps.has_avx2) {
|
||||
if (type.width == 8)
|
||||
intrinsic = type.sign ? "llvm.x86.avx2.padds.b" :
|
||||
HAVE_LLVM < 0x0800 ? "llvm.x86.avx2.paddus.b" : NULL;
|
||||
intrinsic = type.sign ? "llvm.x86.avx2.padds.b" : "llvm.x86.avx2.paddus.b";
|
||||
if (type.width == 16)
|
||||
intrinsic = type.sign ? "llvm.x86.avx2.padds.w" :
|
||||
HAVE_LLVM < 0x0800 ? "llvm.x86.avx2.paddus.w" : NULL;
|
||||
intrinsic = type.sign ? "llvm.x86.avx2.padds.w" : "llvm.x86.avx2.paddus.w";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -883,7 +879,7 @@ lp_build_sub(struct lp_build_context *bld,
|
|||
return bld->zero;
|
||||
|
||||
if (!type.floating && !type.fixed) {
|
||||
if (HAVE_LLVM >= 0x0900) {
|
||||
if (HAVE_LLVM >= 0x0800) {
|
||||
char intrin[32];
|
||||
intrinsic = type.sign ? "llvm.ssub.sat" : "llvm.usub.sat";
|
||||
lp_format_intrinsic(intrin, sizeof intrin, intrinsic, bld->vec_type);
|
||||
|
|
@ -892,11 +888,9 @@ lp_build_sub(struct lp_build_context *bld,
|
|||
if (type.width * type.length == 128) {
|
||||
if (util_cpu_caps.has_sse2) {
|
||||
if (type.width == 8)
|
||||
intrinsic = type.sign ? "llvm.x86.sse2.psubs.b" :
|
||||
HAVE_LLVM < 0x0800 ? "llvm.x86.sse2.psubus.b" : NULL;
|
||||
intrinsic = type.sign ? "llvm.x86.sse2.psubs.b" : "llvm.x86.sse2.psubus.b";
|
||||
if (type.width == 16)
|
||||
intrinsic = type.sign ? "llvm.x86.sse2.psubs.w" :
|
||||
HAVE_LLVM < 0x0800 ? "llvm.x86.sse2.psubus.w" : NULL;
|
||||
intrinsic = type.sign ? "llvm.x86.sse2.psubs.w" : "llvm.x86.sse2.psubus.w";
|
||||
} else if (util_cpu_caps.has_altivec) {
|
||||
if (type.width == 8)
|
||||
intrinsic = type.sign ? "llvm.ppc.altivec.vsubsbs" : "llvm.ppc.altivec.vsububs";
|
||||
|
|
@ -907,11 +901,9 @@ lp_build_sub(struct lp_build_context *bld,
|
|||
if (type.width * type.length == 256) {
|
||||
if (util_cpu_caps.has_avx2) {
|
||||
if (type.width == 8)
|
||||
intrinsic = type.sign ? "llvm.x86.avx2.psubs.b" :
|
||||
HAVE_LLVM < 0x0800 ? "llvm.x86.avx2.psubus.b" : NULL;
|
||||
intrinsic = type.sign ? "llvm.x86.avx2.psubs.b" : "llvm.x86.avx2.psubus.b";
|
||||
if (type.width == 16)
|
||||
intrinsic = type.sign ? "llvm.x86.avx2.psubs.w" :
|
||||
HAVE_LLVM < 0x0800 ? "llvm.x86.avx2.psubus.w" : NULL;
|
||||
intrinsic = type.sign ? "llvm.x86.avx2.psubs.w" : "llvm.x86.avx2.psubus.w";
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue