Fact-checked by Grok 2 weeks ago

Intel 8087

The Intel 8087, officially known as the Numeric Data Processor (NDP), is a floating-point released by Intel in 1980 to enhance numeric computation capabilities for the 8086 and 8088 microprocessors, as well as the i432 architecture. It performs high-speed arithmetic and comparison operations on a range of data types, including single-precision (32-bit), double-precision (64-bit), and extended-precision (80-bit) floating-point numbers, alongside integer and packed formats, enabling efficient handling of complex mathematical tasks that would otherwise burden the host CPU. Development of the 8087 began in 1976 under the leadership of Intel engineer John Palmer, with mathematician serving as a key consultant to ensure mathematical accuracy and portability. Fabricated using HMOS technology with approximately 40,000 transistors, the chip integrates a microprogrammed , an 80-bit register stack for operands, and an on-chip containing a comprehensive math library that supports transcendental functions like sine, cosine, logarithm, and , alongside basic operations such as , , , and . The 8087 communicates with the host processor via a shared 20-bit address bus and 16-bit data bus, using escape instructions () in the 8086 instruction set to invoke its operations, and it signals busy states through dedicated pins to synchronize execution. A defining aspect of the 8087 is its foundational influence on the floating-point standard, ratified in 1985; its specifications for precisions, exponent ranges, special values like Not-a-Number () and infinities, and the innovative concept of gradual underflow via subnormal numbers were disclosed by Kahan and to the IEEE P754 in the late , shaping the K-C-S draft that became the basis for the standard. This design prioritized Intel's "REALMATH" goals of high performance, ease of use, and consistent results across software environments, making it essential for early personal computers and scientific applications requiring precise real-number calculations. The 8087's architecture set precedents for subsequent coprocessors like the 80287 and integrated FPUs in later x86 processors, marking a pivotal advancement in numeric processing during the late and early .

History and Development

Background and Design Goals

In the late 1970s, initiated development of the 8087 Numeric Data Processor to address the limitations of the 8086 , which lacked native support for essential for scientific and engineering applications. Development began in 1976 under the leadership of John Palmer, with mathematician serving as a key consultant to ensure mathematical accuracy. The 8086, introduced in 1978, prioritized integer operations for general-purpose , leaving complex numerical tasks to software that was both slow and error-prone, motivating the creation of a dedicated to accelerate computations like , , , , and by offloading them from the host CPU. This effort aligned with the growing demand for affordable, high-performance personal systems capable of handling advanced mathematical workloads without requiring expensive mainframe upgrades. Key design goals emphasized high-speed performance through microcoded execution, enabling efficient handling of numeric instructions while maintaining tight integration with the 8086 via a shared bus and coprocessing protocol. The architecture adopted a stack-based model to reduce register management overhead, allowing seamless operand handling in numeric operations. Compatibility was prioritized by using escape instructions in 8086 software to invoke 8087 functions, ensuring minimal changes to existing codebases and promoting adoption in and systems. These objectives drew partial influence from earlier numeric processors like the Intel 8231, but focused on deeper synchronization with the 8086/8088 family for overlapped execution. The project was led by Intel's arithmetic unit team, with architectural design by John F. Palmer and Bruce Ravenel, and implementation handled by Rafi Nave's group in ; prototypes were ready by 1979, culminating in the 8087's release in 1980 as Intel's largest and most complex to date.

Announcement and Production

The Intel 8087 numeric was announced by in June 1980, initially specified to operate at a 5 MHz clock speed. First commercial shipments began in 1980, with widespread availability achieved by 1981. Production of the 8087 utilized Intel's HMOS III manufacturing process, starting with a 4.5 μm feature size that was later refined to 3 μm for improved efficiency. The die contained approximately 40,000 transistors, reflecting the chip's complex design for handling floating-point operations. A key factor in the 8087's early adoption was the inclusion of an optional socket on the motherboard of the PC, launched in 1981, which allowed users to add the for enhanced numeric performance. Despite its high initial cost of $150 to $300, this design choice facilitated integration into personal computing systems and drove sales among developers of math-intensive applications. Early production encountered challenges, including yield issues stemming from the chip's high transistor density and intricate microcode ROM implementation, which contributed to delays in scaling output. Overall production continued into the mid-1990s to support legacy 8086-based systems.

Physical and Electrical Characteristics

Manufacturing Process

The Intel 8087 numeric data processor was fabricated using an N-channel depletion-load silicon gate high-performance MOS (HMOS) process, which enabled high-speed operation while maintaining compatibility with the 8086 microprocessor family. This HMOS III technology featured minimum dimensions of approximately 4 μm for polysilicon spacing and 5 μm for diffusion regions, reflecting the state-of-the-art semiconductor fabrication techniques of the early 1980s that balanced density and yield. Later production runs achieved a process shrink to around 3 μm, improving performance and reducing costs without altering the core design. The die measured roughly 5 mm by 6 mm and contained approximately 40,000 transistors, as determined through detailed of delidded chips. This transistor budget supported essential components such as a ROM for decoding and , along with dedicated pipelines for floating-point operations, pushing the boundaries of NMOS at the time. A key innovation in the chip's layout was the hardware implementation of the (COordinate Rotation DIgital Computer) algorithm for computing transcendental functions like sine, cosine, , and logarithms; this approach used simple shift-and-add operations with pre-stored ROM constants (such as arctan(2^{-n}) values) instead of resource-intensive multipliers, thereby optimizing area and execution speed to just 16 cycles per iteration. To manage power while enhancing performance, the 8087 incorporated a that generated a negative voltage (approximately -3 V) from the single +5 V supply using on-chip charge pumps. This reduced leakage currents and improved switching speeds in the NMOS devices. Typical power dissipation was around 2 when operating at 5 MHz, with maximum ratings up to 2.4 under full load, making it suitable for integration into contemporary PC systems without excessive thermal demands.

Package and Pinout

The Intel 8087 is housed in a 40-pin Ceramic Dual In-line Package (CERDIP) measuring 52.5 mm in length, 13.8 mm in width, and 5.1 mm in height. This package type provides robust sealing suitable for commercial applications and facilitates direct integration with 8086/8088-based systems via a socket. The pinout configuration supports multiplexed operation with the host CPU, featuring 20 shared / lines labeled AD0 through AD19 for bidirectional transfer of operands and results. Control signals include BUSY# (active low) to indicate the coprocessor is executing an instruction and cannot accept new commands, ERROR# (active low) to flag exceptions or invalid operations, and REQUEST# (active low) for the 8087 to request bus from the CPU during fetches. Additional pins encompass bus signals such as CLK for , RESET for initialization, INTR for generation, and power connections with at +5 V and multiple GND returns for stable operation.
Key Pin CategoryPinsFunction
Address/DataAD0–AD19Multiplexed lines for 20-bit addressing and 16-bit data I/O, compatible with 8086/8088 bus.
Control/StatusBUSY#, ERROR#, REQUEST#BUSY# signals active computation; ERROR# reports faults; REQUEST# handles bus .
Power/Ground, GND (multiple)+5 V supply and grounds for TTL-level signaling.
Electrically, the 8087 employs TTL-compatible I/O with a supply voltage of +5 V ±5% (absolute maximum 5.25 V) and an range of 0°C to 70°C for commercial-grade variants. Bus loading is minimized with typical input of 5–20 per pin and output capacitance under 15 , while timing parameters include a maximum delay of 200 ns for control signals to ensure seamless integration without significantly impacting host CPU performance at clock speeds up to 10 MHz. The design supports straightforward socketed installation, such as in the U51 position on the , enabling users to add the post-manufacture for enhanced numeric processing.

Architecture

Register Organization

The Intel 8087 Numeric Data Processor utilizes a stack-oriented consisting of eight 80-bit registers, designated ST(0) through ST(7), which serve as the primary storage for and results during floating-point computations. These registers are arranged in a linear array that operates as a push-down , with ST(0) functioning as the top-of-stack (TOS) and default accumulator for implicit operand referencing in most instructions. The stack grows downward, meaning pushes decrement the stack pointer and load into the new TOS, while pops increment it and may clear the tag for the vacated register. Register addressing relies primarily on the implicit TOS model, where operations treat ST(0) as the primary and ST(1) as the secondary unless otherwise specified. For explicit access to deeper elements, the FXCH (exchange) swaps ST(0) with ST(i), where i ranges from 1 to 7, temporarily repositioning the desired at the TOS for manipulation. The current TOS position is tracked by a 3-bit pointer (TOP) that wraps modulo 8, ensuring circular behavior without overflow beyond the eight registers. This design promotes efficient pipelined execution by minimizing explicit addressing overhead. A 16-bit status word captures the coprocessor's operational state and computation outcomes. Key fields include the busy flag (bit 15, indicating ongoing execution), condition code flags C0–C3 (bits 8, 9, 10, and 14, used for result comparisons and conditional control), the TOP pointer (bits 11–13), and exception indicators comprising individual flags for invalid operation, denormalized operand, , overflow, underflow, and precision (bits 0–5), plus stack fault (bit 6) and error summary (bit 7). These flags enable software to query and respond to arithmetic conditions post-instruction. The 16-bit control word governs arithmetic precision, rounding behavior, and exception handling. Its rounding control field (bits 10–11) selects among four modes: round to nearest (or even on ties, RN), round toward positive infinity (RP), round toward negative infinity (RM), or truncate toward zero (RZ). The precision control field (bits 8–9) specifies output formats as single-precision (32-bit), double-precision (64-bit), or extended-precision (80-bit). Exception mask bits (0–5) allow individual disabling of interrupts for the corresponding conditions, with reserved bits ensuring compatibility. This word is loaded from memory to initialize the processor environment. Complementing the data registers, a 16-bit tag word associates type descriptors with each stack element using 2 bits per register (16 bits total). The encoding identifies contents as valid finite non-zero non-special (11), zero (10), empty (01), or special (00, encompassing NaNs, infinities, and other invalid values). Primarily an internal optimization mechanism, the word accelerates paths by avoiding redundant normalizations or validity checks on empty or zero entries, while also permitting software inspection for .

Data Types and Formats

The Intel 8087 supports three primary categories of numeric data types: floating-point reals in short, long, and temporary formats; binary integers in word, doubleword, and quadword sizes; and packed (BCD) numbers. All data types are designed for compatibility with the 8086/8088 memory model and are automatically converted to the internal 80-bit temporary real format upon loading into the coprocessor's register stack for uniform processing. Floating-point data types follow a sign-magnitude representation with a biased exponent and normalized mantissa. The short real (single-precision) format occupies 32 bits, consisting of 1 sign bit, an 8-bit exponent (biased by 127), and a 23-bit mantissa with an implicit leading 1 for normalized numbers. The long real (double-precision) format uses 64 bits: 1 sign bit, an 11-bit exponent (biased by 1023), and a 52-bit mantissa, again with an implicit leading 1. The temporary real (extended-precision) format, used internally in the 80-bit registers and optionally for memory storage, spans 80 bits: 1 sign bit, a 15-bit exponent (biased by 16383), and a 64-bit mantissa that includes an explicit leading integer bit (always 1 for normalized values, distinguishing it from the implicit bit in shorter formats). These formats provide ranges from approximately ±10^{-38} to ±10^{38} for short reals and extended precision up to ±10^{4932}, with corresponding mantissa precisions of 24, 53, and 64 bits including the leading bit. Integer data types are stored in two's complement binary form and support both signed and unsigned interpretations depending on the instruction used. The word integer is 16 bits wide, accommodating values from -32,768 to 32,767 (signed) or 0 to 65,535 (unsigned). The doubleword integer extends to 32 bits, ranging from -2^{31} to 2^{31}-1 (signed) or 0 to 2^{32}-1 (unsigned). The quadword integer, used temporarily in registers, is 64 bits, supporting signed values from -2^{63} to 2^{63}-1 or unsigned from 0 to 2^{64}-1. These formats enable direct loading from and storing to memory without sign extension issues for aligned operands. The packed BCD format represents numbers in an 80-bit (10-byte) , allowing up to 18 plus a sign. It consists of 10 bytes, with the first 9 bytes packing two per byte (the most significant pair in the first byte), and the 10th byte holding the sign in its high (0 for positive, D for negative) and 0 in the low . This format facilitates exact arithmetic without binary conversion rounding errors, commonly used in financial and legacy applications. The 8087 lacks native support for Not-a-Number () values as defined in later standards; instead, invalid operations such as indeterminate forms (e.g., 0/0) or invalid operands produce a pseudo-NaN, represented by a specific reserved exponent pattern with a non-zero , which sets the invalid-operation exception flag and may propagate as an "INDEFINITE" result if masked.

Instruction Set Overview

The Intel 8087 features 69 numeric instructions designed to extend the 8086/8088 processor's capabilities for floating-point and integer . These instructions are encoded using prefixes in the opcode range 0xD8 to 0xDF, which the CPU recognizes and passes to the for execution while performing dummy reads for any operands. The instructions are categorized by function: data transfer for loading and storing values; for basic computations; transcendental for advanced mathematical functions; for evaluating relations; and for managing the coprocessor's state. Data transfer instructions include FLD to push a value from onto the register stack and FST to store the top-of-stack (TOS) value to , with FSTP popping the after storage; FXCH exchanges two stack elements for flexible manipulation. Arithmetic instructions encompass FADD, FSUB, FMUL, and FDIV for real-number operations on stack elements or , alongside FSQRT for computing square roots and FSCALE for exponent adjustment. Integer operations are handled by prefixed variants such as FIADD for adding integers to the TOS and FIMUL for , supporting 16-, 32-, or 64-bit values. Packed BCD arithmetic is enabled by FBSTP, which stores the TOS as an 18-digit packed with sign, and FBLD for the reverse, facilitating decimal computations without conversion. The 8087's eight 80-bit registers form a that grows downward, with the TOS implicitly referenced in most operations and no direct addressing modes; pushes occur via FLD, pops via FSTP, and stack pointer adjustments via FINCSTP or FDECSTP. Transcendental instructions, including FPTAN for partial , FPATAN for partial arctangent, and F2XM1 for $2^{ST(0)} - 1, are implemented using the algorithm, which approximates results through iterative vector rotations via shifts and additions for hardware efficiency; for instance, functions like FSIN rely on approximately 16 such iterations to attain the coprocessor's precision. Comparison instructions such as FCOM, which compares the TOS to another value and sets condition code flags, and FTST, which tests the TOS against zero, enable conditional branching via status word examination. Control instructions like FINIT, which initializes the and clears exception flags, FLDCW for loading the word to set and modes, and FNOP for a null operation, ensure proper setup and flow . These instructions execute via the .

Coprocessor Integration

Interface Protocol

The Intel 8087 coprocessor communicates with the 8086 CPU over a shared multifunction bus, enabling concurrent execution of numeric instructions without requiring dedicated communication lines. The 8087 continuously monitors the address/data lines AD0–AD19 for escape (ESC) opcodes, which are bit patterns starting with 11011xxx that identify floating-point instructions destined for the coprocessor. Upon detecting such an opcode during an instruction fetch, the 8087 decodes the instruction and prepares to execute it inline with the CPU's operation, ensuring transparent coprocessing. This bus monitoring allows the 8087 to observe all CPU instruction fetches in real time, responding only to relevant ESC sequences while ignoring integer instructions. To maintain synchronization between the CPU's prefetch queue and the coprocessor's execution, the protocol leverages queue status signals and dedicated control pins. In maximum mode, the 8086 outputs queue status lines QS0 and QS1, indicating the current state of its four-byte instruction queue (e.g., next byte to fetch or queue empty). The 8087 uses these signals, along with direct bus observation, to snoop the queue and align its instruction decoding with the CPU's progress. For status feedback, the 8087 drives its BUSY signal onto the shared TEST pin, which serves as an input to the 8086; this allows the CPU to poll the coprocessor's readiness during instruction execution. Additionally, the 8087 employs the RQ#/GT# (request/grant) pins to assert control over the bus when needed, such as to fetch the full instruction following an ESC opcode or to coordinate with other bus masters, ensuring orderly handoff without stalling the primary processor. Operand transfers in the protocol mimic () operations to minimize CPU overhead. When a floating-point instruction requires memory operands, the 8086 computes the effective address and initiates the bus cycle as usual, placing data on the shared bus. The 8087, having already decoded the instruction via snooping, latches the operand directly from the bus during this cycle, without asserting hold requests or halting the CPU. For longer operands (e.g., 32-bit or ), the 8087 may briefly request bus ownership via the RQ#/GT0 pin connected to the CPU's RQ/GT1, performing the transfer in a single atomic operation before releasing control. This approach allows the to handle data movement efficiently while the CPU continues prefetching or executing non-numeric code. Exceptions and errors are handled through simple pin-based signaling, integrating seamlessly with the host system's interrupt framework. If an unmasked numeric error occurs (e.g., divide-by-zero or ), the 8087 asserts the active-low ERROR# pin, which can be wired to trigger a (NMI) or standard on the 8086. The coprocessor then outputs an on its INT pin, directly connected to the CPU's interrupt input, prompting the 8086 to service the condition via its standard vectoring mechanism. Notably, the 8087 lacks a built-in interrupt controller, relying instead on the CPU and external logic for and handling, which keeps the interface lightweight and compatible with existing 8086-based systems.

Synchronization Mechanisms

The Intel 8087 synchronizes with the host CPU, such as the 8086 or 8088, to ensure proper sequencing of operations, preventing the CPU from proceeding until the coprocessor completes its tasks or signals an error. This coordination relies on signals and specific instructions that allow overlapped execution while maintaining and correct program flow. The primary mechanism involves the CPU polling the coprocessor's status to detect ongoing activity or faults, enabling efficient without software overhead for most cases. The WAIT instruction (also known as FWAIT in later assemblers) is the core software element for synchronization, causing the CPU to pause execution until the 8087 indicates it is ready. Upon encountering WAIT, the CPU samples its TEST input pin, which is typically connected to the 8087's BUSY output; if BUSY is asserted (active high), the CPU enters an idle state and continuously resamples the pin until it deasserts (goes low), at which point execution resumes. This polling typically adds 3-4 clock cycles if the coprocessor is idle but can extend indefinitely for long operations, with resamples occurring every 5-6 cycles during the wait. Assemblers automatically insert WAIT before each escape (ESC) instruction to the 8087, ensuring the coprocessor is not busy before queuing a new operation, and programmers add it after instructions that modify data the CPU may access next. For example, in a subroutine performing a floating-point store (FSTP), a subsequent WAIT guarantees completion before the CPU reads the result, avoiding race conditions. The provides the hardware basis for runtime synchronization, asserted high by the 8087 at the start of any numeric execution and held until completion or interruption by an unmasked exception. This signal remains active for durations varying by complexity, typically over 100 cycles for basic arithmetic like or but extending to several hundred or over a thousand cycles for transcendental functions or iterative algorithms. Deassertion signals the is idle and ready for the next , allowing the CPU's WAIT to proceed without further delay. The BUSY pin (detailed in the package and pinout) connects directly to the CPU's input, enabling transparent polling that supports overlapped execution where the CPU handles tasks while the 8087 processes floating-point operations. If no 8087 is present, the TEST input may float high, causing indefinite hangs on WAIT, which early systems mitigated through presence detection routines. Error handling integrates with synchronization via the ERROR# signal, which the 8087 asserts low (active) upon detecting an unmasked numeric exception, prompting the CPU to invoke a handler for . This signal can route to the CPU's NMI or INTR pin, generating an , conventionally vectored at 75H (IRQ13) in PC-compatible systems, that the operating system or application processes, often involving status word examination and reinitialization. Masked exceptions, set via the control word, allow the 8087 to continue execution internally without asserting ERROR#, substituting results like for ; unmasking requires explicit software control and a subsequent WAIT to synchronize before proceeding. The FCLEX instruction clears pending exceptions and deasserts ERROR# without waiting, but programmers typically follow it with WAIT to ensure the state is stable. This mechanism ensures faults do not disrupt overall program flow unless intentionally exposed for precision. Initialization occurs via the FINIT instruction, which resets the 8087 to a default state at power-on or software start, clearing the stack, exception flags, and while loading the word with 64-bit , round-to-nearest , and all exceptions masked. Execution takes approximately 5 clock cycles (or 1 µs at typical speeds), after which a WAIT confirms readiness by polling BUSY, which deasserts immediately post-initialization. This step establishes a clean environment, preventing residual states from prior operations and enabling reliable synchronization from the outset; without it, undefined behaviors like stack overflows could arise. FINIT is non-waiting in some variants (FNINIT), allowing faster setup in detection sequences, but always pairs with WAIT for full coordination.

Standards and Compliance

Relation to IEEE 754

The Intel 8087, announced in 1980, predated the standard by five years and significantly shaped its development, as the coprocessor's design was underway during the standard's drafting phase beginning in 1977. The 8087's 32-bit single-precision and 64-bit double-precision formats provided the foundational binary representations that were adopted directly into , ensuring compatibility for basic floating-point operations across systems. Its 80-bit extended-precision format, featuring an explicit leading bit and a 15-bit exponent, established the template for the double-extended precision used in the family of coprocessors, which became a extension in IEEE-compliant environments. In terms of conformances, the 8087 aligns closely with core IEEE 754 requirements for the single- and double-precision formats, supporting binary interchange codes that allow seamless data exchange between compliant systems. It implements gradual underflow via denormal (subnormal) numbers, which extend the representable range below the smallest normalized value—such as down to approximately 4.9 × 10^{-324} in double precision—thereby preserving precision and avoiding catastrophic loss during computations. The coprocessor also fully supports the four IEEE-specified rounding modes, configurable through its control word: round to nearest (ties to even), round toward zero (chop), round toward positive infinity, and round toward negative infinity, enabling precise control over arithmetic accuracy. Notable deviations arise primarily in the extended-precision format and exception handling, reflecting the 8087's pre-standard design. Unlike IEEE 754's basic formats, the 80-bit extended precision does not support denormals, instead treating the smallest normalized values as the underflow threshold, which can lead to abrupt precision changes in extended computations. The 8087 generates quiet NaNs for invalid operations but lacks support for signaling NaNs, a feature introduced in IEEE 754 to allow explicit propagation of diagnostic information without immediate trapping. These differences were addressed in later Intel coprocessors like the 80387, which achieved fuller compliance. The 8087's profound influence on stemmed from 's active participation in the standardization process, led by John Palmer, who managed the coprocessor's floating-point design team starting in 1976. Palmer recruited consultant , whose insights integrated 8087 concepts—such as rules and underflow handling—into the IEEE committee's deliberations, ensuring the standard reflected practical hardware realities. Following 's ratification in 1985, enhanced in subsequent coprocessors like the 80387 and integrated FPUs in later x86 processors, promoting the standard's adoption across billions of systems.

Infinity and Exception Handling

The Intel 8087 represents signed infinities (+∞ and -∞) in its formats using the maximum exponent value of all ones combined with a zero mantissa in affine mode, allowing for signed representations that preserve the sign of the result in operations like overflow or division by zero when exceptions are masked. The 8087 supports two infinity arithmetic modes: affine closure, which treats infinities as signed values within an affine number line (-∞ ≤ x ≤ +∞), and projective closure, where infinity is unsigned and cannot be compared directly to finite numbers. The mode is selected by the infinity control (IC) bit in the control word, with projective as default. This provides flexibility, though IEEE 754 mandates affine mode. The 8087 supports Not-a-Number () values, represented by the maximum exponent (all ones) and a non-zero , akin to quiet NaNs in IEEE 754. Invalid operations generate such when masked, often an "indefinite" NaN with all-ones mantissa, or the maximum finite value in some cases. It lacks support for signaling NaNs. NaN values propagate through most arithmetic operations without triggering exceptions, akin to quiet NaNs. Certain operations on NaNs (e.g., of NaN) may generate an invalid operation exception if unmasked, with masked cases producing another NaN. The 8087 detects six types of arithmetic exceptions: invalid operation (e.g., indeterminate forms or operands), denormalized operand, zero divide, , underflow, and inexact result. These are maskable through bits 0–5 of the control word, which determine whether an exception is ignored (masked) or trapped (unmasked); masking enables on-chip default handling, such as substituting infinities for s or zero-divide results. Exceptions are reported via bits 0–5 of the status word, which set corresponding flags upon detection, allowing software to poll and clear them as needed. For unmasked exceptions, the 8087 halts execution, asserts the ERROR# signal low to notify the host CPU (typically via or polling), and keeps the high to indicate ongoing activity until serviced. Software handles trapping by polling the status word or using vectors to access the exception address and resume or correct the computation, ensuring predictable recovery without projective infinity complications in compliant modes.

Variants and Performance

Speed Grades

The Intel 8087 was produced in multiple speed grades to align with the clock frequencies of compatible 8086 family , ensuring optimal timing and performance in systems. The standard 8087 variant operated at a maximum clock speed of 5 MHz and was designed for with the 5 MHz 8086 . The 8087-2 provided an 8 MHz maximum clock speed, matching the 8 MHz 8086-2, and benefited from enhanced manufacturing yields achieved through process technology shrinks that allowed higher-speed operation without significant cost increases. The top-tier 8087-1 supported up to 10 MHz, the highest speed grade available, and was targeted at high-performance applications such as engineering workstations paired with 10 MHz 8086 systems. In addition to these NMOS-based variants, Intel introduced the 80C87 in 1985 as a low-power alternative, retaining the same instruction set and pin compatibility while reducing power consumption for battery-operated or applications; like the others, its speed grades focused on 5–10 MHz ranges to match host processors. Compatible second-source variants were also produced by manufacturers such as (Am8087), , and , offering s with similar performance characteristics. All 8087 variants shared identical pinouts, enabling across speed grades in compatible motherboards.

Benchmark Metrics

The Intel 8087 demonstrated peak throughput of approximately 0.05 MFLOPS for basic floating-point operations such as and when operating at 5 MHz, limited by the microcoded execution of algorithms like shift-and-add for . required around 190 cycles (38 µs at 5 MHz), while also took about 190 cycles under similar conditions, reflecting the coprocessor's reliance on iterative methods for these operations. Latency for key instructions varied based on operand types and stack interactions; for example, floating-point addition (FADD) typically consumed 50 cycles (10 µs at 5 MHz) for magnitude comparisons, though full operations could extend to 70-100 cycles depending on normalization and rounding. Transcendental functions like sine (FSIN) incurred higher latencies, up to 200 cycles (40 µs at 5 MHz), implemented via the algorithm for iterative convergence. Stack management added 3-8 cycles of overhead per due to register pushes and pops in the non-architected stack model. In benchmarks, the 8087 achieved around 0.1 MWIPS on the test at 5 MHz, emphasizing its efficiency for mixed numeric workloads over pure peak rates. Compared to software on the 8086, the 8087 provided up to 100-fold for floating-point tasks, dramatically reducing execution times for arithmetic-intensive code. Relative to its successor, the 80287 at the same clock speed, the 8087 was approximately 2-3 times slower in typical floating-point benchmarks due to less optimized and pipelining. Power efficiency stood at about 0.02 MFLOPS/W, drawing roughly 2.4 watts during operation at 5 MHz, which supported its integration into low-power systems of the era while prioritizing over raw speed. Cycle counts for these instructions are detailed further in the instruction set overview.

Successors and Legacy

Later Coprocessors

The 80287, introduced in 1982 as the numeric companion to the 80286 , maintained object-code compatibility with the 8087 while incorporating enhancements such as configurable control in its control word, allowing selection between single, double, and modes for improved numerical accuracy in computations. Fabricated using HMOS III technology on a 1.2-micron process, it operated at clock speeds of 5 to 12 MHz and featured an asynchronous that permitted independent clocking from the host CPU, reducing synchronization overhead. Although not fully compliant with the standard, the 80287 extended the 80286 architecture with support for floating-point, integer, and BCD operations, executing the same instruction set as its predecessor but with optimizations for the 16-bit protected-mode environment of the 80286. Succeeding the 80287, the 80387 debuted in 1987 to pair with the 80386 , marking the first to achieve full compliance with the standard for binary , including support for signaling and quiet NaNs to handle invalid operations and propagate errors appropriately. Built on a 1.5-micron CHMOS process, it delivered higher performance with clock speeds up to 20 MHz, enabling faster execution of transcendental functions and extended-precision calculations compared to earlier models. The 80387 remained object-code compatible with prior devices, allowing seamless upgrades, and introduced refined that aligned more closely with IEEE specifications while operating across the 80386's real, protected, and virtual-8086 modes. For embedded applications, Intel developed the 80187 coprocessor in 1989 to accompany the 80186 , focusing on lower power consumption suitable for compact systems. Its CMOS counterpart, the 80C187 introduced in , utilized 1.5-micron CHMOS III technology to further reduce power draw while preserving compatibility with the 80C186 CPU and supporting the full 8087 instruction set, including IEEE 754-compliant floating-point operations on 32-, 64-, and 80-bit formats. This variant extended the 80186/80188 architecture with eight 80-bit registers and built-in , but required specific wiring for interrupt-based synchronization in non-8087 configurations. The evolution toward on-chip integration culminated with the 80486DX in 1989, which embedded a full x87-compatible directly onto the die, eliminating the need for a separate and improving overall system performance through tighter coupling with the integer core. For cost-sensitive designs lacking this integration, offered the 80486SX variant paired with the external 80487 , introduced in 1991, which functioned as a pin-compatible socket occupant and internally replicated the 80486DX's FPU capabilities while maintaining with 8087-series instructions. This milestone shifted subsequent x86 designs away from discrete FPUs, paving the way for unified processor architectures.

Computing Impact

The Intel 8087 played a pivotal role in advancing personal computing by providing for floating-point operations, which were otherwise emulated slowly in software on early PCs like the IBM 5150. This capability was essential for applications requiring intensive numerical computations, such as spreadsheets, (CAD), and scientific software. For instance, version 2.0, released in 1985, incorporated 8087 support to accelerate complex calculations in business and , significantly improving performance over CPU . Similarly, early CAD programs like leveraged the for faster geometric computations and rendering tasks, enabling practical use of PCs in workflows. Without the 8087, these applications would have been impractically slow, limiting the adoption of personal computers for professional numerical work. Software ecosystems quickly adapted to the 8087, fostering broader accessibility to floating-point capabilities. compilers, including C, introduced options like /FP to generate code that utilized the when present, falling back to libraries for systems without it. For non-equipped machines, tools such as EMU87 provided software-based alternatives, allowing developers to write portable floating-point code via variables that intercepted instructions. This support extended to scientific applications, where the 8087 enabled efficient execution of math-intensive programs on systems, democratizing access to high-performance numerics previously confined to mainframes. The 8087's legacy endures in the x86 architecture, where its instruction set persisted as the standard for floating-point operations until the introduction of AVX in 2011, which shifted emphasis to vectorized extensions while retaining backward compatibility. This design influenced integrated FPUs in subsequent CPUs and the broader adoption of standards in both CPU and GPU floating-point units, providing a foundation for modern numerical . Reverse-engineering analyses of the 8087's die in 2018 revealed innovative circuitry, such as multi-level and substrate techniques, that trace directly to contemporary designs. In recognition of these contributions, the IEEE dedicated the 8087 as a on September 14, 2025, in , , for enabling high-performance floating-point arithmetic in microprocessors, fundamentally shaping the PC industry and scientific computation.

References

  1. [1]
    Milestones:Intel 8087 Math Coprocessor, 1980
    Sep 29, 2025 · Inside the Intel 8087. Rafi Nave and John F. Palmer. A numeric data processor, 1980 IEEE International Solid-State Circuits Conference. Digest ...
  2. [2]
    [PDF] Floating Point Case Study - Intel
    Intel 8087 Floating-Point Co-Processor Die. Page 5. 5. The double precision format requires two 4- byte storage locations in computer memory, at address and ...Missing: coprocessor | Show results with:coprocessor
  3. [3]
    The Intel®8087 numeric data processor - ACM Digital Library
    The Intel 8087 Numeric Data Processor, along with its design goals of meeting Intel's REALMATH standard, and providing increased capability, ease of use and ...
  4. [4]
  5. [5]
    [PDF] The INTEL® 8087 numeric data proc~sor - kib.kiev.ua
    High performance was another of the important design goals of the 8087. It is difficult to compare 8087 performance with other machines since it is not ...Missing: development | Show results with:development
  6. [6]
    Do the Math - Explore Intel's history
    The company began tackling this goal with the introduction of the 8087 math coprocessor, which was designed to augment the 8086 processor. An 8086 processor- ...
  7. [7]
    Milestone-Proposal:Intel 8087 Math Coprocessor
    Sep 21, 2023 · In 1980, Intel announced the 8087 and 8088 chips, which were used in the first IBM PCs. The 8088 was a modification of the 8086. The 8087 was ...Missing: price | Show results with:price
  8. [8]
    [PDF] Ken Shirri 's blog - Engineering and Technology History Wiki
    Sep 30, 2018 · Die of the Intel 8087 floating point unit chip, with main functional blocks labeled. An 8087 instruction required multiple steps, over 1000 ...
  9. [9]
    Die analysis of the 8087 math coprocessor's fast bit shifter
    May 31, 2020 · Since shifts are so essential to performance, the 8087 uses a "barrel shifter", which can shift a number by any number of bits in a single step.The Bit Shifter · The Byte Shifter · The Multiplexer / DecodersMissing: goals | Show results with:goals
  10. [10]
    Intel C8087 - CPU-World
    Intel C8087 specifications ; Manufacturing process, N-channel, depletion load, silicon gate technology (HMOS) ; Data width, 16 bit ; Electrical / Thermal ...
  11. [11]
    Inside the die of Intel's 8087 coprocessor chip, root of modern ...
    Aug 15, 2018 · Likewise, even though Intel's 8087 floating point unit chip was introduced 38 years ago, it still has a large impact today. It spawned the IEEE ...Missing: prototypes | Show results with:prototypes<|control11|><|separator|>
  12. [12]
    Extracting ROM constants from the 8087 math coprocessor's die
    May 18, 2020 · Sources provide inconsistent values for the number of transistors in the 8087: Intel claims 40,000 transistors while Wikipedia claims 45,000.
  13. [13]
    cpu-collection.de >> by Class >> FPU >> Intel
    The 8087 is implemented using NMOS. It comes in a 40-pin CERDIP and is available in 5 MHz, 8 MHz, and 10 MHz versions. Power consumption is rated at max. 2400 ...
  14. [14]
    [PDF] Intel 8087 Math CoProcessor
    The Intel 8087 is a math co-processor that adds math instructions to the 8086/8088, increasing speed for applications using math operations.Missing: 4.5 transistors
  15. [15]
    Intel C8087-1 - CPU-World
    C8087-1 is an OEM/tray floating-point unit. Frequency ? 10 MHz. Package, 40-pin side-brazed ceramic DIP. Socket, DIP40. Introduction date, 1980.
  16. [16]
    Technical Reference 6322507
    Section 1, "System Board," discusses the component layout, circuitry, and function of the system board. Section 2, "Coprocessor," describes the Intel 8087.
  17. [17]
    [PDF] The 8086 Family User's Manual (Numerics Supplement)
    The components in the iAPX 86, 88 product lines have been designed to operate together in diverse combinations within the framework of the family.
  18. [18]
    How did the 8086 interface with the 8087 FPU coprocessor?
    Feb 12, 2019 · The 8086 identified 8087 instructions by their first byte (11011xx). The 8087 read data/address bus, and used DMA. Control lines synchronized ...Were there 8086 coprocessors other than the 8087?What can an 8086 CPU do if an x87 floating-point coprocessor is ...More results from retrocomputing.stackexchange.comMissing: protocol | Show results with:protocol
  19. [19]
    Learn Something Old Every Day, Part VII: 8087 Intricacies
    Jan 23, 2023 · When IBM started selling PCs in late 1981, the Intel 8087 was a very new chip (it was released a couple of years after the 8086) and it was only ...
  20. [20]
    [PDF] iAPX 86/88, 186/188 User's Manual - Bitsavers.org
    This is the iAPX 86/88, 186/188 User's Manual, a hardware reference for the 8086/8088 CPU.
  21. [21]
    [PDF] 8087 Applications and Programming for the IBM PC and Other PCs
    ... available to the general market for several years before the first delivery of the 8087. In designing 16-bit personal computers, several manufacturers left.
  22. [22]
    [PDF] IEEE Standard 754 for Binary Floating-Point Arithmetic
    Oct 1, 1997 · NaNs must conform to mathematically consistent rules that were deduced, not invented arbitrarily, in 1977 during the design of the Intel 8087 ...
  23. [23]
    [PDF] 8087 suppoi~t library reference: manual - Bitsavers.org
    You can use the emulator to develop prototypes for systems that will have an SOS7; or you can use the emulator if you need the SOS7's floating point ...
  24. [24]
    Intel 8087 Math Coprocessor - Molecular Expressions
    Released in 1980, the Intel 8087 is the math coprocessor designed to accompany the 16-bit 8086 and 8088 microprocessors.Missing: development timeline prototypes 1979
  25. [25]
    Math Coprocessors - DOS Days
    It came in three versions: 8087-5 (5 MHz), 8087-2 (8 MHz) and 8087-1 (10 MHz) ... To reduce power consumption the 83D87 features advanced power saving features.
  26. [26]
    Intel 8087 floating-point unit family - CPU-World
    Military temperature range for parts with MC and MD prefixes. There were a few different speed grades of Intel 8087 co-processors ranging from 4 MHz to 10 MHz.Missing: announcement | Show results with:announcement
  27. [27]
    Processing power on the IBM personal computer - ACM Digital Library
    These programs utilize the Intel 8087 Numeric Data Processor (NDP), and when coded in FORTH, can approach the NDP maximum compute rate of 0.05 Mflops. II.
  28. [28]
    Speed of Intel 8087 co-processor in FLOPS ($100) - Google Answers
    Jul 11, 2005 · Need to know how fast the 8087 co-processor was for floating point 1)add, 2)multiple, 3)divide. I think they used 32-bit floating point ...Missing: MFLOPS | Show results with:MFLOPS
  29. [29]
    INMOS TN27 - Lies, damned lies and benchmarks - transputer.net
    1 Introduction. A benchmark is supposed to be a standard measure of performance that enables one computer to be compared with another.
  30. [30]
    Intel 8087 - Wikipedia
    The Intel 8087, announced in 1983, was the first floating-point coprocessor for the 8086 line of microprocessors. The purpose of the chip was to speed up ...Missing: prototypes 1979
  31. [31]
    [PDF] Intel 80287 Math CoProcessor - Ardent Tool of Capitalism
    RESET is required to be HIGH for more than 4 80287 CLK cycles. For proper initialization the HIGH-LOW transition must occur no sooner than 50 us after Vcc and ...
  32. [32]
    Intel 80287 family - CPU-World
    As a result the 80287 runs slightly slower than the 8087 at the same frequency. When the main processor executes the floating-point instructions it now checks ...Missing: performance comparison
  33. [33]
    80x87 Floating Point Units - cpu museum - Jimdo
    The x87 instruction set includes instructions for basic floating point operations such as addition, subtraction and comparison, but also for more complex ...Missing: 4.5 μm count
  34. [34]
    [PDF] MILITARY i387TM MATH COPROCESSOR - Ardent Tool of Capitalism
    The M8087/M80287 returns zero in the first case and raises the invalid-operation exception in the other cases. 15. The i387 NPX returns signed infinity/zero as ...
  35. [35]
    [PDF] 80C187 80-BIT MATH COPROCESSOR
    The 80C187 adds to the CPU additional data types, registers, instructions, and interrupts specifically de- signed to facilitate high-speed numerics ...
  36. [36]
    CPUs - DOS Days
    It was in fact a full 80486DX CPU internally, so it had an integrated FPU. It worked both on late 386DX and 486SX motherboards, but needed the motherboard to ...
  37. [37]
    Intel 80487 - CPU-World
    Intel 80487 has the same performance as 80486DX CPU. The main difference between them is the pinout. Production floating-point units. Intel A80487SX.
  38. [38]
    Intel 486DX Microprocessor - Molecular Expressions
    In 1989, the 32-bit 486DX heralded Intel's fourth generation of microprocessors with two radical innovations: the integration of the floating-point unit (FPU) ...Missing: 80487 | Show results with:80487<|separator|>
  39. [39]
    Lotus 1-2-3 2.x (DOS) - WinWorld
    Release 2.00 increases the maximum number of rows and adds support for add-ins, EMS memory, 8087 and 80287 math co-processors, enhanced macro commands, and ...Missing: Intel | Show results with:Intel
  40. [40]
    Software which can use 8087/80287 coprocessor?
    May 25, 2015 · Lotus 1-2-3 is a spreadsheet program from Lotus Software (now part of IBM). It was the IBM PC's first "killer application", was hugely ...programs that use the 8087 | Vintage Computer Federation ForumsLotus 1-2-3 Version 2.x Add-Ins and Developer Tools?More results from forum.vcfed.org
  41. [41]
    [PDF] About the Mcrosoft C Compiler
    The Microsoft C Compiler can use an 8087 or 80287 coprocessor if one is present and can emulate 8087 operation through the use of an emulator library if not ...
  42. [42]
    Microsoft C - Long Entry - ITLnet
    Compiler and Linker Switches The behavior of the compiler MSC and the linker MS ... FP emulator. /FPc87 Generate calls and use the 8087 library. /FPi87 ...
  43. [43]
    Two bits per transistor: high-density ROM in Intel's 8087 floating ...
    The die of the 8087 is complex, with 40,000 transistors.2 Internally, the 8087 uses 80-bit floating point numbers with a 64-bit fraction (also called ...