On 22 May 2017 at 07:46, Jeffrey Walton wrote: > I'm testing some code that wants to use SSE2 and above. The code is > guarded by runtime CPU checks. The options used to compile are > minimal. For example, Debian will effectively compile with only > -mcpu=i686 even though MMX and SSE are ubiquitous since the late > 1990s/early 2000's. > > According to https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html#Common-Function-Attributes, > I access different ISA's with the target attribute: > > __attribute__ ((__target__ ("sse4_2"))) > int main(int argc, char* argv[]) > { > if (HasSSE4()) > { > // use SSE4 > } > else if (HasSSE2()) > { > // use SSE2 > } > else > { > // use C or C++ > } > > return 0; > } > > Debian packagers will compile the code with, say, `gcc -mcpu=i686 > ...`. (I believe they omit the -march=X and -mcpu=X, which effectively > targets a machine without MMX, SSE and friends). You've contradicted yourself there, did you mean they omit -march=X and -mtune=X? For x86 -mcpu=X and -mtune=X are the same, so they only omit -march=X then. Is that right? > Does GCC restrict itself to i686 when it selects instructions? If not, No, not with -mcpu=i686 > then how do I ensure GCC only uses i686 or x86_64 when it selects > instructions? It restricts itself to the (explicit or implicit) -march setting. This is explained at https://gcc.gnu.org/onlinedocs/gcc/x86-Options.html under the -mtune option.