summaryrefslogtreecommitdiffstats
path: root/src/gallium/auxiliary/gallivm/lp_bld_arit.c
diff options
context:
space:
mode:
authorJose Fonseca <jfonseca@vmware.com>2016-06-10 15:42:55 +0100
committerJose Fonseca <jfonseca@vmware.com>2016-06-10 16:17:04 +0100
commit2b4cee05715614acb9dd3823f5665199adcf97c2 (patch)
tree8dba8564c6d15f7d5e92a2c95cd26cb9ca49d258 /src/gallium/auxiliary/gallivm/lp_bld_arit.c
parent320d1191c61a0a82444605c12e5c4b2ee0b241eb (diff)
downloadexternal_mesa3d-2b4cee05715614acb9dd3823f5665199adcf97c2.zip
external_mesa3d-2b4cee05715614acb9dd3823f5665199adcf97c2.tar.gz
external_mesa3d-2b4cee05715614acb9dd3823f5665199adcf97c2.tar.bz2
gallivm: Never emit llvm.fmuladd on LLVM 3.3.
Besides the old JIT bug, it seems the X86 backend on LLVM 3.3 doesn't handle llvm.fmuladd and instead it fall backs to a C function. Which in turn causes a segfault on Windows. Reviewed-by: Roland Scheidegger <sroland@vmware.com>
Diffstat (limited to 'src/gallium/auxiliary/gallivm/lp_bld_arit.c')
-rw-r--r--src/gallium/auxiliary/gallivm/lp_bld_arit.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/src/gallium/auxiliary/gallivm/lp_bld_arit.c b/src/gallium/auxiliary/gallivm/lp_bld_arit.c
index 5d6a033..114c766 100644
--- a/src/gallium/auxiliary/gallivm/lp_bld_arit.c
+++ b/src/gallium/auxiliary/gallivm/lp_bld_arit.c
@@ -270,6 +270,12 @@ lp_build_fmuladd(LLVMBuilderRef builder,
LLVMTypeRef type = LLVMTypeOf(a);
assert(type == LLVMTypeOf(b));
assert(type == LLVMTypeOf(c));
+ if (HAVE_LLVM < 0x0304) {
+ /* XXX: LLVM 3.3 does not breakdown llvm.fmuladd into mul+add when FMA is
+ * not supported, and instead it falls-back to a C function.
+ */
+ return LLVMBuildFAdd(builder, LLVMBuildFMul(builder, a, b, ""), c, "");
+ }
char intrinsic[32];
lp_format_intrinsic(intrinsic, sizeof intrinsic, "llvm.fmuladd", type);
LLVMValueRef args[] = { a, b, c };