Почему не GCC жалуются, что коммутаторы для включения MMX, SSE4 и 3DNow! несовместимы с выбранной архитектурой i386?
Поскольку архитектура, выбранная с помощью -march=
, указывает, среди прочего, расширения набора инструкций, которые доступны; вы затем явно добавляете MMX, SSE4 и 3DNow! к набору расширений, которые будет использовать компилятор. Если вы считаете, что i386 является «базовой» архитектурой для следующих архитектур, которые реализовали эти расширения набора инструкций, это имеет смысл.
Путь по-другому: -march=i386
сам по себе уменьшает набор используемых инструкций, включая расширения, так что полученный код будет работать на процессоре 386. Более поздние варианты (-mmmx
и т. Д.) Добавляют к набору инструкций. Комбинация -march=i386 -mmmx
на самом деле не имеет смысла, но если вы специально попросите эту комбинацию, это то, что вы получите. В компиляторе потребовалась бы дополнительная логика, чтобы вывести, что комбинация бессмысленна.
(-march
также устанавливает различные параметры настройки, по крайней мере, для x86. Если я ошибаюсь, -mtune=i386
является избыточным).
Выполняет ли компилятор исполняемый файл, который не может работать на i386?
Да, потенциально; это именно то, что вы просили его делать с каждым из -mmmx -msse4 -m3dnow
.