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