ベースラインは、最初の x86-64 プロセッサーである AMD の K8 (2003 年) と Intel の 64 ビット NetBurst チップ (2004 年) の機能セットです。浮動小数点用に SSE2 を含むので、これ向けにビルドしたコードが float と double の演算に古い x87 スタックを必要とすることはありません。

x86-64-v1 で追加される機能。
機能提供するもの列挙方法Linux のフラグ例
CMOVConditional move.CPUID.01H:EDX[15]cmovcmov
CX88-byte compare-and-exchange.CPUID.01H:EDX[8]cx8cmpxchg8b
FPUx87 floating-point unit.CPUID.01H:EDX[0]fpufld
FXSRFXSAVE and FXRSTOR, saving x87 and SSE state.CPUID.01H:EDX[24]fxsrfxsave
MMX64-bit integer SIMD.CPUID.01H:EDX[23]mmxemms
OSFXSRThe OS has enabled FXSAVE/FXRSTOR and SSE (CR4.OSFXSR).OS が設定する CR4 のビット
OS のサポート。ハードウェア機能: FXSR
表示なしfxsave
SCESYSCALL and SYSRET fast system calls.CPUID.80000001H:EDX[11]syscallsyscall
SSE128-bit single-precision SIMD.CPUID.01H:EDX[25]ssecvtss2si
SSE2128-bit double-precision and integer SIMD.CPUID.01H:EDX[26]sse2cvtpi2pd

ベースラインにないもの

後のソフトウェアが頼るようになった 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 ...

出典

  1. x86-64 psABI: Micro-Architecture Levels
  2. Go 1.18 release notes (GOAMD64)