1303 lines
26 KiB
Plaintext
1303 lines
26 KiB
Plaintext
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 <20> 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<42>rnen *
|
||
|
||
* N-5227 S<>RE NESET *
|
||
|
||
* NORWAY *
|
||
|
||
************************************************************************************************
|
||
|
||
|