<div dir="ltr">It looks to me like the rdrand feature is a special case. For any other feature, you can include the feature-specific header, like bmiintrin.h after including immintrin.h, and it will work out. For rdrand, they are defined inline in immintrin.h, so you have to resort to adjusting compiler flags to get those definitions.<div><br></div><div>I can try to remember and recount some background about how we got here. Intel at some point decided that it would be a good idea to make immintrin.h an umbrella header. Umbrella headers are usually really bad for compile time, so IMO this was a huge mistake. When Intel added the AVX intrinsics to immintrin.h, we in Chrome noticed that our Windows compile time regressed significantly. This is because various STL headers at the time included intrin.h, which includes immintrin.h, which dragged in all the AVX stuff. When we noticed the regression, Nico went ahead and added back those ifdefs. It's not ideal, but it's also unreasonable to spend XX% of every compile that uses <string> parsing AVX512 intrinsics that nobody ever uses.</div><div><br></div><div>There was a follow-up proposal to build a module for immintrin.h to solve the compile time problems that way. However, the effort hasn't gone anywhere.</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, May 18, 2021 at 2:08 AM Markus Böck via cfe-dev <<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Hello everyone!<br>
<br>
Recently I was in the process of compiling Qt 6.1 with a wide variety<br>
of toolchains on Windows. While doing so I was also attempting to<br>
build the library using clang-cl, which sadly led to a build failure<br>
due to _rdrand64_step not being declared.<br>
Someone happened to have already reported the bug to Qt here<br>
<a href="https://bugreports.qt.io/browse/QTBUG-88434" rel="noreferrer" target="_blank">https://bugreports.qt.io/browse/QTBUG-88434</a> but they won't fix it and<br>
rightfully so. With further research I discovered that there are many<br>
intrinsics in immitrin.h and associate headers that are simply<br>
disabled when using clang-cl unless explicitly enabled by various<br>
feature macros (one's that aren't documented for clang-cl).<br>
<br>
An example of a few of these:<br>
_rdrand16_step, _rdrand32_step and on x86_64 _rdrand64_step are behind<br>
the guard:<br>
<br>
#if !(defined(_MSC_VER) || defined(__SCE__)) || __has_feature(modules) ||      \<br>
    defined(__RDRND__)<br>
<br>
So therefore if one wanted to use these intrinsics one would have to<br>
define __RDRND__ on the commandline. This is contrary to how MSVC<br>
handles it, as those are always available during compilation.<br>
<br>
Similarly many BMI intrinsics such as _blsi_u32, _blsmsk_u32 or<br>
_blsr_u32 are guarded behind such a header guard (except checking for<br>
the __BMI__ macro instead).<br>
<br>
A git log revealed that these header guards were introduced in this<br>
commit here <a href="https://github.com/llvm/llvm-project/commit/379a1952b37247975d2df8d23498675c9c8cc730" rel="noreferrer" target="_blank">https://github.com/llvm/llvm-project/commit/379a1952b37247975d2df8d23498675c9c8cc730</a><br>
for the sake of compile time. I think this makes a lot of sense for<br>
the various intrinsics for AVX and similar, as these need to be<br>
accompanied by a /arch: option on the command line anyways, but the<br>
above intrinsics do not have such an option.<br>
<br>
I am now wondering if it would make sense to enable intrinsics such as<br>
the above (ones that aren't dependent on /arch: ) by default when<br>
compiling for an MSVC target? This seems to be what MSVC users expect.<br>
And besides, without looking at clangs headers it is currently<br>
impossible to find out how to enable these intrinsics as it's<br>
undocumented which defines one would have to set on the command line<br>
to enable these.<br>
<br>
Kind regards,<br>
<br>
Markus<br>
_______________________________________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a><br>
<a href="https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev</a><br>
</blockquote></div>