157 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			157 lines
		
	
	
		
			6.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| 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.
 |