[Mesa-dev] [PATCH] gallivm: force sse instructions for llvm 3.5+
Maarten Lankhorst
maarten at mblankhorst.nl
Thu Oct 2 00:10:22 PDT 2014
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.lankhorst at 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
More information about the mesa-dev
mailing list