This fixes a crash when llvmpipe tries to use sse instructions, but llvm detects a cpu that doesn't support them.
Fixes for example piglit/bin/amd_seamless_cubemap_per_texture -fbo -auto on i386 when run inside "qemu -cpu qemu32", which would otherwise error with: "LLVM ERROR: Do not know how to split the result of this operator!" Signed-off-by: Maarten Lankhorst <maarten.lankho...@canonical.com> --- diff --git a/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp b/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp index 55aa8b9..f2f8906 100644 --- a/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp +++ b/src/gallium/auxiliary/gallivm/lp_bld_misc.cpp @@ -479,10 +479,38 @@ lp_build_create_jit_compiler_for_module(LLVMExecutionEngineRef *OutJIT, if (util_cpu_caps.has_f16c) { MAttrs.push_back("+f16c"); } - builder.setMAttrs(MAttrs); } #if HAVE_LLVM >= 0x0305 + /* + * llvm 3.5 no longer supports cpuid based autodetect. + * This breaks on "qemu -cpu qemu32" which is detected as pentium2 by llvm's + * sys::getHostCPUName(), but does support sse2. + * + * For this reason force the use of sse extensions when available, so our + * understanding of the cpu is in sync with llvm's. + */ + + else if (util_cpu_caps.has_sse4_2) + MAttrs.push_back("+sse42"); + else if (util_cpu_caps.has_sse4_1) + MAttrs.push_back("+sse41"); + else if (util_cpu_caps.has_ssse3) + MAttrs.push_back("+ssse3"); + else if (util_cpu_caps.has_sse3) + MAttrs.push_back("+sse3"); + else if (util_cpu_caps.has_sse2) + MAttrs.push_back("+sse2"); + else if (util_cpu_caps.has_sse) + MAttrs.push_back("+sse"); + else if (util_cpu_caps.has_mmx) + MAttrs.push_back("+sse"); + + if (util_cpu_caps.has_3dnow_ext) + MAttrs.push_back("+3dnowa"); + else if (util_cpu_caps.has_3dnow) + MAttrs.push_back("+3dnow"); + StringRef MCPU = llvm::sys::getHostCPUName(); /* * The cpu bits are no longer set automatically, so need to set mcpu manually. @@ -498,6 +526,7 @@ lp_build_create_jit_compiler_for_module(LLVMExecutionEngineRef *OutJIT, */ builder.setMCPU(MCPU); #endif + builder.setMAttrs(MAttrs); ShaderMemoryManager *MM = new ShaderMemoryManager(); *OutCode = MM->getGeneratedCode(); _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev