Hey, Op 02-10-14 om 04:22 schreef Roland Scheidegger: > Am 01.10.2014 16:56, schrieb Maarten Lankhorst: >> 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(); >> > I'm not sure if that's really the right idea, it also misses half the > potential features (avx, f16c, ...). > Maybe using llvm::sys::getHostCPUFeatures() and passing that to mattrs > instead of setting the host cpu name would work? > I was unaware that getHostCPUFeatures existed, but I think passing both getHostCPUName and getHostCPUFeatures would work. Unfortunately it seems getHostCPUFeatures only exists on arm right now, but that should be fixable by re-introducing the cpuid stuff in llvm..
~Maarten _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev