x86-64 baseline (x86-64-v1)
The original 64-bit x86 feature set. Every x86-64 processor supports it, and it is still what compilers target by default.
The baseline is the feature set of the first x86-64 processors, AMD’s
K8 (2003) and Intel’s 64-bit NetBurst chips (2004). It includes SSE2
for floating point, so code built for it never needs the old x87 stack
for float and double arithmetic.
| Feature | What it provides | Enumerated by | Linux flag | Example |
|---|---|---|---|---|
| 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). | CR4 bit set by the OS OS support; hardware feature: FXSR | not shown | 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 |
What is not in the baseline
Two instructions that later software came to rely on are missing:
CMPXCHG16B (a 16-byte compare-and-exchange, used by lock-free code)
and LAHF/SAHF in 64-bit mode. Some early K8 and NetBurst models
lacked them, so the psABI placed both in x86-64-v2.
Processors at this level
Every x86-64 processor meets the baseline. These stop there:
- 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)
Building for it
The baseline is the default target of GCC and Clang, Go
(GOAMD64=v1) and Rust’s x86-64 targets, so a plain build already
targets it. To ask for it explicitly:
gcc -march=x86-64 ...
GOAMD64=v1 go build ...
RUSTFLAGS="-C target-cpu=x86-64" cargo build ...