scene.org File Archive

File download

<root>­/­mirrors­/­amigascne­/­Groups­/­Sourcecodes/mc68881.txt

File size:
24 398 bytes (23.83K)
File date:
2010-08-22 23:05:27
Download count:
all-time: 457

Preview

FPU assembler programming

By Erik H. Bakke

Written  13/10-93


--- I ------------------------- INTRODUCTION ---------------------- I ---

1.1 Introduction

Many people have asked me to explain how to program the 68881/68882/040
floating point coprocessors, and here it is, a guide in the "magic art"
I have tried to keep this text as system neutral as possible, but it
may, as the other articles in this series be influenced by the fact
that I usually program at Amiga computers.
If you need more information about the topics discussed herein, please
contact the author.

1.2 Index

  Chapter I--------Introduction--------------------
  1.1  Introduction
  1.2  Index
  Chapter II-----The Coprocessor interface---------
  2.1  The Interface mechanics
  2.2  The Floating Point Coprocessor
  Chapter III----Floating Point Programming--------
  3.1  Floating Point Data Formats
  3.2  Floating Point Constant ROM
  3.3  Floating Point Instructions
       1...Data transfer instructions
       2...Dyadic operations
       3...Monadic operations
       4...Program control instructions
       5...System control instructions
  Chapter IV-------The 68040 FPU-------------------
  4.1  Differences
  4.2  Instruction set
  Chapter V------------Sources---------------------
  5.1  Sourcecodes



--- II -------------------THE COPROCESSOR INTERFACE -------------- II ---

2.1  The Interface Mechanics

A coprocessor may be thought of as an extension to the main CPU,
extending its register set and instructions.
Different coprocessors that can be interfaced to the 68020+ CPU's
are the 68881/2 FPU and 68851 MMU.
Coprocessor instructions are placed inline with ordinary CPU codes,
all recognized by being LINE-F instructions.  (Having the op-code
format of $Fxxx)  In assembler, they are generally noted as cpXXXX
instructions.

The coprocessors require a communication protocol with the CPU for
various reasons:

-----------------------------------------------------------
1.  The CPU must recognize that a coprocessor is to receive
    the LINE-F op-code, and establish contact with that
    coprocessor.

2.  The coprocessor may need to signal it's internal status
    to the CPU.

3.  The coprocessor may need to read/write data to/from
    system memory or CPU registers.

4.  The coprocessor may have to inform the CPU of error
    conditions, such as an illegal instruction or divide by
    zero.  The CPU will have to process the corresponding
    exceptions.
-----------------------------------------------------------

This protocol is called the MC68000 coprocessor interface.  Knowledge
of this interface is not required of a programmer who wishes to
utilize a coprocessor, therefore I will not go into specific detail
about the interface, but briefly sum up the main mechanisms.

  The coprocessor instructions are F-line instructions that have
  all bits in the upper nibble set to generate $Fxxx op-codes.
  Up to 8 coprocessors may reside on the bus (The Amiga coprocessors
  are NOT part of this system, and should not be counted in).
  Each of these co-processors have their own 3-bit address.
  Two such addresses are reserved by Motorola:
                         %000   MC68851 PMMU
                         %001   MC68881/2 FPU
  
  It is perfectly possible to install 6 FPU's in the same
  system.
  
  The general format of a coprocessor op-code is shown below:
  
  15    1211  9 8   6 5         0
  ================================
  1 1 1 1 Cp-ID Type  Instruction dependent
  
  Followed by a number of coprocessor defined extension words and
  effective address extension words.
  
  If the instruction is not accepted by the coprocessor it is
  addressed to (if the CP is not present) the CPU will take
  an F-line exception.

2.2 The Floating Point Coprocessor

  The Motorola floating point coprocessor has the number 68881 or
  68882.  The 68882 is considerably faster than the 881, due
  to optimized internal design.  In addition, the 68040 CPU has an
  internal FPU has is even faster than the 882.  There are other
  differences between the 881/2 and the 040, but I'll return to
  those later.  The 68881 and 68882 are pin compatible, and available
  in speeds up to 20Mhz and 50MHz respectively
  The FPU implements IEEE compatible floating point formats, and
  implements instructions to perform arithmetics on these formats,
  as well as several trancendental functions, such as SIN(x),E^x
  and so on.  In addition the FPU has an on-chip constant ROM where
  different mathematical constants are stored.

2.2.1  The floating point registers

  The FPU has 8 floating point registers, each 80 bits wide.
  These are named FP0-FP7, just as D0-D7 in the CPU.  In addition
  the FPU have 3 32-bit registers:
  
  Control Register       FPCR
  
  31.................15..........7..........0
                       Exeception    Mode
                        Enable      Control
  
  Status Register       FPSR
  
  31.......23........15..........7..........0
  Condition  Quotient   Accrued   Exception
    Codes              Exception   Status
  
  Instruction Address Register    FPIAR

  31.......23........15..........7..........0

2.2.1.1  Floating point data registers

  The data registers always contain an 80 bit wide extended precision
  floating point number.  Before any floating point data is used in
  calculation, it is converted to extended-precision.
  For example, the instruction   FMOVE.L #10,FP3  converts the
  longword #10 to extended precision before transferring it to register
  FP3.  All calculations with the FPU uses the internal registers
  as either source or destination, or both.
  
2.2.1.2  Floating Point Status Register

  This register is split in two bytes, the exception enable byte, and
  the mode control byte.

2.2.1.2.1  Exception Enable byte

  This register contains a bit for each of the possible eight
  exceptions that may be generated by the FPU.  Setting or clearing
  one of these bits will enable/disable the corresponding exception.

  The exception bytes are organized this way:
  
  Bit   Name    Meaning
  ========================
  7     BSUN    Branch/Set on UNordered
  6     SNAN    Signalling Not A Number
  5     OPERR   OPerand ERRor
  4     OVFL    OVerFLow
  3     UNFL    UNderFLow
  2     DZ      Divide by Zero
  1     INEX2   INEXact operation
  0     INEX1   INEXact decimal input

2.2.1.2.2  Mode control byte

  This register controls the rounding modes and rounding precisions.
  A result may be rounded or chopped to either double, single or
  extended precision.  For most usage of the FPU, however, this
  register could be set to all zeroes, which will round the result
  to the nearest extended precision value.
  Mode control byte:
  
  Bit   Name    Meaning
  ========================
  7     PREC1   Precision bit 1
  6     PREC0   Precision bit 0
  5     RND1    Rounding bit 1
  4     RND0    Rounding bit 0
  3     ----    -----
  2     ----    -----
  1     ----    -----
  0     ----    -----

  PREC=00  Round to extended precision
  PREC=01  Round to single precision
  PREC=10  Round to double precision
  
  RND=00   Round toward nearest possible number
  RND=01   Round toward zero
  RND=10   Round toward the smallest number
  RND=11   Round toward the highest number
  
2.2.1.3  Floating point Status Register

  This register is just what you may think it is, the parallell to
  the CPU CCR register, and reflects the status of the last
  floating point computation.  The quotient byte is used with
  floating point remaindering operations.  The exception status
  byte tells what exceptions that occured during the last operation.
  The accrued exception byte contains a bitmask of the exceptions
  that have occurred since the last time this field was cleared.

  Status bits:
  
  Bit   Name    Meaning
  =============================
  7     ----    -----
  6     ----    -----
  5     ----    -----
  4     ----    -----
  3     N       Negative
  2     Z       Zero
  1     I       Infinity
  0     NAN     Not A Number

2.2.1.4  Floating point Instruction Address Register

  This register contains the address of the instruction currently
  executing.  The FPU can execute instructions in parallell with
  the CPU, so that time-consuming instrcutions, such as division
  and multiplication don't tie up the CPU unnecessary.  This means
  that if an exception occurs in the floating point operation,
  the address that are pushed on to the stack is not necessarily
  the address of the instruction that caused the exception.
  The exception handler would have to read this register to find
  the address of the offending instruction.



--- III ----------------FLOATING POINT PROGRAMMING ------------- III ---


3.1  Floating Point Data Formats

  The FPU can handle 3 integer formats, and 2 IEEE compatible formats.
  In addition, it has an extended-precision format and can handle a
  Packed-Decimal Real format.

3.1.1  Integer Formats

  The 3 integer formats that are supported by the FPU are compatible
  with the formats used by the 68000 CPU's.  They are Byte (8 bits),
  Word (16 bits), and Longword (32 bits).

3.1.2  Real Formats

  The FPU supports 4 real formats, the Single precision (32 bits),
  Double precision (64 bits), Extended precision (80 bits), and
  Packed-decimal string (80 bits)

3.1.2.1 Single Precision

  The single precision format is indicated with the extension .S
  It consists of a 23-bit fraction, an 8-bit exponent, and 1 bit
  indicating the sign of the fraction.  The Single Precision format
  is defined by IEEE and uses excess-127 notation for the exponent.
  A hidden 1 is assumed as the most significant digit of the fraction.
  The format is defined as follows:
  
        30       22                    0
      S EEEEEEEE FFFFFFFFFFFFFFFFFFFFFFF
      
      S=Sign of fraction
      E=Exponent
      F=Fraction
  
  The single precision format takes 4 bytes when written to memory.

3.1.2.2 Double Precision

  The double precision format is indicated with the extension .D
  It consists of a 52-bit fraction, an 11-bit exponent, and 1 bit
  indicating the sign of the fraction.  As the single precision,
  this format is also defined by the IEEE, and uses excess-1023
  notation for the exponent.  A hidden 1 is assumed as the most
  significant digit of the fraction.  The format is defined as
  follows:
  
        62          51                      0
      S EEEEEEEEEEE FFFFFFF........FFFFFFFFFF
      
      S=Sign of fraction
      E=Exponent
      F=Fraction
      
  The double precision format takes 8 bytes when written to memory.

3.1.2.3 Extended precision

  The extended precision is indicated with the extension .X
  This is the format that is used in all computations, and
  consists of a 64-bit mantissa, a 15-bit exponent and 1 bit
  indicating the sign of the mantissa.  A hidden 1 is not assumed,
  so all digits of the mantissa are present.  Excess-16383
  is used for the exponent.  When data of this format is written
  to memory, it is "exploded" by 16 zero-bits between the mantissa
  and the exponent in order to make it longword aligned.
  The extended-precision format is defined as follows:
  
    79              63                             0
  S EEEEEEEEEEEEEEE MMMMMMMMMMMMMMM............MMMMM
  
  When written to memory, it looks like this:
    94            80          63                   0
  S EEEEEEEEEEEEEEE 000...000 MMMMMMMM...........MMM
  
  When written to memory, this format takes 12 bytes when written
  to memory

3.1.2.4  Packed-decimal string

  To simplify input/output of floating point numbers, a special
  96-bit packed-decimal format.
  This format consists of 17 BCD digits mantissa, some padding
  bits, 4 BCD digits exponent, 2 control bits, 1 bit indicating
  the sign of the exponent, and 1 indicating the sign of the
  mantissa.
  Bits 68-79 are stored as zero bits unless an overflow occurs
  during the conversion.
  Positive and negative infinity is represented by numbers that are
  outside the range of the floating point representation used.
  If the result of an operation has no mathematical meaning, a NAN
  is produced.  In the case of a NAN or infinity, bits 92 and 93
  are both 1.

3.2  Floating point Constant ROM

  The FPU have an on-chip ROM where frequently used mathematical
  instructions are stored.  How to retrieve these constants will be
  discussed below.  Each constant has its own address in the ROM:
  
  Offset     Constant
  =============================
  $00        Pi
  $0b        Log10(2)
  $0c        e
  $0d        Log2(e)
  $0e        Log10(e)
  $0f        0.0
  $30        ln(2)
  $31        ln(10)
  $32        10^0
  $33        10^1
  $34        10^2
  $35        10^4
  .
  .
  .
  $3e        10^2048
  $3f        10^4096

3.3  Floating Point Instructions

  The FPU provides an extension to the normal 68000 instruction set.
  The floating point instructions can be divided into 5 groups:
  
     1...Data transfer instructions
     2...Dyadic instructions (two operands)
     3...Monadic instructions (one operand)
     4...Program control instructions
     5...System control instructions
     
  The syntax and addressing modes for these instructions are the same
  as those of the ordinary 68000 instructions.

3.3.1  Data Transfer Instructions

  Instruction Syntax     Op. Sizes      Operation
  ==================================================================
  FMOVE  FPm,FPn      | X             | The FMOVE instruction
  FMOVE  <ea>,FPn     | B/W/L/S/D/X/P | copies data from the
  FMOVE  FPm,<ea>     | B/W/L/S/D/X   | source operand to the
                      |               | destination operand
  ==================================================================
  FMOVE  FPm,<ea>(#k) | P             | When writing a .P real, an
  FMOVE  FPm,<ea>(Dn) | P             | optional rounding precision
                      |               | may be specified as a constant
                      |               | or in a data register
                      |               | See below for details
  ==================================================================
  FMOVE  <ea>,FPcr    | L             | These two FMOVE's copies
  FMOVE  FPcr,<ea>    | L             | data to/from control registers
  ==================================================================
  FMOVECR #ccc,FPn    | X             | This instruction retrieves a
                      |               | constant from the ROM, where
                      |               | ccc is the offset to be read
  ==================================================================
  FMOVEM <ea>,<list>  | L/X           | Moves multiple FP registers
  FMOVEM <ea>,Dn      | X             | The register list may be
  FMOVEM <list>,<ea>  | L/X           | specified as in 68000 assembler,
  FMOVEM Dn,<ea>      | X             | or be contained as a bitmask
                      |               | in a data register
  ==================================================================
  
  When writing floating point numbers to the memory using the .P
  format, an optional precision may be specified as a constant or
  in a data register.
  
  Meaning of the precision:
  
  -64<=k<=0  Rounded to |k| decimal places
  0<k<=17    Mantissa is rounded to k places
  
  Register bit mask of the MOVEM instruction:
  
  Addressing mode    Bit 7   Bit 6 -------- Bit 1   Bit 0
  =========================================================
  -(An)           |   FP7  |  FP6  |------|  FP1  |  FP0  |
  All other modes |   FP0  |  FP1  |------|  FP6  |  FP7  |
  =========================================================

3.3.2  Dyadic Operations

  Dyadic operations are operations computing with two operands.
  The first operand may be addressed with any addressing mode,
  while the second operand (destination) must be an FPU register.
  
  Instruction  Function
  ===================================================
  FADD       | Add two FP numbers
  FCMP       | Compare two FP numbers
  FDIV       | FP Division
  FMOD       | FP Modulo
  FMUL       | Multiply two FP numbers
  FREM       | Get IEEE remainder
  FSCALE     | Scale exponent
  FSGLDIV    | Single-precision Division
  FSGLMUL    | Single-precision Multiplication
  FSUB       | FP Subtraction
  ===================================================
  
  FSCALE adds the first operand to the exponent of the second
  operand.
  FREM returns the remainder of a division as specified by the IEEE
  definition.

3.3.3  Monadic Operations

  Monadic operations are operations computing with only one operand.
  The operand may be addressed with any addressing mode.
  The syntax of monadic operations are:
  
    Instruction.Size  <ea>,FPn
  
  Instruction  Function
  ====================================================
  FABS       | Absolute value
  FACOS      | FP Arc Cosine
  FASIN      | FP Arc Sine
  FATAN      | FP Arc Tangent
  FATANH     | FP Hyperbolic Arc Tangent
  FCOS       | FP Cosine
  FCOSH      | FP Hyperbolic Cosine
  FETOX      | FP e^x
  FETOXM1    | FP e^(x-1)
  FGETEXP    | Get exponent
  FGETMAN    | Get mantissa
  FINT       | FP Integer
  FINTRZ     | Get integer and round down
  FLOGN      | FP Ln(n)
  FLOGNP1    | FP Ln(n+1)
  FLOG10     | FP Log10(n)
  FLOG2      | FP Log2(n)
  FNEG       | Negate a floating point number
  FSIN       | FP Sine
  FSINH      | FP Hyperbolic Sine
  FSQRT      | FP Square Root
  FTAN       | FP Tangent
  FTANH      | FP Hyperbolic Tangent
  FTENTOX    | FP 10^x
  FTWOTOX    | FP 2^x
  ====================================================

  There is one more monadic operation that uses a double
  destination operand, the FSINCOS instruction:

  FSINCOS <ea>,FPc:FPs        Calculates sine and cosine
  FSINCOS FPm,FPc:FPs         of the same argument

  All trigonometric operations operate on values in
  radians.

3.3.4 Program Control Instructions

3.3.4.1  Instructions
  This group of instructions allows control of program flow based
  on condition codes generated by the FPU.  These instructions are
  parallells to the 68000 instructions with the same names.

  Instruction      Formats  Operation
  =====================================================================
  FBcc <Label>    | W/L   | Branch on FPU conditions
  FDBcc Dn,<Label>| W     | Test FPU conditions, decrement and branch
  FNOP            |       | No Operation   (Like NOP)
  FScc <ea>       | B     | Set on FPU conditions
  FTST <ea>       | All   | Test FP number at <ea>
  FTST FPn        | X     | Test FP number in FPn
  =====================================================================

3.3.4.2 Condition codes

  The FPU condition codes that may be acted upon are divided into two
  groups, with and without NAN exception.

3.3.4.2.1  Condition codes with NAN

  Symbol  Meaning
  ===========================================
  GE    | Greater or equal
  GL    | Greater or less
  GLE   | Greater, less or equal
  LE    | Less or equal
  LT    | Less
  NGE   | Not (greater or equal)
  NGL   | Not (greater or less)
  NGLE  | Not (greater, less or equal)
  NGT   | Not greater
  NLE   | Not (less or equal)
  NLT   | Not less
  SEQ   | Signalling equal
  SNE   | Signalling unequal
  SF    | Signalling Always FALSE
  ST    | Signalling Always TRUE
  ===========================================

3.3.4.2.2  Condition codes without NAN

  Symbol  Meaning
  ===========================================
  OGE   | Ordered and greater or equal
  OGL   | Ordered and greater or less
  OR    | Ordered
  OGT   | Ordered and greater
  OLE   | Ordered and less or equal
  OLT   | Ordered less
  UGE   | Unordered or greater or equal
  UEQ   | Unordered or equal
  UN    | Unordered
  UGT   | Unordered or greater
  ULE   | Unordered or less or equal
  ULT   | Unordered or less
  EQ    | Equal
  NE    | Unequal
  F     | Always FALSE
  T     | Always TRUE

3.3.4.2.3  Notes

  You might wonder why there are different symbols for (unequal) and
  (greater or less).
  Floating point numbers may represent an infinity, something that is
  impossible in the 68000 CPU.  In addition, they may represent illegal
  values (NAN).
  For detailed information on how these condition code symbols relate to the
  condition code flags, consult programming references for the 68881 FPU.

3.3.5  System Control Instructions

  This group consists of 3 instructions, FSAVE, FRESTORE and FTRAPcc.
  FSAVE and FRESTORE are priviliged instructions and are used to save
  and restore the FPU state frame to memory.

  FSAVE <ea>     Copies the internal registers to the specified state frame
  FRESTORE <ea>  Loads the internal registers with the specified state frame.

  The TRAPcc instruction can generate an exception dependant on the condition
  codes.

  FTRAPcc                        If the specified condition is true, TRAP.
  FTRAPcc #<data>.(W/L)


--- IV --------------------------- THE 68040 FPU ----------------- IV ---


4.1  Differences

  The FPU that is built-in in the 040, and indeed in the yet to come 060
  are highly optimized.  It omits some instructions that are found on
  the 68881/2, but the ones that are unimplemented, are usually emulated
  in software.  By avoiding the emulated instructions, a program can get
  a multiple speed increase when run on the 040.
  The 040 also omits the Packed Decimal format (.P)  When it is attempted
  written, the 040 will respond with an illegal format exception.

4.2  Instruction set of the FPU-40  (Or whatever it is called)

4.2.1  68881/2 instructions that are unimplemented

  Type        Instructions
  =================================================================
  Monadic    | FACOS,FASIN,FATAN,FATANH,FCOS,FCOSH,FETOX,FETOXM1,
             | FGETEXP,FGETMAN,FINT,FINTRZ,FLOG10,FLOG2,FLOGN,
             | FLOGNP1,FSIN,FSINCOS,FSINH,FTAN,FTANH,FTENTOX,
             | FTWOTOX
  Dyadic     | FMOD,FREM,FSCAL,FSGLDIV,FSGLMUL
  Transfer   | FMOVECR
  =================================================================

4.2.2  68881/2 instructions that WORK on an 040

  FABS     ADD       FBcc      FCMP      FDBcc     FDIV      FMOVE
  FMOVEM   FMUL      FNEG      FNOP      FRESTORE  FSAVE     FScc
  FSQRT    FSUB      FTRAPcc   FTST


--- V ----------------------------- SOURCES ----------------------- V ---

5.1  Sourcecodes

  There are no sourcecodes in this text, but in the same archive as you
  got this file there should be an assembler source for a julia fractal
  using the FPU.
  The program is a very simple one, and doesn't use the most advanced
  operations, but illustrates clearly how to program for the FPU.
  The program is written for Amiga computers with AGA chipset and at
  least OS 2.0, but it should be easy to degrade to earlier Amiga
  versions and to other platforms.


************************************************************************************************
*             This text was written by Erik H. Bakke 14/10-93   © 1993 Bakke SoftDev           *
*                                                                                              *
* This text is freely redistributable as long as all files are kept together and in unmodified *
* form.                                                                                        *
*             Permission is granted to include this text in the HowToCode archive              *
************************************************************************************************
*  Error corrections, comments and questions should be directed to the author:                 *
*                                                                                              *
*                               e-mail:   db36@hp825.bih.no                                    *
*                               phone:    +47-5630-5537   (13:00-21:00 GMT)                    *
*                               Post:     Erik H. Bakke                                        *
*                                         Bjørnen                                              *
*                                         N-5227 SØRE NESET                                    *
*                                         NORWAY                                               *
************************************************************************************************