Может ли быть конфликт между ключом -march и набором команд?
Я собираю пример программы с помощью следующей команды:
$ gcc -march=i386 -mtune=i386 -mmmx -msse4 -m3dnow -m32 -o hello.exe hello.c
Вопросы:
- Почему GCC не жалуется, что коммутаторы для включения MMX, SSE4 и 3DNow! несовместимы с выбранной архитектурой i386?
- Генерирует ли компилятор исполняемый файл, который не может работать на i386?
1 ответ
Почему 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
,