Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why does "i586" refer to Pentium 1, and why does "i686" refer to Pentium Pro?

"i486" refers to Intel 80486 (because 80486 ends with 486).

But why does "i586" refer to Pentium 1, and why does "i686" refer to Pentium Pro?

like image 942
Tom Avatar asked Apr 15 '19 14:04

Tom


People also ask

Is Pentium M i686?

It is frequently referred to as i686. It was succeeded by the NetBurst microarchitecture in 2000, but eventually revived in the Pentium M line of microprocessors. The successor to the Pentium M variant of the P6 microarchitecture is the Core microarchitecture which in turn is also derived from P6.

Is i386 the same as i686?

Eventually all of these got encapsulated into the x86 architecture name. i686 just refers to the 6th generation of x86 architecture. For all intents and purposes i386 and i686 is the same thing, just that i686 is a lot newer. They will have some additional instruction sets, but will be backwards compatible with i386.

Is Pentium 4 a i686?

Pentium 4 is never an appropriate base CPU for i686. i686 code is expected to work on a Pentium Pro. In the GCC case, yes. In the Rust context, i686 means SSE2 (i.e. Pentium 4 / Pentium M) and i586 means without SSE.

What is i486 i586?

i486 refers to the 80486 processor family, i586 refers to Intel Pentium or Pentium MMX processors, and i686 refers to all. Pentium Pro and later processors.


1 Answers

Intel switched to names for marketing because you can trademark a name but not a number. (Apparently according to a US court decision).

People (especially Linux and GCC developers) found it convenient, compact, and/or "clever" to continue the numbering scheme for the next 2 generations of microarchitecture families.

There is some justification for this:

  • The official name for the microarchitecture family used in Pentium is P5, Intel's fifth x86 microarch. The first-gen Pentium P5 has product 80500 for the earliest steppings, and later versions have codes like 80501 and 80502, not 80586, but the number 5 does appear in there, too.

    But the number 5 does appear in the microarchitecture codes. These days microarchitectures have names like Nehalem or Skylake, but at this point we had P5, then P54C (the 3.3 Volt version), some others, then P55C (Pentium MMX 80502) which included other architectural improvements and a longer pipeline (6 vs. 5 stages).

  • PPro and PII / PIII are based on the P6 microarchitecture. Later members of the P6 microarchitecture family include Pentium-M / Core, and Core 2 (confusingly called the "Core" microarchitecture). Nehalem / Westmere is the last generation of P6-family, with Sandybridge being the start of a new and distinct (but related) family.

    But the point remains, Intel does officially use the term P6 in their manuals and documents, which contains the number 6, so it's totally reasonable to coin the term i686 to describe CPUs that support new instructions like cmov, and/or that do out-of-order execution, or whatever relevant i686 feature you want to talk about.


CPUs starting with Pentium and late 486 identify themselves with the CPUID instruction. EAX=1 / cpuid produces a result in EAX that tells you the CPU Family, model, stepping.

(EAX=0 / cpuid gives you a vendor string: "GenuineIntel" for Intel.)

http://www.sandpile.org/x86/cpuid.htm#level_0000_0001h

  • 486 reports Family=4
  • P5 uarches report Family=5.
  • P6-family (and sandybridge-family) uarches report Family=6. Intel stopped incrementing "family" at 6, other than Pentium 4. So despite SnB-family generally being considered a different family, current Intel CPUs report Fam 6 in CPUID, just with different Model codes.
  • Itanium CPUs emulating x86 report Family=7.
  • Pentium 4 (NetBurst microarchitecture): Family=15 (+ extended family=0)

Some other vendors reported Family=4 5 or 6 for their Pentium and PPro-compatible CPUs, like AMD 5x86 / k5 / k6, NextGen, Centaur, etc. Of course they have their own Vendor strings, but it in general it wasn't totally insane to take the "family" field and stuff that into a "i%d86" printf format string or something.

like image 133
Peter Cordes Avatar answered Jan 03 '23 06:01

Peter Cordes