2016-11-09 16 views
1

Я компиляции пример программы, с помощью следующей команды:Может ли быть конфликт между переключателями `-march` и набора команд?

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

Вопросы:

  1. Почему не НКУ жалуются, что переключатели для включения MMX, SSE4 и 3DNow! несовместимы с выбранной архитектурой i386?
  2. Составляет ли компилятор исполняемый файл, который не может работать на i386?

ответ

2

Почему не 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.