GCCのi386/x86-64向けCPU別の最適化オプション(GCC 4.2.0)

簡単なまとめ。
参考: http://gcc.gnu.org/onlinedocs/gcc-4.2.0/gcc/i386-and-x86_002d64-Options.html

検索サイトから飛んできた方へ:
特定のCPU向けの最適オプションをお探しでしたら、Safe Cflags - Gentoo Linux Wikiの下にあるProcessor Specific CFLAGSをご覧ください。

CPUの種類

-mtune=(cputype)
生成するコードを指定されたCPU向けに最適化(ABIと命令セット以外)します。-mcpuと同義です。
-march=(cputype)
指定されたCPU だけで動作するようなコードを生成します。-mtuneも同時に指定されます。
-marchでは、CPUの種類としてgenericを指定することはできません。
このオプションを指定しない場合、コンパイラIntel i386で動作するようなコードを生成します。

指定できるCPUの種類

-mtune, -march共に共通です。

generic もっとも一般的なIA32/AMD64/EM64T(今後のGCCのバージョンアップで挙動が変わる可能性あり。GCC 4.2.0ではi686
native コンパイルを実行したマシン(CPUID命令で判別)
i386 オリジナルのIntel i386
i486 Intel i486(スケジューリングは未実装)
i586, pentium Intel PentiumMMXなし)
pentium-mmx Intel PentiumMMX
pentiumpro Pentium Pro
i686 GCC 4.2.0では)genericと同義(-marchオプションで使われた場合は、pentiumproと同義)
pentium2 Intel Pentium2 (with MMX)
pentium3, pentium3m Intel Pentium3 (with MMX, SSE)
pentium-m Centrinoなどの、低電力版Pentium3 (with MMX, SSE, SSE2)
pentium4, pentium4m Intel Pentium4 (with MMX, SSE, SSE2)
prescott Intel Pentium4の改良版 (with MMX, SSE, SSE2, SSE3)
nocona Intel Pentium4の改良版 (with MMX, SSE, SSE2, SSE3, 64bit拡張)
k6 AMD K6 (with MMX)
k6-2, k6-3 AMD K6の改良版 (with MMX, 3DNow!)
athlon, athlon-tbird AMD Athlon (with MMX, 3DNow!, Enhanced 3DNow!, SSE prefetch)
athlon-4, athlon-xp, athlon-mp AMD Athlonの改良版 (with MMX, 3DNow!, Enhanced 3DNow!, SSE)
k8, opteron, athlon64, athlon-fx AMD K8ベースの64bitCPU (with MMX, 3DNow!, Enhanced 3DNow!, SSE, SSE2, 64bit拡張のスーパーセット)
winchip-c6 IDT WinChip C6 (i486 with MMX と同様)
winchip2 IDT WinChip2 (i486 with MMX, 3DNow! と同様)
c3 Via C3 (with MMX, 3DNow! スケジューリングは未実装)
c3-2 Via C3-2 (with MMX, SSE スケジューリングは未実装)

genericnativeGCC 4.2.0から追加されました。それ以外のcputypeはGCC 3.4.6でも利用できます。
Intel Core2向けにcore2が、AMD Geode向けにgeodeGCC 4.3で追加されました。

SSE関係

-mfpmath=(387|sse|sse,387)
浮動小数点数演算を、指定されたユニットで行うコードを生成します。

387 (Default@i386)387向けのコード
sse (Default@x86-64)SSE命令セットを用いたコード(-msse{,2,3}を指定する必要あり)
sse,387 (experimental)両方の命令セットを同時に利用するようにしたコード(利用できるレジスタ数が倍になり、CPU資源を有効活用できる)

sseを指定して生成されるコードはほとんどの場合かなり高速で、かつ387の数値安定性の問題を回避できますが、レジスタが80bitであるという前提で書かれたコードで問題が起きる可能性があります。また、SSEでは、倍精度浮動小数点数演算や拡張精度浮動小数点数演算(double and extended precision arithmetics)を387で行います。SSE2以降で、倍精度浮動小数点数演算がサポートされます。

-mmmx
-mno-mmx
-msse
-mno-sse
-msse2
-mno-sse2
-msse3
-mno-sse3
-m3dnow
-mno-3dnow
MMX, SSE, SSE2, SSE3, 3DNow!を有効にするかどうかを設定します。
CPU判別コードを持つプログラムは、これらのオプションを使わずにコンパイルすべきです。