1The following describes the current state of the NetWinder's floating point
2emulator.
3
4In the following nomenclature is used to describe the floating point
5instructions.  It follows the conventions in the ARM manual.
6
7<S|D|E> = <single|double|extended>, no default
8{P|M|Z} = {round to +infinity,round to -infinity,round to zero},
9          default = round to nearest
10
11Note: items enclosed in {} are optional.
12
13Floating Point Coprocessor Data Transfer Instructions (CPDT)
14------------------------------------------------------------
15
16LDF/STF - load and store floating
17
18<LDF|STF>{cond}<S|D|E> Fd, Rn
19<LDF|STF>{cond}<S|D|E> Fd, [Rn, #<expression>]{!}
20<LDF|STF>{cond}<S|D|E> Fd, [Rn], #<expression>
21
22These instructions are fully implemented.
23
24LFM/SFM - load and store multiple floating
25
26Form 1 syntax:
27<LFM|SFM>{cond}<S|D|E> Fd, <count>, [Rn]
28<LFM|SFM>{cond}<S|D|E> Fd, <count>, [Rn, #<expression>]{!}
29<LFM|SFM>{cond}<S|D|E> Fd, <count>, [Rn], #<expression>
30
31Form 2 syntax:
32<LFM|SFM>{cond}<FD,EA> Fd, <count>, [Rn]{!}
33
34These instructions are fully implemented.  They store/load three words
35for each floating point register into the memory location given in the 
36instruction.  The format in memory is unlikely to be compatible with
37other implementations, in particular the actual hardware.  Specific
38mention of this is made in the ARM manuals.  
39
40Floating Point Coprocessor Register Transfer Instructions (CPRT)
41----------------------------------------------------------------
42
43Conversions, read/write status/control register instructions
44
45FLT{cond}<S,D,E>{P,M,Z} Fn, Rd          Convert integer to floating point
46FIX{cond}{P,M,Z} Rd, Fn                 Convert floating point to integer
47WFS{cond} Rd                            Write floating point status register
48RFS{cond} Rd                            Read floating point status register
49WFC{cond} Rd                            Write floating point control register
50RFC{cond} Rd                            Read floating point control register
51
52FLT/FIX are fully implemented.
53
54RFS/WFS are fully implemented.
55
56RFC/WFC are fully implemented.  RFC/WFC are supervisor only instructions, and
57presently check the CPU mode, and do an invalid instruction trap if not called
58from supervisor mode.
59
60Compare instructions
61
62CMF{cond} Fn, Fm        Compare floating
63CMFE{cond} Fn, Fm       Compare floating with exception
64CNF{cond} Fn, Fm        Compare negated floating
65CNFE{cond} Fn, Fm       Compare negated floating with exception
66
67These are fully implemented.
68
69Floating Point Coprocessor Data Instructions (CPDT)
70---------------------------------------------------
71
72Dyadic operations:
73
74ADF{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - add
75SUF{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - subtract
76RSF{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - reverse subtract
77MUF{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - multiply
78DVF{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - divide
79RDV{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - reverse divide
80
81These are fully implemented.
82
83FML{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - fast multiply
84FDV{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - fast divide
85FRD{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - fast reverse divide
86
87These are fully implemented as well.  They use the same algorithm as the
88non-fast versions.  Hence, in this implementation their performance is
89equivalent to the MUF/DVF/RDV instructions.  This is acceptable according
90to the ARM manual.  The manual notes these are defined only for single
91operands, on the actual FPA11 hardware they do not work for double or
92extended precision operands.  The emulator currently does not check
93the requested permissions conditions, and performs the requested operation.
94
95RMF{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - IEEE remainder
96
97This is fully implemented.
98
99Monadic operations:
100
101MVF{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - move
102MNF{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - move negated
103
104These are fully implemented.
105
106ABS{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - absolute value
107SQT{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - square root
108RND{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - round
109
110These are fully implemented.
111
112URD{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - unnormalized round
113NRM{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - normalize
114
115These are implemented.  URD is implemented using the same code as the RND
116instruction.  Since URD cannot return a unnormalized number, NRM becomes
117a NOP.
118
119Library calls:
120
121POW{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - power
122RPW{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - reverse power
123POL{cond}<S|D|E>{P,M,Z} Fd, Fn, <Fm,#value> - polar angle (arctan2)
124
125LOG{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - logarithm to base 10
126LGN{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - logarithm to base e 
127EXP{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - exponent
128SIN{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - sine
129COS{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - cosine
130TAN{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - tangent
131ASN{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - arcsine
132ACS{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - arccosine
133ATN{cond}<S|D|E>{P,M,Z} Fd, <Fm,#value> - arctangent
134
135These are not implemented.  They are not currently issued by the compiler,
136and are handled by routines in libc.  These are not implemented by the FPA11
137hardware, but are handled by the floating point support code.  They should 
138be implemented in future versions.
139
140Signalling:
141
142Signals are implemented.  However current ELF kernels produced by Rebel.com
143have a bug in them that prevents the module from generating a SIGFPE.  This
144is caused by a failure to alias fp_current to the kernel variable
145current_set[0] correctly.
146
147The kernel provided with this distribution (vmlinux-nwfpe-0.93) contains
148a fix for this problem and also incorporates the current version of the
149emulator directly.  It is possible to run with no floating point module
150loaded with this kernel.  It is provided as a demonstration of the 
151technology and for those who want to do floating point work that depends
152on signals.  It is not strictly necessary to use the module.
153
154A module (either the one provided by Russell King, or the one in this 
155distribution) can be loaded to replace the functionality of the emulator
156built into the kernel.
157