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. |