Introduction to Floating Point Programming By Bill T. This article will give a general overview of the Intel Architcture Floating Point Unit (FPU). It will cover the FPU's architecture and instruction set. FPU Data Formats ----------------------------------------------------------------------------- Length Precision Range (Approx) Single Real 32 bit 24 bit 1.18e-38 to 3.40e38 Double Real 64 bit 53 bit 2.23e-308 to 1.79e308 Extended Real 80 bit 64 bit 3.37e-4932 to 1.18e4932 Word Integer 16 bit 15 bit -32768 to 32768 Short Integer 32 bit 31 bit -2.14e9 to 2.14e9 Long Integer 64 bit 63 bit -9.22e18 to 9.22e18 Packed BCD 80 bit 18 (-1e18 + 1) to (1e18 - 1) FPU Data Registers ----------------------------------------------------------------------------- Data Registers _ _________ _______________________________________ R7 |_|_________|_______________________________________| R6 |_|_________|_______________________________________| R5 |_|_________|_______________________________________| R4 |_|_________|_______________________________________| R3 |_|_________|_______________________________________| R2 |_|_________|_______________________________________| R1 |_|_________|_______________________________________| R0 |_|_________|_______________________________________| 80 79 63 0 Sign Exponent Significand ______________________________ FPU Instruction Pointer |______________________________| FPU Operand Pointer |______________________________| 47 0 _______________ Control Register |_______________| Status Register |_______________| Tag Register |_______________| Opcode |___________| 15 10 0 FPU Data Register Stack: ___________________________ 7 |___________________________| Stack 6 |___________________________| ST(2) Growth 5 |___________________________| ST(1) | 4 |___________________________| ST(0) TOP=100b | 3 |___________________________| \|/ 2 |___________________________| ` 1 |___________________________| 0 |___________________________| Status Register: ___________________________________________________________ |___|___|___________|___|___|___|___|___|___|___|___|___|___| B C3 TOP C2 C1 C0 ES SF PE UE OE ZE IE B - FPU Busy C0-C3 - Condition Codes TOP - Top of Stack Pointer ES - Error Summary Status SF - Stack Fault PE - Precision Exception UE - Underflow Exception OE - Overflow Exception ZE - Zero Divide Exception DE - Denormailzed Operand Exception IE - Invalid Operation Exception FPU Instruction Set ----------------------------------------------------------------------------- Data Transfer Instructions: FLD src = [st(), mem32, mem64] Load Real Pushes real operand (from memory or FPU data register) onto the top of the FPU stack. If the operand is a single or double real number, it is automatically converted to extended real formt. FST dest = [mem32, mem64, mem80, st()] Store Real Copies the value on top of the FPU stack to the destination operand. FSTP dest = [mem32, mem64, mem80, st()] Store Real and Pop Copies the top of the FPU stack to the destination operand and pops the value off of the stack. FXCH [st()] Exchange Register Contents Exchanges the top of the FPU stack with another FPU register. FILD src = [mem32, mem64, mem80] Load Integer Converts integer operand to extended real format, the pushes it onto the top of the FPU stack. FIST dest = [mem32, mem64, mem80] Store Integer Converts value at the top of the FPU stack to an integer value, and stores it in the destination. FISTP dest = [mem32, mem64, mem80] Store Integer and Pop Converts the top of the FPU stack to an integer value, stores it in the destination, and pops the value off the stack. FBLD src = [bcd80] Load Packed Decimal Converts BCD source to extended real format and pushes it to the top of the FPU stack. FBSTP dest = [mem80] Store Packed Decimal and Pop Converts top of FPU stack to BCD format, stores it in destination, and pops value off of the stack. Constant Load Instructions: These instructions push commonly used constants on to the top of the FPU stack (ST(0)). These constants have extended real precision and are accurate to approximately 19 digits. FLDZ Load +0.0 FLD1 Load +1.0 FLDPI Load PI FLDL2T Load log(2) 10 [log(base 2) of 10] FLDL2E Load log(2) e FLDLG2 Load log(10) 2 FLDLN2 Load log(e) 2 Arithmetic Instructions: The following instructions operate on the following types of operands: - 2 FPU register values - A Register value and a real or integer value in memory FADD(P) Add Real [FADDP = Add real and pop] FIADD Add Integer FSUB(P) Subtract Real FISUB Subtract Integer from Real FSUBR(P) Reverse Subtract Real FISUBR Reverse Subtract Real from Integer FMUL(P) Multiply Real FIMUL Multiply Integer by Real FDIV(P) Divide Real FIDIV Divide Integer by Real FDIVR(P) Reverse Divide Real FIDIVR Reverse Divide Integer by Real Comparison Instructions: FCOM Compare real and set FPU condition code flags FUCOM Unordered compare real and set FPU condition code flags FICOM Compare Integer FCOMI Compare real and set EFLAGS status flags FUCOMI Unordered compare real and set EFLAGS status flags FTST Test (Compare real with 0.0) FXAM Examine Trigonometric Instructions: FSIN Sine FCOS Cosine FSINCOS Sine and Cosine FPTAN Tangent FPATAN ArcTangent These instructions operate on the top one or two FPU Stack registers. They return their results to the stack. The operands must be given in radians. Logarithm, Exponential, and Scale: FYL2X Compute log (y * log[2] x) FYL2XPI Compute log epsilon (y * log[2] x) F2XMI Compute exponential (2^x - 1) FSCALE Scale - multiplies source operand by power of 2 FPU Control Instructions: FINIT/FNINIT Initialize FPU FLDCW Load FPU control word FSTCW/FNSTCW Store FPU control word FSTSW/FNSTSW Store FPU status word FCLEX/FNCLEX Clear FPU exception flags FLDENV Load FPU environment FSTENV/FNSTENV Store FPU environment FRSTOR Restore FPU state FSAVE/FNSAVE Save FPU state FINCSTP Increment FPU register stack pointer FDECSTP Decrement FPU register stack pointer FFREE Free FPU register FNOP No operation WAIT/FWAIT Check for and handle pending unmasked FPU exceptions Conclusion ----------------------------------------------------------------------------- This is a very basic overview of the Floating Point Processor. Future articles will describe the actual use of the FPU and its instruction set. ----------------------------------------------------------------------------- Copyright (C) 1999 Bill T. (billasm@usa.net)