On 05/05/13 00:02, Andrey Semashev wrote:
Hi,
I noticed that by default x86 32 bit builds are targeted for i386 (at least gcc toolset and its derivatives explicitly specify -march=i386 in the command line). Is there a reason to target for such an ancient instruction set by default?
I take it you mean why is tools/build/v2/tools/gcc.jam adding -march=i386 when using GCC on 32-bit systems. I also think it shouldn't do that. I suppose the reason is due to a limitation of Boost.Build that needs to know what the default is. Most GCC 32-bit binaries will build for i386 by default, even on modern linux distributions.
Frankly, I'm not sure that the current Boost code would even run on a real 80386, since there are at least quite a few places with atomic operations, which I think were not present on that CPU.
Any code that relies on particular instructions should detect what the target is to only use what is supported by the target, with fallback to a portable implementation if possible. It is also possible to not provide portable fallback, in which case the library needs to be ported to each architecture manually.
Also, I would like to use cpuid safely in my library, and this operation appeared only in some i486 and all Pentiums, so I would basically target my code for Pentium at the very least.
There is no problem with making a library that is specific to a given architecture, as long as it is clearly documented and that the limited scope is accepted during review.
But perhaps we could raise the default to Pentium Pro (i686)?
The best solution is to not add any flag, and use whatever the default is.