Open source
  • Bandwidth benchmark
  • TouchWidgets UI lib
  • Diviner big number math
  • Documentation
  • x86 instructions ref
  • GIT quick ref
  • GPG quick ref
  • Avoid Ubuntu
  • Android malware risks
  • iOS malware risks
  • OS/X security tips
  • Who blocks Tor
  • Software engineering
  • BASH aliases
  • I.B. pro/con
  • Nutrition
  • Other apps
  • Blog
  • Contact
    1 at zsmith dot co

    The Intel 8086 / 8088 / 80186 / 80286 / 80386 / 80486 Instruction Set

    This is my page describing 8087 floating point instructions. The origin of the text file is unknown to me. But I have taken the time to make this pretty version of this file and thus these HTML modifications are © 2009 by , all rights reserved. Email: veritasNOSPAM@comcast.net.

    This information is provided free of charge in the hope that it will be useful, but without any warranty. It is provided AS-IS, without even the implied warranty of fitness for a particular purpose.

    Preliminary Information

    As you can see this file is simpler than the other opcode guides, and includes mainly just instruction timings.

    Registers

     reg   = floating point register, st(0), st(1) ... st(7)
     mem   = memory address
     mem32 = memory address of 32-bit floating pointn value
     mem64 = memory address of 64-bit floating pointn value
     mem80 = memory address of 80-bit floating pointn value
    

    FPU instruction timings

     FX = pairs with FXCH
     NP = no pairing
     Timings with a hyphen indicate a range of possible timings
     Timings with a slash (unless otherwise noted) are latency and throughput.
     Latency is the time between instructions dependent on the result.
     Throughput is the pipeline throughput between non conflicting instructions.
     EA = cycles to calculate the Effective Address
    

    FPU instruction sizing

    • All FPU instructions that do not access memory are two bytes in length. (Except FWAIT which is one byte)
    • FPU instructions that access memory are four bytes for 16-bit addressing and six bytes for 32-bit addressing.

    The Instructions

    F2XM1 - Compute 2x-1
     
                  8087         287        387      486     Pentium
                310-630      310-630    211-476  140-279   13-57   NP
    

    FABS - Absolute value
     
                  8087         287        387      486     Pentium
                 10-17        10-17       22        3       1      FX
    

    FADD - Floating point add
    FADDP - Floating point add and pop
     
        variations/
        operand       8087     287        387      486     Pentium
        fadd     70-100       70-100     23-34     8-20    3/1     FX
        fadd  mem32  90-120+EA    90-120     24-32     8-20    3/1     FX
        fadd  mem64  95-125+EA    95-125     29-37     8-20    3/1     FX
        faddp    75-105       75-105     23-31     8-20    3/1     FX
    

    FBLD - Load BCD
     
         operand      8087     287        387      486     Pentium
         mem       (290-310)+EA  290-310    266-275   70-103   48-58   NP
    

    FBSTP - Store BCD and pop
     
                  8087         287        387      486     Pentium
               (520-540)+EA  520-540    512-534  172-176   148-154 NP
    

    FCHS - Change sign
     
                  8087         287        387      486     Pentium
                 10-17        10-17      24-25      6       1      FX
    

    FCLEX - Clear exceptions
    FNCLEX - Clear exceptions, no wait
     
        variations    8087     287        387      486     Pentium
        fclex     2-8          2-8        11        7       9      NP
        fnclex    2-8          2-8        11        7       9      NP
    
                The wait version may take additional cycles
    

    FCOM - Floating point compare
    FCOMP - Floating point compare and pop
    FCOMPP - Floating point compare and pop twice
     
        variations/
        operand      8087     287        387      486     Pentium
        fcom reg     40-50    40-50       24        4      4/1     FX
        fcom mem32  (60-70)+EA    60-70       26    4      4/1     FX
        fcom mem64  (65-75)+EA    65-75       31    4      4/1     FX
        fcomp    42-52        42-52       26        4      4/1     FX
        fcompp       45-55    45-55       26        5      4/1     FX
    

    FCOS - Floating point cosine (387+)
     
                  8087         287        387      486     Pentium
                   -            -       123-772  257-354   18-124  NP
                Additional cycles required if operand > pi/4 (~3.141/4 = ~.785)
    

    FDECSTP - Decrement floating point stack pointer
     
                  8087         287        387      486     Pentium
                  6-12         6-12       22        3       1      NP
    

    FDISI - Disable interrupts (8087 only, others do fnop)
    FNDISI - Disable interrupts, no wait (8087 only, others do fnop)
     
        variations    8087     287        387      486     Pentium
        fdisi     2-8           2          2        3       1      NP
        fndisi    2-8           2          2        3       1      NP
    
                The wait version may take additional cycles
    

    FDIV - Floating divide
    FDIVP - Floating divide and pop
     
        variations/
        operand       8087     287        387      46     Pentiu/m
        fdiv reg    193-203      193-203     88-91     73      39      FX
        fdiv mem32 (215-225)+EA  215-225      89       73      39      FX
        fdiv mem64 (220-230)+EA  220-230      94       73      39      FX
        fdivp       197-207      197-207      91       73      39      FX
    

    FDIVR - Floating divide reversed
    FDIVRP - Floating divide reversed and pop
     
       variations/
       operand    8087         287        387      486     Pentium
       fdivr reg    194-204      194-204     88-91     73      39      FX
       fdivr mem32 (216-226)+EA  216-226      89       73      39      FX
       fdivr mem64 (221-231)+EA  221-231      94       73      39      FX
       fdivrp       198-208      198-208      91       73      39      FX
    

    FENI - Enable interrupts (8087 only, others do fnop)
    FNENI - Enable interrupts, nowait (8087 only, others do fnop)
     
        variations    8087     287        387      486     Pentium
        feni      2-8           2          2        3       1      NP
        fneni     2-8           2          2        3       1      NP
    

    FFREE - Free register
     
                  8087         287        387      486     Pentium
                  9-16         9-16       18        3       1      NP
    

    FIADD - Integer add
     
          operand     8087     287        387      486     Pentium
          mem16    (102-137)+EA  102-137     71-85    20-35    7/4     NP
          mem32    (108-143)+EA  108-143     57-72    19-32    7/4     NP
    

    FICOM - Integer compare
    FICOMP - Integer compare and pop
     
       variations/
       operand    8087         287        387      486     Pentium
       ficom  mem16  (72-86)+EA   72-86      71-75    16-20    8/4     NP
       ficom  mem32  (78-91)+EA   78-91      56-63    15-17    8/4     NP
       ficomp mem16  (74-88)+EA   74-88      71-75    16-20    8/4     NP
       ficomp mem32  (80-93)+EA   80-93      56-63    15-17    8/4     NP
    

    FIDIV - Integer divide
    FIDIVR - Integer divide reversed
     
       variations/
       operand    8087         287        387      486     Pentium
       fidiv  mem16  (224-238)+EA  224-238  136-140   85-89    42      NP
       fidiv  mem32  (230-243)+EA  230-243  120-127   84-86    42      NP
       fidivr mem16  (225-239)+EA  225-239  135-141   85-89    42      NP
       fidivr mem32  (231-245)+EA  231-245  121-128   84-86    42      NP
    

    FILD - Load integer
     
         operand      8087     287        387      486     Pentium
         mem16      (46-54)+EA    46-54      61-65    13-16    3/1     NP
         mem32      (52-60)+EA    52-60      45-52     9-12    3/1     NP
         mem64      (60-68)+EA    60-68      56-67    10-18    3/1     NP
    

    FIMUL - Integer multiply
     
          operand     8087     287        387      486     Pentium
          mem16    (124-138)+EA   124-138    76-87    23-27    7/4     NP
          mem32    (130-144)+EA   130-144    61-82    22-24    7/4     NP
    

    FINCSTP - Increment floating point stack pointer
     
                  8087         287        387      486     Pentium
                  6-12         6-12       21        3       1      NP
    

    FINIT - Initialize floating point processor
    FNINIT - Initialize floating point processor, no wait
     
        variations    8087     287        387      486     Pentium
        finit     2-8          2-8        33       17      16      NP
        fninit    2-8          2-8        33       17      12      NP
    
                The wait version may take additional cycles
    

    FIST - Store integer
    FISTP - Store integer and pop
     
        variations/
        operand       8087     287        387      486     Pentium
        fist  mem16  (80-90)+EA   80-90      82-95    29-34     6      NP
        fist  mem32  (82-92)+EA   82-92      79-93    28-34     6      NP
        fistp mem16  (82-92)+EA   82-92      82-95    29-34     6      NP
        fistp mem32  (84-94)+EA   84-94      79-93    28-34     6      NP
        fistp mem64  (94-105)+EA  94-105     80-97    28-34     6      NP
    

    FISUB - Integer subtract
    FISUBR - Integer subtract reversed
     
        variations/
        operand       8087     287        387      486     Pentium
        fisub  mem16 (102-137)+EA 102-137     71-85    20-35    7/4     NP
        fisubr mem32 (108-143)+EA 108-143     57-82    19-32    7/4     NP
    

    FLD - Floating point load
     
        operand       8087     287        387      486     Pentium
        reg      17-22        17-22       14        4       1      FX
        mem32       (38-56)+EA    38-56       20    3       1      FX
        mem64       (40-60)+EA    40-60       25    3       1      FX
        mem80       (53-65)+EA    53-65       44    6       3      NP
    

    FLDZ - Load constant onto stack, 0.0
    FLD1 - Load constant onto stack, 1.0
    FLDL2E - Load constant onto stack, logarithm base 2 (e)
    FLDL2T - Load constant onto stack, logarithm base 2 (10)
    FLDLG2 - Load constant onto stack, logarithm base 10 (2)
    FLDLN2 - Load constant onto stack, natural logarithm (2)
    FLDPI - Load constant onto stack, pi (3.14159...)
     
             Load floating point constants
    
        variations    8087     287        387      486     Pentium
        fldz     11-17        11-17       20        4       2      NP
        fld1     15-21        15-21       24        4       2      NP
        fldl2e       15-21    15-21       40        8      5/3     NP
        fldl2t       16-22    16-22       40        8      5/3     NP
        fldlg2       18-24    18-24       41        8      5/3     NP
        fldln2       17-23    17-23       41        8      5/3     NP
        fldpi    16-22        16-22       40        8      5/3     NP
    

    FLDCW - Load control word
     
          operand     8087     287        387      486     Pentium
          mem16      (7-14)+EA     7-14       19    4       7      NP
    

    FLDENV - Load environment state
     
        operand   8087         287        387      486     Pentium
        mem     (35-45)+EA    35-45       71      44/34    37/32-33 NP
    
                Cycles for real mode/protected mode
    

    FMUL - Floating point multiply
    FMULP - Floating point multiply and pop
     
        variations/
        operand       8087     287        387      486     Pentium
        fmul reg s    90-105       90-105    29-52     16      3/1     FX
        fmul reg     130-145      130-145    46-57     16      3/1     FX
        fmul mem32  (110-125)+EA  110-125    27-35     11      3/1     FX
        fmul mem64  (154-168)+EA  154-168    32-57     14      3/1     FX
        fmulp reg s   94-108       94-108    29-52     16      3/1     FX
        fmulp reg    134-148      134-148    29-57     16      3/1     FX
    
            s = register with 40 trailing zeros in fraction
    

    FNOP - no operation
     
                  8087         287        387      486     Pentium
                 10-16        10-16       12        3       1      NP
    

    FPATAN - Partial arctangent
     
                  8087         287        387      486     Pentium
                250-800      250-800    314-487  218-303   17-173
    

    FPREM - Partial remainder
    FPREM1 - Partial remainder (IEEE compatible, 387+)
     
        variations    8087     287        387      486     Pentium
        fprem    15-190       15-190     74-155   70-138   16-64   NP
        fprem1     -            -        95-185   72-167   20-70   NP
    

    FPTAN - Partial tangent
     
                  8087         287        387      486     Pentium
                 30-540       30-540    191-497  200-273   17-173  NP
                 Additional cycles required if operand > pi/4 (~3.141/4 = ~.785) 
    

    FRNDINT - Round to integer
     
                  8087         287        387      486     Pentium
                 16-50        16-50      66-80    21-30    9-20    NP
    

    FRSTOR - Restore saved state
     
        variations/
        operand       8087     287        387      486     Pentium
        frstor  mem  (197-207)+EA 197-207     308    131/120   75-95/70 NP
        frstorw mem    -        -         308    131/120   75-95/70 NP
        frstord mem    -        -         308    131/120   75-95/70 NP
    
                  Cycles for real mode/protected mode
    

    FSAVE - Save FPU state
    FSAVEW - Save FPU state, 16-bit format (387+)
    FSAVED - Save FPU state, 32-bit format (387+)
    FNSAVE - Save FPU state, no wait
    FNSAVEW - Save FPU state, no wait, 16-bit format (387+)
    FNSAVED - Save FPU state, no wait, 32-bit format (387+)
     
                        Save FPU State
    
        variations    8087     287        387      486     Pentium
        fsave      (197-207)+EA  197-207    375-376  154/143  127-151/124 NP
        fsavew                          375-376  154/143  127-151/124 NP
        fsaved                          375-376  154/143  127-151/124 NP
        fnsave     (197-207)+EA  197-207    375-376  154/143  127-151/124 NP
        fnsavew                         375-376  154/143  127-151/124 NP
        fnsaved                         375-376  154/143  127-151/124 NP
    
                Cycles for real mode/protected mode
                The wait version may take additional cycles
    

    FSCALE - Scale by factor of 2
     
                  8087         287        387      486     Pentium
                 32-38        32-38      67-86    30-32    20-31   NP
    

    FSETPM - Set protected mode (287 only, 387+ = fnop)
     
                  8087         287        387      486     Pentium
                   -           2-8        12        3       1      NP
    

    FSIN - Sine (387+)
    FSINCOS - Sine and cosine (387+)
     
        variations    8087     287        387      486     Pentium
        fsin       -            -       122-771  257-354   16-126  NP
        fsincos    -            -       194-809  292-365   17-137  NP
       Additional cycles required if operand > pi/4 (~3.141/4 = ~.785) 
    

    FSQRT - Square root
     
                  8087         287        387      486     Pentium
                180-186      180-186    122-129   83-87    70      NP
    

    FST - Floating point store
    FSTP - Floating point store and pop
     
        variations/
        operand       8087     287        387      486     Pentium
        fst  reg     15-22    15-22       11        3       1      NP
        fst  mem32  (84-90)+EA    84-90       44    7       2      NP
        fst  mem64  (96-104)+EA   96-104      45    8       2      NP
        fstp reg     17-24    17-24       12        3       1      NP
        fstp mem32  (86-92)+EA    86-92       44    7       2      NP
        fstp mem64  (98-106)+EA   98-106      45    8       2      NP
        fstp mem80  (52-58)+EA    52-58       53    6       3      NP
    

    FSTCW - Store control word
    FNSTCW - Store control word, no wait
     
        variations/
        operand       8087     287        387      486     Pentium
        fstcw  mem   12-18    12-18       15        3       2      NP
        fnstcw mem   12-18    12-18       15        3       2      NP
    
                The wait version may take additional cycles
    

    FSTENV - Store FPU environment
    FSTENVW - Store FPU environment, 16-bit format (387+)
    FSTENVD - Store FPU environment, 32-bit format (387+)
    FNSTENV - Store FPU environment, no wait
    FNSTENVW - Store FPU environment, no wait, 16-bit format (387+)
    FNSTENVD - Store FPU environment, no wait, 32-bit format (387+)
     
                        Store FPU environment
    
        variations/
        operand       8087     287        387      486     Pentium
        fstenv   mem  (40-50)+EA    40-50     103-104   67/56    48-50   NP
        fstenvw  mem                      103-104   67/56    48-50   NP
        fstenvd  mem                      103-104   67/56    48-50   NP
        fnstenv  mem  (40-50)+EA    40-50     103-104   67/56    48-50   NP
        fnstenvw mem                      103-104   67/56    48-50   NP
        fnstenvd mem                      103-104   67/56    48-50   NP
    
                Cycles for real mode/protected mode
                The wait version may take additional cycles
    

    FSTSW - Store status word
    FNSTSW - Store status word, no wait
     
        variations/
        operand       8087     287        387      486     Pentium
        fstsw  mem   12-18    12-18       15        3       2      NP
        fstsw  ax      -      10-16       13        3       2      NP
        fnstsw mem   12-18    12-18       15        3       2      NP
        fnstsw ax      -      10-16       13        3       2      NP
    
                The wait version may take additional cycles
    

    FSUB - Floating point subtract
    FSUBP - Floating point subtract and pop
     
        variations/
        operand       8087     287        387      486     Pentium
        fsub  reg     70-100      70-100     26-37     8-20    3/1     FX
        fsub  mem32  (90-120)+EA  90-120     24-32     8-20    3/1     FX
        fsub  mem64  (95-125)+EA  95-125     28-36     8-20    3/1     FX
        fsubp reg     75-105      75-105     26-34     8-20    3/1     FX
    

    FSUBR - Floating point reverse subtract
    FSUBRP - Floating point reverse subtract and pop
     
        variations/
        operand       8087     287        387      486     Pentium
        fsubr  reg    70-100      70-100     26-37     8-20    3/1     FX
        fsubr  mem32 (90-120)+EA  90-120     24-32     8-20    3/1     FX
        fsubr  mem64 (95-125)+EA  95-125     28-36     8-20    3/1     FX
        fsubrp reg    75-105      75-105     26-34     8-20    3/1     FX
    

    FTST - Floating point test for zero
     
                  8087         287        387      486     Pentium
                 38-48        38-48       28        4      4/1     FX
    

    FUCOM - Unordered floating point compare (387+)
    FUCOMP - Unordered floating point compare and pop (387+)
    FUCOMPP - Unordered floating point compare and pop twice (387+)
     
        variations    8087     287        387      486     Pentium
        fucom      -            -         24        4      4/1     FX
        fucomp     -            -         26        4      4/1     FX
        fucompp    -            -         26        5      4/1     FX
    

    FWAIT - Wait while FPU is executing
     
                  8087         287        387      486     Pentium
                   4            3          6       1-3     1-3     NP
    

    FXAM - Examine condition flags
     
                  8087         287        387      486     Pentium
                 12-23        12-23      30-38      8      21      NP
    

    FXCH - Exchange floating point registers
     
                  8087         287        387      486     Pentium
                 10-15        10-15       18        4      0-1     *
    
        * FCXH is pairable in the V pipe with all FX pairable instructions
    

    FXTRACT - Extract exponent and significand
     
                  8087         287        387      486     Pentium
                 27-55        27-55      70-76    16-20    13      NP
    

    FYL2X - Compute Y * log2(x)
    FYL2XP1 - Compute Y * log2(x+1)
     
        variations    8087     287        387      486     Pentium
        fyl2x       900-1100     900-1100   120-538  196-329   22-111  NP
        fyl2xp1     700-1000     700-1000   257-547  171-326   22-103  NP
    



    © Zack Smith