mirror of https://github.com/Qortal/Brooklyn
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
162 lines
6.1 KiB
162 lines
6.1 KiB
============= |
|
Current State |
|
============= |
|
|
|
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.
|
|
|