linux/Documentation/arm/nwfpe/README.FPE
<<
>>
Prefs
   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