x86-64 のベースライン (x86-64-v1)
元の 64 ビット x86 機能セットです。すべての x86-64 プロセッサーがサポートしており、今でもコンパイラーがデフォルトでターゲットにするのはこのレベルです。
ベースラインは、最初の x86-64 プロセッサーである AMD の K8 (2003 年) と Intel の 64 ビット NetBurst チップ (2004 年) の機能セットです。浮動小数点用に SSE2 を含むので、これ向けにビルドしたコードが float と double の演算に古い x87 スタックを必要とすることはありません。
| 機能 | 提供するもの | 列挙方法 | Linux のフラグ | 例 |
|---|---|---|---|---|
| CMOV | Conditional move. | CPUID.01H:EDX[15] | cmov | cmov |
| CX8 | 8-byte compare-and-exchange. | CPUID.01H:EDX[8] | cx8 | cmpxchg8b |
| FPU | x87 floating-point unit. | CPUID.01H:EDX[0] | fpu | fld |
| FXSR | FXSAVE and FXRSTOR, saving x87 and SSE state. | CPUID.01H:EDX[24] | fxsr | fxsave |
| MMX | 64-bit integer SIMD. | CPUID.01H:EDX[23] | mmx | emms |
| OSFXSR | The OS has enabled FXSAVE/FXRSTOR and SSE (CR4.OSFXSR). | OS が設定する CR4 のビット OS のサポート。ハードウェア機能: FXSR | 表示なし | fxsave |
| SCE | SYSCALL and SYSRET fast system calls. | CPUID.80000001H:EDX[11] | syscall | syscall |
| SSE | 128-bit single-precision SIMD. | CPUID.01H:EDX[25] | sse | cvtss2si |
| SSE2 | 128-bit double-precision and integer SIMD. | CPUID.01H:EDX[26] | sse2 | cvtpi2pd |
ベースラインにないもの
後のソフトウェアが頼るようになった 2 つの命令が欠けています。ロックフリーなコードが使う 16 バイトの比較交換 (compare-and-exchange) である CMPXCHG16B と、64 ビットモードでの LAHF/SAHF です。初期の K8 と NetBurst の一部のモデルにはこれらがなかったため、psABI は両方を x86-64-v2 に入れました。
このレベルのプロセッサー
すべての x86-64 プロセッサーはベースラインを満たします。次のプロセッサーはベースラインで止まります。
- Intel Core (client)
- NetBurst (Prescott, Nocona) (2004), Core (Merom, Conroe) (2006), Penryn (2007)
- Intel Atom and E-cores
- Bonnell (2008), Saltwell (2011)
- AMD (high performance)
- K8 (Hammer) (2003), K10 (Family 10h) (2007)
- AMD (low power)
- Bobcat (2011)
このレベル向けのビルド
ベースラインは GCC と Clang、Go (GOAMD64=v1)、Rust の x86-64 ターゲットのデフォルトのターゲットなので、普通にビルドすればすでにこのレベルがターゲットになります。明示的に指定するには次のようにします。
gcc -march=x86-64 ...
GOAMD64=v1 go build ...
RUSTFLAGS="-C target-cpu=x86-64" cargo build ...