80x87 Math Coprocessors
The 80x87 family of Math Coprocessors are typical examples of numeric coprocessors that were common in the 1980's.
The 80x86 CPUs with which they were paired, up until the arrival of the 80486DX with its built-in FPU, could handle only 8, 16, or 32 bit integers as their basic data types. Since many PC-based applications required the use floating-point numbers (such as computing interest, and in the geometric calculations inherent in CAD/CAM processing), significant system performance gains were possible by adding an optional coprocessor.
The 80x87 coprocessors added eight floating-point registers, five additional data types and over 70 additional instructions, all designed to deal directly with floating-point numbers as a basic data type. This effectively removed the 'penalty' for floating-point computations and increased overall system performance for applications that depended on these calculations.
In addition to being able to quickly execute load/store operations on floating-point numbers, the 80x87 coprocessors would directly perform all the basic arithmetic operation on them. Besides "knowing" how to add, subtract, multiply and divide floating-point numbers, they can also operate on them to perform comparisons, square roots, transcendental functions (such as logarithms and sine/cosine/tangent), and compute their absolute value and remainder.
Intel Chips
8087
The Intel 8087 was the first math coprocessor for 16-bit processors designed by Intel (the I8231 was older but designed for the 8-bit Intel 8080). It could be used with Intel 8088 or 8086 CPUs, and could also be used with NEC V20 and NEC V30 CPUs.
80187
Intel didn't release an '80187' with the 80186 and 80188 CPUs, instead depending on the Intel 8087. However a CMOS based Intel 80C187 was released much later, with the 80C186. It could not be used with either the earlier 801866/80188 CPUs, nor the 8-bit bus CMOS varients such as the 80C188.
80287
The Intel 80287 was for Intel 80286 and 80386 CPUs. Intel (and its competitors) later introduced an 80287XL, which was essentially an 80387SX with a 287 pinout. The 80287XL contained an internal 3/2 multiplier so that motherboards which ran the coprocessor at 2/3 CPU speed could instead run the FPU at the same speed of the CPU.
The 80287 and 80287XL were the only coprocessors available for the 80386 at its launch, until the introduction of the Intel 80387 in 1987.
80387
The Intel 80387 was the first Intel coprocessor to be fully compliant with the IEEE 754 standard. Released in 1987, some two years after the 386 chip, the i387 included much improved speed over Intel's previous 8087/80287 coprocessors, and improved the characteristics of trigonometric functions (the 80287 limited the argument range to plus or minus 45 degrees).
The i387 was compatible only with the standard i386 chip, which with a seperate 80387SX version being required for use with the low-cost i386SX (because of its 16-bit data bus).
80487
The Intel i487SX was marketed as a floating point unit coprocessor for Intel 486SX machines, but actually contained a full-blown 486DX implementation and when installed disabled the main CPU and took over all CPU operations. This was necessary to avoid a deep performance penalty if the FPU did not have access to the 486 caches.
Relative Performance
x87 Performance | FADD | FMUL | FDIV | FXCH | FCOM | FSQRT | FPTAN | FPATAN | Max Clock | Peak FMUL/sec | Relative 5 MHz 8087§ FMUL |
---|---|---|---|---|---|---|---|---|---|---|---|
8087 | 70~100 | 90~145 | 193~203 | 10~15 | 40~50 | 180~186 | 30~540 | 250~800 | 5→10 MHz | 34~55K → 100~111K | 1.0 → 2.0 times as fast |
80287 (original) | 70~100 | 90~145 | 193~203 | 10~15 | 40~50 | 180~186 | 30~540 | 250~800 | 6→12 MHz | 41~66K → 83~133K | 1.2 → 2.4 times as fast |
80387 (and later 287 models) | 23~34 | 29~57 | 88~91 | 18 | 24 | 122~129 | 191~497 | 314~487 | 16→33 MHz | 280~552K → 579~1100K | approx 10 → 20 × as fast |
80486 (or 80487) | 8~20 | 16 | 73 | 4 | 4 | 83~87 | 200~273 | 218~303 | 16→50 MHz | 1.0M → 3.1M | approx 18 → 56 × as fast |
Pentium | 1~3 | 1~3 | 39 | 1 (0*) | 1~4 | 70 | 17~173 | 19~134 | 60→300 MHz | 20~60M → 100~300M | approx 1100 → 5400 × |
Pentium Pro | 1~3 | 2~5 | 16~56 | 1 (0*) | 1 | 28~68 | todo | todo | 150→200 MHz | 30~75M → 40~100M | approx 1400 → 1800 × |
Pentium II / III | 1~3 | 2~5 | 17~38 | 1 (0*) | 1 | 27~50 | todo | todo | 233→1400 MHz | 47~116M → 280~700M | approx 2100 → 13000 × |
Pentium 4 | 1~5 | 2~7 | 20~43 | 1 (0*) | todo | 20~43 | todo | todo | 1.3→3.8 GHz | 186~650M → 0.543~1.90G | approx 11000 → 34000 × |