157 строки
6.0 KiB
Plaintext
157 строки
6.0 KiB
Plaintext
The following describes the current state of the NetWinder's floating point
|
|
emulator.
|
|
|
|
In the following nomenclature is used to describe the floating point
|
|
instructions. It follows the conventions in the ARM manual.
|
|
|
|
<S|D|E> = <single|double|extended>, no default
|
|
{P|M|Z} = {round to +infinity,round to -infinity,round to zero},
|
|
default = round to nearest
|
|
|
|
Note: items enclosed in {} are optional.
|
|
|
|
Floating Point Coprocessor Data Transfer Instructions (CPDT)
|
|
------------------------------------------------------------
|
|
|
|
LDF/STF - load and store floating
|
|
|
|
<LDF|STF>{cond}<S|D|E> Fd, Rn
|
|
<LDF|STF>{cond}<S|D|E> Fd, [Rn, #<expression>]{!}
|
|
<LDF|STF>{cond}<S|D|E> Fd, [Rn], #<expression>
|
|
|
|
These instructions are fully implemented.
|
|
|
|
LFM/SFM - load and store multiple floating
|
|
|
|
Form 1 syntax:
|
|
<LFM|SFM>{cond}<S|D|E> Fd, <count>, [Rn]
|
|
<LFM|SFM>{cond}<S|D|E> Fd, <count>, [Rn, #<expression>]{!}
|
|
<LFM|SFM>{cond}<S|D|E> Fd, <count>, [Rn], #<expression>
|
|
|
|
Form 2 syntax:
|
|
<LFM|SFM>{cond}<FD,EA> Fd, <count>, [Rn]{!}
|
|
|
|
These instructions are fully implemented. They store/load three words
|
|
for each floating point register into the memory location given in the
|
|
instruction. The format in memory is unlikely to be compatible with
|
|
other implementations, in particular the actual hardware. Specific
|
|
mention of this is made in the ARM manuals.
|
|
|
|
Floating Point Coprocessor Register Transfer Instructions (CPRT)
|
|
----------------------------------------------------------------
|
|
|
|
Conversions, read/write status/control register instructions
|
|
|
|
FLT{cond}<S,D,E>{P,M,Z} Fn, Rd Convert integer to floating point
|
|
FIX{cond}{P,M,Z} Rd, Fn Convert floating point to integer
|
|
WFS{cond} Rd Write floating point status register
|
|
RFS{cond} Rd Read floating point status register
|
|
WFC{cond} Rd Write floating point control register
|
|
RFC{cond} Rd Read floating point control register
|
|
|
|
FLT/FIX are fully implemented.
|
|
|
|
RFS/WFS are fully implemented.
|
|
|
|
RFC/WFC are fully implemented. RFC/WFC are supervisor only instructions, and
|
|
presently check the CPU mode, and do an invalid instruction trap if not called
|
|
from supervisor mode.
|
|
|
|
Compare instructions
|
|
|
|
CMF{cond} Fn, Fm Compare floating
|
|
CMFE{cond} Fn, Fm Compare floating with exception
|
|
CNF{cond} Fn, Fm Compare negated floating
|
|
CNFE{cond} Fn, Fm Compare negated floating with exception
|
|
|
|
These are fully implemented.
|
|
|
|
Floating Point Coprocessor Data Instructions (CPDT)
|
|
---------------------------------------------------
|
|
|
|
Dyadic operations:
|
|
|
|
ADF{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - add
|
|
SUF{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - subtract
|
|
RSF{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - reverse subtract
|
|
MUF{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - multiply
|
|
DVF{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - divide
|
|
RDV{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - reverse divide
|
|
|
|
These are fully implemented.
|
|
|
|
FML{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - fast multiply
|
|
FDV{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - fast divide
|
|
FRD{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - fast reverse divide
|
|
|
|
These are fully implemented as well. They use the same algorithm as the
|
|
non-fast versions. Hence, in this implementation their performance is
|
|
equivalent to the MUF/DVF/RDV instructions. This is acceptable according
|
|
to the ARM manual. The manual notes these are defined only for single
|
|
operands, on the actual FPA11 hardware they do not work for double or
|
|
extended precision operands. The emulator currently does not check
|
|
the requested permissions conditions, and performs the requested operation.
|
|
|
|
RMF{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - IEEE remainder
|
|
|
|
This is fully implemented.
|
|
|
|
Monadic operations:
|
|
|
|
MVF{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - move
|
|
MNF{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - move negated
|
|
|
|
These are fully implemented.
|
|
|
|
ABS{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - absolute value
|
|
SQT{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - square root
|
|
RND{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - round
|
|
|
|
These are fully implemented.
|
|
|
|
URD{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - unnormalized round
|
|
NRM{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - normalize
|
|
|
|
These are implemented. URD is implemented using the same code as the RND
|
|
instruction. Since URD cannot return a unnormalized number, NRM becomes
|
|
a NOP.
|
|
|
|
Library calls:
|
|
|
|
POW{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - power
|
|
RPW{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - reverse power
|
|
POL{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - polar angle (arctan2)
|
|
|
|
LOG{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - logarithm to base 10
|
|
LGN{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - logarithm to base e
|
|
EXP{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - exponent
|
|
SIN{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - sine
|
|
COS{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - cosine
|
|
TAN{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - tangent
|
|
ASN{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - arcsine
|
|
ACS{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - arccosine
|
|
ATN{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - arctangent
|
|
|
|
These are not implemented. They are not currently issued by the compiler,
|
|
and are handled by routines in libc. These are not implemented by the FPA11
|
|
hardware, but are handled by the floating point support code. They should
|
|
be implemented in future versions.
|
|
|
|
Signalling:
|
|
|
|
Signals are implemented. However current ELF kernels produced by Rebel.com
|
|
have a bug in them that prevents the module from generating a SIGFPE. This
|
|
is caused by a failure to alias fp_current to the kernel variable
|
|
current_set[0] correctly.
|
|
|
|
The kernel provided with this distribution (vmlinux-nwfpe-0.93) contains
|
|
a fix for this problem and also incorporates the current version of the
|
|
emulator directly. It is possible to run with no floating point module
|
|
loaded with this kernel. It is provided as a demonstration of the
|
|
technology and for those who want to do floating point work that depends
|
|
on signals. It is not strictly necessary to use the module.
|
|
|
|
A module (either the one provided by Russell King, or the one in this
|
|
distribution) can be loaded to replace the functionality of the emulator
|
|
built into the kernel.
|