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? Roland _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev