2016-11-09 34 views
1

我編譯的示例程序使用下面的命令:`-march`和指令集開關之間是否存在衝突?

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

問題:

  1. 爲什麼不GCC抱怨開關用於啓用MMX,SSE4和3DNow!與選擇的架構i386不兼容?
  2. 編譯器是否生成無法在i386上運行的可執行文件?

回答

2

爲什麼GCC不抱怨用於啓用MMX,SSE4和3DNow的開關!與選擇的架構i386不兼容?

因爲使用-march=選擇的體系結構指定了可用的指令集擴展;然後您明確添加MMX,SSE4和3DNow!到編譯器將使用的擴展集。如果您認爲i386是實現這些指令集擴展的以下體系結構的「基礎」體系結構,這非常合理。

換句話說:-march=i386本身減少了使用的指令集,包括擴展名,以便生成的代碼將運行在386處理器上。後來的選項(-mmmx等)添加到使用的指令集。 -march=i386 -mmmx的組合沒有意義,但如果你特意要求這種組合,那就是你會得到的。編譯器需要額外的邏輯來推斷組合是無意義的。至少對於x86來說,除非我弄錯了,否則-mtune=i386是冗餘的)。

編譯器是否生成無法在i386上運行的可執行文件?

是的,可能;這正是你要求它做的每個-mmmx -msse4 -m3dnow

相關問題