Может ли быть конфликт между ключом -march и набором команд?

Я собираю пример программы с помощью следующей команды:

$ gcc -march=i386 -mtune=i386 -mmmx -msse4 -m3dnow -m32 -o hello.exe hello.c

Вопросы:

  1. Почему GCC не жалуется, что коммутаторы для включения MMX, SSE4 и 3DNow! несовместимы с выбранной архитектурой i386?
  2. Генерирует ли компилятор исполняемый файл, который не может работать на 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,

Другие вопросы по тегам